汇编总结: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

WorkBuddy任务对话上下文管理:Token、compact与上下文窗口实战指南

在大语言模型应用中,Token作为文本处理的最小单位,直接决定上下文窗口的消耗速度,而上下文窗口则限定了单次对话可承载的信息总量。当对话超出窗口限制时,compact压缩机制会触发有损摘要,导致关键约束丢失或工具调用结果被稀释。合理管理上下文不仅能提升多步骤任务的稳定性,还能显著降低Token成本与响应延迟。在文档处理、代码开发、多步自动化等场景中,通过主动压缩、状态外置、分段喂入等策略,可有效避免任务后期遗忘、版本混乱等问题。本文围绕WorkBuddy的上下文管理机制,从Token与compact的底层原

weixin_29055699的博客 391

ARM 汇编指令 :(一) MOV

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

孔祥锐 6003

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

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

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

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

用Python玩转ROS机械臂:YOLO目标检测+MoveIt!自动抓取仿真教程

本文详细介绍了如何利用Python集成YOLO目标检测与ROS的MoveIt!运动规划库,实现机械臂的智能抓取仿真。通过Gazebo仿真环境,从视觉感知、坐标转换到运动规划与执行,构建了一套完整的自动化抓取系统,为机器人视觉抓取应用提供了可复现的实践方案。

ppp33的博客 552

An工具介绍之摄像头

An工具介绍之摄像头

人生得意须尽欢 6188

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

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

2501_93895146的博客 707

uCOS中的消息邮箱(:task与task之间传递一个数据(数据缓冲区))

程序需求,需要完成task与task之间  字符数组的数据传输 比如:在ucos中,串口2接收的字符数组是不定时的&不定长的;只有当接收到数据的时候_才将数据赋值给新数组 具体的程序示意如下: 图1:消息邮箱测试中的     向消息邮箱发送消息(OSMboxPost(Str_Box,(void*)rec);//发送消息--(向 消息邮箱_msg_key发送消息) ),实际项目需求的

faguoduifangui的博客 4540

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

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

weixin_30500105的博客 467

飞腾X100芯片GPU状态查询

本文档对在linux系统下查看X100芯片GPU状态信息进行说明,可以帮助大家了解芯片的实时工作状态。

乌拉大喵喵 2815

一文吃透 SAP IDoc 状态码:从 TEDS1 到 WE02 排障,再到 ABAP 自动化监控

在 SAP 集成场景里,IDoc 往往是最常见、也最容易被低估的一条生命线:采购订单、发票、主数据、库存移动……只要系统之间要稳定地交换结构化业务数据,IDoc 就经常登场。真正让人头疼的,并不是 IDoc 本身,而是它在链路里到底走到了哪一步、卡在了哪里、该找谁背锅。这篇文章把常用的 IDoc 状态码按出站、入站拆开讲清楚,并且把每个状态对应的真实世界故障现象、排查入口、以及可以落地的 ABAP 监控代码串起来,让你看到状态码就能想到动作。

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

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

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

weixin_29195615的博客 282

基于互联网的智能旧衣回收箱设计与实现

本文介绍了基于嵌入式系统的智能旧衣回收箱的设计与实现,涵盖了硬件设计、软件开发、图像识别、物联网连接等方面的内容。通过利用最新的技术,如图像识别、物联网和云计算,实现了智能、便捷的旧衣物回收系统。未来,随着技术的不断进步,智能回收系统将会在环保领域发挥更大的作用。

2201_76125393的博客 908

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

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

xrzh8989的专栏 7406

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值