MOV指令、LDR指令、LDR伪指令之间的区别(ARM立即数的存取)
1、MOV指令
MOV指令可以把立即数或者寄存器内容(注意:这里绝对不可以是内存!!)传递给一个寄存器。
立即数相当于高级语言中的常量(常数),
立即数就是数字嘛,表示数值的数字,
存储器用的是地址,一般立即数前需要加#,
MOV对于立即数是有要求的,就是下面的“8位图”数据。
只能由一个8bit连续有效位通过偶数次移位得到的数。
它为什么会有这样的限制呢?
原因是,MOV本身就是一个32bit指令,除了指令码本身,他不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示
立即数,其中4bit表示移位的尾数(循环右移,且数值*2),8bit用来表示要移位的一个基数。
如果立即数超过这个范围,就没有办法用一条MOV指令给寄存器赋值
(这里就要用到LDR伪指令了,查看反汇编指令,你会看到LDR伪指令此变成了两条指令~~)。
2、LDR指令(有等号的ldr指令是伪汇编指令)
ldr指令既可以是大范围的地址读取伪指令,也可以内存访问指令。
当它的第二个参数前面有“=”时,表示伪指令,否则表示内存访问指令。
LDR指令:就是个单寄存器存储的ARM存储器访问指令。
(LDR补充了MOV指令不能访问内存的缺陷。)
ARM是RISC结构的,数据从内存到CPU之间的移动只能通过ldr/str指令(我说的是单个寄存器~~)。
想要把数据从内存中某处读取到寄存器中,只能用ldr。
3、LDR伪指令
1)LDR伪指令没有立即数范围的限制,既,可以直接赋值。因为这是一条伪指令。
如果立即数在MOV的要求内,系统会自动用一条汇编MOV指令来实现。如果不在MOV的范围内,就用其它的方式来实现,比如变成了两条指令,或者从PC偏移地址读取一个32位的数据给寄存器。
2)关于LDR伪指令,可以装载一个32bit立即数的说法并不正确,
因为在实际中并不是这一条语句装载了32bit立即数(跟上面的貌似一样,呵呵~~),比如:ldr r1,=0x70000000其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x70000000这个立即数,在反汇编中,如果仔细看会返现,如果这个立即数可以用mov指令的表达形式来表达,编译器就直接用mov了~~
4、ARM汇编中ldr伪指令和ldr指令
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中。而mov不能实现这个功能,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中。ldr伪指令:虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。
ldr伪指令可以在立即数前加上=,以表示把一个值(一般是一个地址)写到某寄存器中,比如:
ldr r0, =0x12345678 @立即数前面有等号,所以是LDR伪指令
这样,就把0x12345678这个值写到r0中了。所以,ldr伪指令和mov是比较相似的。
只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。
如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
比如:
ldr r1,=0x10
会变成
mov r1,#0x10
综述所述:ldr伪指令用于加载32位的立即数或一个地址值到指定寄存器。
在汇编编译源程序时,ldr伪指令被编译器替换成一条合适的指令。
若加载的常数未超出mov或mvn的范围,则使用mov或mvn指令代替该ldr伪指令,
否则汇编器将常量放入文字池,并使用一条程序相对偏移的ldr指令从文字池读出常量。
MOV指令、LDR指令、LDR伪指令之间的区别(ARM立即数的存取)相关推荐
- ARM中的ldr指令与adr、ldr伪指令之间的区别
ARM汇编语言中有ldr指令和ldr.adr伪指令,他们都可以将标号表达式作为操作数.区别如下: ldr指令和adr.ldr伪指令的区别:ldr指令属于load-store指令,用于读取标号地址中的值 ...
- mysql中最常用到的数据类型,约束条件,以及表,字段,行的crud操作指令,function和precedure之间的区别,索引,安全,事务...
数据库总结 传统记录数据的缺点:不易保存,备份困难,查找不便 数据库:存储数据的仓库,描述一个事务的基本信息 优点:1.持久化存储 2.读写速 ...
- 等号(=)伪指令、EQU伪指令、TEXTEQU伪指令之间的区别
这三种伪指令都是用来定义汇编语言中的符号常量,下面对它们各自的特点进行讲解 等号伪指令 等号伪指令用于定义整数或整数表达式的符号常量,语法为: name = expression 如果"ex ...
- arm指令中mov和ldr及ldr伪指令的区别
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就 ...
- 2020-12-4((ARM汇编)mov指令,LDR指令,LDR伪指令)
首先说明一下 ARM是RISC("reduced instruction set computer",即"精简指令集计算机")结构 x86是CISC(" ...
- LDR伪指令和LDR指令及MOV指令的区别
1.前言 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 2.LDR指令 就是将地址中的值存放到寄存器中 比如想把数据从内存中某处读取到寄存器中 ...
- ARM MOV和 LDR指令关系
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令. 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x123456 ...
- ARM汇编中ldr伪指令和ldr指令(转载)
转自:http://blog.csdn.net/ce123_zhouwei/article/details/7182756 ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成, ...
- armv8 汇编 绝对地址赋值_详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系...
@[TOC] 为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的.跳转执行:当指令执行到当前位置后跳转到其他位置执行.比如,在主函数中调用其 ...
最新文章
- 从IC设计来看Trace32的用途
- 双机之间的串行通信设计 c语言编程,双机串行通信设计精品.doc-资源下载人人文库网...
- 简化Java中的异常处理
- spin lock自旋锁
- 【转】left join 和 left outer join 的区别
- linux搭建yum源
- 每周荐书:分布式、深度学习算法、iOS(评论送书)
- c语言网吧添加卡,c语言网吧计费系统源代码.docx
- fgets和fgetl有什么区别
- ArcGIS学习总结(九)——将.kml转换为.shp
- android studio for android learning (八)开机启动界面splashActivity
- 【android自定义控件】自定义Toast,AlterDialog,Notification 四
- 半车模型悬架系统的simulink仿真
- html两列合并一列,如何将excel中两列数据合并到一列呢
- python输入按逗号分开_python print 按逗号或空格分隔的方法
- 汽车电子-AUTOSAR基础简介
- 大数据之实战足球盘口、凯利、必发和预测结果分析
- 南华大学计算机学院软件工程双一流,南华大学计算机学院软件工程与网络工程两个专业喜获湖南省高校专业综合评价A级...
- 环保性能高的家装乳胶漆怎么选择
- 4.124.13天梯赛补题