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

TypeScript版LangChain环境配置全攻略:从零搭建AI应用开发环境

大语言模型(LLM)作为当前AI应用开发的核心技术,通过API接口为开发者提供了强大的自然语言处理能力。其工作原理基于Transformer架构,通过预训练和微调实现对人类语言的深度理解与生成。在工程实践中,开发者需要将LLM与外部工具、数据源和业务逻辑有效集成,这正是LangChain框架的技术价值所在——它提供了标准化的组件和接口,简化了复杂AI应用的构建流程。应用场景涵盖智能客服、内容生成、数据分析助手等多个领域。本文聚焦于TypeScript/JavaScript生态下的LangChain开发,详细

weixin_29055699的博客 253

ARM 汇编指令 :(一) MOV

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

孔祥锐 6003

Android自动化新方案:ESP32-C3蓝牙HID模拟触控与手势操作实战(附源码)

本文详细介绍了使用ESP32-C3通过蓝牙HID协议实现Android设备自动化操作的完整方案。该硬件方案成本低廉且能完美规避系统风控,可模拟鼠标移动、点击及复杂手势操作,延迟低于50毫秒,适用于游戏连招和应用测试等场景。文章包含完整的源码实现和性能优化技巧。

kotlin6android的博客 377

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

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

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

Chrome红页误报?手把手教你通过Search Console快速解除安全警告

本文详细解析了Chrome红页误报的常见原因及解决方案,重点介绍如何通过Google Search Console快速解除安全警告。内容涵盖误报诊断、技术修复、申诉技巧及长效预防措施,帮助网站管理员有效应对Google Safe Browsing的误判问题,确保网站安全状态快速恢复。

a1b2c的博客 996

PCB板设置20H 原则理解

20H原则是PCB设计中抑制EMI辐射的关键方法,要求电源层比相邻地层内缩20倍介质厚度(20H)。在四层板中实现20H原则需采用S-G-P-S层叠结构,确保GND与PWR紧邻。具体步骤包括:确定GND-PWR间介质厚度H,计算20H值(通常80-120mil),并在设计软件中将电源层四周内缩20H,同时保持地层完整不内缩。注意避免常见误区,如混淆介质厚度、地层内缩等。该原则能有效限制边缘场辐射,降低EMI干扰,是四层板EMC设计的重要规范。

qq_37999850的博客 694

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

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

2501_93895146的博客 707

华为面试手撕真题【最长不重复子串】

给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

MISAYAONE的博客 1万+

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

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

weixin_30500105的博客 467

第四章节 Qt字符串QString详解

QString 的使用方式和 C++标准库的 std::string 字符串的非常相似。

m0_65635427的博客 890

第17章 后端开发最佳实践 —— OpenSpec + 智能体的工程化实战

后端开发有大量重复性的"样板代码"工作。我们可以创建自定义 Skill,让 AI 自动生成标准的三层架构代码。创建 Skill:后端 CRUD 生成器以 CodeBuddy 为例,在创建:其他工具用户请参考各自文档,了解如何创建自定义 Skills 或类似机制。skill.md## 描述根据实体定义自动生成标准的三层架构代码(Controller-Service-Repository)## 适用场景- 快速创建实体的 CRUD 接口- 保持代码结构一致性- 减少重复性编码工作## 使用方法。

快乐的修补匠的专栏 322

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

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

weixin_29195615的博客 282

Open3D 球旋转算法(BPA)三维建模【2026最新版】

球旋转算法,博客长期更新,本文最新更新时间为:2026年4月11日。

点云侠的博客 37万+

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

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

xrzh8989的专栏 7406

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Camera2Demo

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

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值