汇编总结:mov指令

ARM Assembly Language Programming (part 4) 4. The BBC BASIC Assembler There are two main ways of writing ARM assembly language programs. One is to use a dedicated assembler. Such a program takes a text file containing ARM assembly language in 阅读详情

mov指令的作用:

    mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值。

mov指令种类:

1.普通的mov指令
2.做符号扩展的movs
3.做零扩展的movz

1.普通mov的种类有:

movb #完成1个字节的复制
movw #完成2个字节的复制
movl #完成4个字节的复制
movq #完成8个字节的复制

2.movs的种类以及为什么要符号扩展指令?

1.为什么要用符号扩展指令

  如果要完成下面的c语言代码

char c = -1;
int i = c;

  如果翻译成下面的汇编代码,会发现一个问题

      用movb把%al寄存器里的-1,复制到%ebx寄存器,结果变成了255。等等,为什么会这样?

.section .text
.global _start

fmt:
    .ascii "%d\n\0"

_start:
    movb $-1, %al      #把-1赋值到寄存器al
    xorl %ebx, %ebx    #把寄存器%ebx 赋值为0
    movb %al, %bl      #把al的值赋值到%ebx寄存器的低8位 (引用%ebx寄存器低8位的方法就是使用%bl寄存器)

    xorq %rax, %rax
    movl %ebx, %esi
    movq $fmt, %rdi
    call printf        #调用printf 打印ebx寄存器的内容,会发现输出变成了255

    movl $0, %edi      #调用exit退出进程
    call exit

接上段,学过原码,补码,反码的同学知道,在二进制的角度看待一个数。其在内存中表示正数,表示负数,依赖机器是怎么解释最高bit位的1。c语言里面signed类型,如果最高bit为1,认为它是一个负数。unsigned类型,始终认为是正数。


回到刚刚的-1变成255的问题。

作为用户,只想在由char 类型转为int,输出还是-1,就这么简单。

(事实上c语言已经做了自动转换,这里的char,int只是指代上面的汇编代码里的类型)


char类型的-1在内存中的表示:11111111 

(由于最高bit位为1,且类型为signed,所以解释成-1)


使用movb指令把char类型的-1复制到int类型里:

char类型的-1复制到int类型在内存中的表示:00000000000000000000000011111111

(由于最高bit位为0,且类型为signed,所以解释成255)


int类型的-1在内存中的表示:11111111111111111111111111111111

两边一对比就知道,char复制到int需要把多出来的字节作符号位扩展。

2.movs的种类

movsbw #作符号扩展的1字节复制到2字节
movsbl #作符号扩展的1字节复制到4字节
movsbq #作符号扩展的1字节复制到8字节
movswl #作符号扩展的2字节复制到4字节
movswq #作符号扩展的2字节复制到8字节
movslq #作符号扩展的4字节复制到8字节


3.movz的种类及其作用

1.如果要完成下面的c语言代码

unsigned char c = -1;
unsigned i = c;
printf("%x:%d\n", i, i); //输出 0xff, 255

这时候就是movz指令大显身手的时候。

movb $-1, %al      #%al  = 0xff
movzbl %al, %ebx   #%ebx = 0x000000ff

2.movz指令的种类

movzbw #作0扩展的1字节复制到2字节
movzbl #作0扩展的1字节复制到4字节
movzbq #作0扩展的1字节复制到8字节
movzwl #作0扩展的2字节复制到4字节
movzwq #作0扩展的2字节复制到8字节
movzlq #作0扩展的4字节复制到8字节

练习题

  1. 在c语言里char c 赋值给short s 该用上面的什么指令?

  2. 在c语言里char c 赋值给unsigned short s 该用上面的什么指令?

  3. 在c语言里unsigned char c 赋值给short s 该用上面的什么指令?

  4. 在c语言里short s 赋值给char c该用上面的什么指令?

  5. 在c语言里unsigned short s 赋值给char c该用上面的什么指令?

  6. 在c语言里unsigned short us 赋值给short s该用上面的什么指令?

    友情指示上面的问题想知道结果可以先写好c语言代码,再gcc -S 生成汇编文件查看

自:https://my.oschina.net/guonaihong/blog/506102

汇编基础-----mov与常见寻址方式 内存和寄存器之间的数据传递: mov 指令也允许在内存和寄存器之间传递数据。这对于从内存中加载数据到寄存器或将寄存器中的数据存储回内存非常有用。在汇编语言中,mov(move)是一条基本的指令,用于将数据从一个位置移动到另一个位置。: 最常见的用途是将一个数值或数据对象(如寄存器、内存中的值)赋给另一个位置,可以是寄存器、内存或立即数。: mov 指令用于将数据从一个位置(寄存器、内存或立即数)复制到另一个位置(寄存器、内存)。使用寄存器中的值作为内存地址,间接访问内存中的数据。直接访问内存地址中的数据。 阅读详情

相关推荐

ARM 汇编指令:MOV

本文介绍了ARM架构中的MOV指令,它是数据传送的基础指令,功能类似于高级语言的赋值操作。MOV支持将寄存器值、立即数或移位后的值传送到目标寄存器,并具有条件执行和更新标志位的功能。文章对比了MOV与LDR指令的区别,提供了具体实例,并说明了32位与64位ARM架构中MOV指令的差异。MOV指令凭借其高效性和灵活性,成为ARM汇编编程的重要基础。

guigenyi的专栏 1119

汇编:mov指令

mov是汇编中的传送指令。 mov 目的操作数,源操作数 目的操作数必需是一个容器,如内存单元、寄存器 源操作数可以是一个立即数,也可以是一个容器 容器有内存单元、通用寄存器(AX、BX、CX、DX等)、段寄存器(CS、DS) 立即数就是指令中指定的长度为16位的2的补码,如0xb800 立即数只能用作源操作数,也就是它只能传给容器,如内存单元目的操作数,通用寄存器。但是,不能传给段寄存器,原因也很简单,段寄存可是记录记录代码段或数据段的起始地址,岂能随便修改。立即数不能作为目的操作数。 段寄存器虽然不

weixin_40763897的博客 2万+

汇编指令lea与mov的本质区别:从地址计算到性能优化

在计算机体系结构与汇编语言中,数据搬运和地址计算是基础且核心的操作。mov指令作为数据搬运工,负责在寄存器和内存之间传输数据,其执行过程涉及内存访问,可能引入缓存延迟。而lea指令的核心原理是地址计算,它利用CPU的地址生成单元执行基址加变址乘比例再加偏移的算术运算,将计算结果直接存入寄存器,且不访问内存。这一特性赋予了lea独特的技术价值:它不仅能高效获取指针地址,还能在不影响状态标志位的前提下,替代多条算术指令,实现强度削减优化。在编译器优化和性能敏感场景中,lea常被用于数组遍历、结构体偏移计算和循环

weixin_26938645的博客 328

X86 MOVSB MOVSW MOVSD MOVSQ 指令详解

SDM指令功能描述(MOVS/MOVSB/MOVSW/MOVSD/MOVSQ) MOVS/MOVSB/MOVSW/MOVSD/MOVSQ)总体描述: 从DS:SI(16-bit)/DS:ESI(32-bit)/RSI(64-bit)指示的地址中复制一个byte/word/dword/qword到ES:DI(16-bit)/ES:EDI(32-bit)/RDI(64-bit)指示的地址中。 (R

ross1206的博客 1万+

汇编指令机器码速查手册:从MOV到JMP,一网打尽(附PDF下载)

本文提供了一份全面的汇编指令机器码速查手册,涵盖从MOV到JMP的核心指令及其机器码编码原理。通过功能分类、编码示例和实战应用,帮助逆向工程师和系统开发者快速掌握底层编程技术,提升二进制文件调试和性能优化能力。

weixin_29196315的博客 120

汇编语言核心指令MOV与ADD深度解析:从数据搬运到算术运算的底层原理

在计算机体系结构与底层编程中,数据移动和算术运算是处理器执行指令的基础。MOV指令作为数据搬运的核心,负责在寄存器与内存间传递信息,其本质是复制而非移动,并遵循操作数大小匹配和单次内存访问原则。ADD指令则执行基本的加法运算,其关键价值在于会依据结果设置CPU的状态标志位,如零标志、进位标志和溢出标志,这些标志是后续条件跳转和流程控制的基础。理解数据寻址方式,如直接寻址、寄存器间接寻址和基址变址寻址,是精准操作内存数据的关键。掌握这些基础指令和原理,对于进行底层性能优化、嵌入式系统开发以及理解计算机如何工作

weixin_34005090的博客 325

mov 指令用c语言写,汇编总结:mov指令

mov指令的作用:mov指令可能是汇编里用的最多的指令了,完成c语言里的赋值。mov指令种类:1.普通的mov指令2.做符号扩展的movs3.做零扩展的movz1.普通mov的种类有:movb#完成1个字节的复制movw#完成2个字节的复制movl#完成4个字节的复制movq#完成8个字节的复制2.movs的种类以及为什么要符号扩展指令?1.为什么要用符号扩展指令如果要完成下面的c语言代码...

weixin_39775106的博客 4184

ARM汇编核心三指令:LDR、MOV、STR详解与避坑指南

在嵌入式开发中,理解数据如何在处理器寄存器与内存之间流转是底层编程的基础。ARM架构采用load-store设计,数据运算必须在寄存器中进行,而内存访问则通过专门的加载存储指令完成。LDR负责从内存加载数据到寄存器,STR将寄存器数据存储到内存,MOV则处理寄存器间传值或常量加载。掌握这三条指令的寻址方式、数据宽度选择和对齐要求,能帮助开发者正确操作外设寄存器、优化栈帧布局,并避免常见的内存覆盖和地址漂移错误。本文从工程实践角度,深入解析LDR、MOV、STR的编码细节、使用场景与调试经验,助力嵌入式工程师

weixin_29159441的博客 219

汇编语言:mov指令,寄存器,寻址

冯诺依曼计算机,将计算机分为5大部件:运算器,控制器,存储器,输入设备,输出设备。运算器和控制器共同执行指令。指令和数据一样,保存为二进制数据。运算器和控制器共同组成CPU,CPU执行机器指令,也就是二进制数。机器指令难于阅读,编写。所以人们用英语单词来表示机器语言,这种方式被称为汇编语言。 用汇编语言编程就是在和立即数,寄存器,内存在打交道。 寄存器有8个,EAX,EBX,ECX,EDX,EDI,ESI,EBP,ESP。 内存有不同的寻址方式,下面会详细说明。 movb 复制字节数据。 ..

pk_20140716的专栏 2719

Run-Time Check Failure #2

我自己找的问题是sprintf函数,类型和长度都不能错,否则就会报错,报错还不是立马报错,如果类型和长度弄错,内存会异常,后面的代码执行才会内存泄露。char str3[80]; sprintf(str3, "%d%s got_picture:%d decode_error_num %d", cam_no, " Decode Error", got_picture, decode_error...

jacke121的专栏 9716

基于CANoe的车载以太网测试

以太网测试 CANoe

Yafet 4554

ARM 汇编指令 :(一) MOV

Operand2是操作数,即要移动到目标寄存器的值。它可以是另一个寄存器、立即数或寄存器的移位操作。mov word:传送字 :16位;把 16 位立即数放到寄存器的底16位,高16位清0。movs r0, #0 默认结果为零但不影响CPSR的Z位,加上s以后会影响CPSR标志位。中用于将数据从一个位置或寄存器复制到另一个位置或寄存器的指令。3.将一个寄存器里保存的值与一个立即数做逻辑或操作,然后将结果移动到目标寄存器里。mov long : 传送字长 : 32位;Rd是目标寄存器,用于存储要加载的数据。

孔祥锐 6003

【ComfyUI】Animate 保留原视频背景角色替换视频生成

本文介绍了智能创作与视频生成的工作流设计,强调其作为围绕业务目标、数据流转和模型能力的有机整体。工作流由数据输入、模型处理、结果合成和输出展示构成,通过节点化连接实现高效复用与扩展。文章重点解析了核心模型(如CLIP Vision、WanVideo等)的功能和协作方式,以及各类节点(输入、处理、控制、输出)的作用。最后展示了工作流在视频角色替换、虚拟试衣等场景的应用价值,并提供了相关开发资源链接。该设计通过模块化实现了灵活适配不同业务需求的能力。

Mr数据杨 1867

汇编搬家工小莫:MOV指令全解析

《数据搬运的艺术:汇编指令MOV全解析》摘要 本文以搬家工"小莫"为喻,生动解析汇编语言核心指令MOV的工作原理与应用场景。文章系统阐述了MOV的数据搬运机制,涵盖寄存器间、内存与寄存器、立即数等五种基础传送方式,详解七种寻址技巧。通过数组操作、结构体搬运等实例,展示MOV在底层编程中的关键作用,并揭示其硬件执行细节。 内容延伸至MOV的优化策略、安全风险与现代应用价值,包括多线程同步、编译器优化等高级话题。特别指出MOV在参数传递、上下文切换等系统级操作中的核心地位,以及其在缓冲区溢出

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 971

智能手表 BOM 表与版本管理记录

试产与量产阶段 智能手表 BOM 表与版本管理记录

hoony123的博客 1053

一次把 PRIV mode 讲透:从 ABAP 内存分配链路到定位与治理

ABAP系统进入PRIV模式的本质是Extended Memory耗尽时转向Heap内存的应急机制。该现象会导致工作进程被独占,系统吞吐量下降。触发条件包括系统EM资源池耗尽或单个用户超过配额阈值。关键参数em/address_space_MB和ztta/roll_extension需协同调整。典型症状包括SM50显示PRIV状态、响应延迟和内存dump。治理需双管齐下:系统侧合理配置内存参数,代码侧优化内存使用模式,如分页处理、减少大内表操作和下推聚合逻辑。PRIV模式应作为异常信号而非常态目标,健康系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 204

从汇编视角看C++内存操作:mov指令与指针运算

从汇编视角看,C++内存操作的核心是MOV指令与地址计算的结合。指针运算在编译后被翻译为具体的MOV序列,其中地址偏移基于数据类型大小。理解这一映射有助于编写高效、可靠的C++代码,尤其在性能敏感或底层开发场景。实践中,建议使用编译器输出(如汇编列表)来验证您的代码逻辑。如果您有特定C++代码片段需要分析,我可以提供更定制的汇编解释。

2501_93895146的博客 707

智能车浅谈——手把手让车跑起来(电磁篇)

手把手让你的电磁车上路。

qq_41954556的博客 7万+

汇编语言新手必看:LEA和MOV指令的5个实战区别(附代码示例)

本文详细解析了汇编语言中LEA和MOV指令的5个核心实战区别,包括地址计算与数据搬运的本质差异、数组操作中的应用、函数调用参数传递、寻址模式特殊行为以及性能优化技巧。通过具体代码示例展示两者在寄存器操作和内存访问中的不同表现,帮助开发者正确选择指令提升汇编编程效率。

weixin_30500105的博客 467

仿真学习系列(三十):Sigrity设计文件(Altium Designer和Allegro)导入

很多刚接触 Sigrity 的工程师都会产生疑问:Sigrity 功能这么多,是不是门槛很高?我能学得会吗? 其实,Sigrity 的核心并不在“操作难”,而是在“理解仿真背后的机理”。一旦掌握基本流程,你会发现它并没有想象中那么复杂,反而能大大提升你的高速设计能力。本节内容,就是从最简单的一步开始 —— 把你的设计文件正确导入 Sigrity。

案例文章,高速信号 524

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

汇编指令探秘:LEA与MOV在地址计算与数据传输中的实战对比

本文深入对比了汇编语言中LEA与MOV指令的核心差异与实战应用。LEA指令专注于地址计算与快速整数运算,而MOV指令则负责实际的数据传输。文章通过生动的比喻和代码示例,解析了二者在获取地址、指针运算、结构体访问及编译器优化中的不同角色,帮助开发者理解如何根据场景选择高效指令,提升底层编程与性能优化能力。

weixin_29195615的博客 282

基于YOLOv10的微小目标检测,多头检测器提升小目标检测精度

引入多头检测器助力YOLOv10,暴力提升小目标检测性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 2569

汇编指令: MOV、MOVSB、MOVSW、MOVSD、MOVSX、MOVZX

 汇编指令: MOV、MOVSB、MOVSW、MOVSD、MOVSX、MOVZX   ||字号 订阅  名称   功能  操作数 操作码 模数 寄存器1 寄存器2 或内存 位移量 立即数 符号 方向 芯片 型号 16位 32位 MOV 传送 累加08 $A0 无 无 无 无 无 无 无 8086 无 $

xrzh8989的专栏 7406

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 对lea与mov的理解
下一篇: Java静态绑定与动态绑定
vspiders
博客等级 码龄11年 68粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值