2022年ARM几条汇编指令的比较[定 .pdf
《2022年ARM几条汇编指令的比较[定 .pdf》由会员分享,可在线阅读,更多相关《2022年ARM几条汇编指令的比较[定 .pdf(10页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、ARM 几条汇编指令的比较2011-09-07 23:57 从网上找到一些关于ARM 伪指令的资料 ,现整理如下 : 1. LDR LDR R0, =0X3FF5000 ; 伪指令 , 把 0X3FF5000这个地址送给R0 LDR R0, 0XFF ; 把立即数 0 xff送给 R0 LDR R0, =&FF ; &相当于 0X BIC R0, R0, #%1011 ;.#表示立即数 ,%表示二进制LDR R1, =0 x3ff5000 ;伪指令 R1=0X3FF5000 LDR R1, 0 x3ff5000 ;存储器访问指令 R1= 0 x3ff5000 2. adr与 ldr比较adr
2、r0, InitSystem ; ldr r1, =InitSystem ; 伪指令 adr r0,InitSystem 编译时汇编成:sub r0,PC,#offset to InitSystem LDR r1,=InitSystem ,这种方式读取的地址值在连接时已经被固定了,这种代码不是位置无关的。遇到LDR伪指令时,汇编编译器将该地址值保存到一个缓冲区(l iteral pool)中,然后将该LDR 伪指令处理成一条基于PC到该数据缓冲区单元的LD R 指令,从而将该地址值读取到寄存器总,这时,要求该数据缓冲区到PC的距离小于 4KB 。如果该目标地址值为一个外部地址值或者不在本数据段
3、内,则汇编译器在目标文件中插入一个地址重定位伪操作,当连接器进行连接时生成该地址值。LDR r1,=InitSystem 汇编成: LDR R1 ,PC,#offset to Litpool1 - adr 用来加载地址,例如adr r0,var1 ldr用来加载地址处的内容,例如ldr r0,var1 上面的这种语法只能从.text段中加载但 ldr r0,=var1可从任意段中加载地址ldr有伪指令和非伪指令,伪指令后面的立即数前加= ADR在编译时会被替换成一条add 或者 sub 指令,如果替换不了则报错。相对PC寻址ADRL会被替换成两条指令,替换不了报错误。相对PC或者积存器寻址这两
4、条指令依据立即数的对齐方式不同,允许的立即数范围也不同。LDR则是产生文字池的方式加载常量,基于PC的相对寻址,专用加载32bit立即数 . 通过反汇编可以很容易看出LDR和 ADR区别:假设入口点地址为0 x8000 AREA LDRlabel, CODE, READONLY ENTRY ; Mark first instruction to execute start BL func1 ; Branch to first subroutine stop 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -
5、 - - - - 第 1 页,共 10 页 - - - - - - - - - MOV r0, #0 x18 ; angel_SWIreason_ReportException LDR r1, =0 x20026 ; ADP_Stopped_ApplicationExit LDR r1,=0 xff SWI 0 x123456 ; ARM semihosting SWI func1 LDR r0, =start ; = LDR R0,PC, #offset to Litpool 1 ADR r2,start LDR r1, =Darea +12 ; = LDR R1,PC, #offset t
6、o Litpool 1 ADR r3,Darea+12 MOV pc,lr ; Return LTORG ; Literal Pool 1 Darea SPACE 8000 ; Clears a 8000 byte area of memory, ; starting at the current location, ; to zero. END 反汇编后:start 0 xeb000003 bl func1 stop 0 xe3a00018 mov r0,#0 x18 00008008 0 xe59f1018 ldr r1,0 x00008028 ; = #0 x00020026 00008
7、00c 0 xe3a010ff mov r1,#0 xff 00008010 0 xef123456 swi 0 x123456 func1 0 xe59f0010 ldr r0,0 x0000802c ; = #0 x00008000 00008018 0 xe24f2020 sub r2,pc,#0 x20 ; #0 x8000 0000801c 0 xe59f100c ldr r1,0 x00008030 ; = #0 x00008040 00008020 0 xe28f3018 add r3,pc,#0 x18 ; #0 x8040 00008024 0 xe1a0f00e mov p
8、c,r14 00008028 0 x00020026 dcd 0 x00020026&. 0000802c 0 x00008000 dcd 0 x00008000. 00008030 0 x00008040 dcd 0 x00008040. Darea 0 x00000000 dcd 0 x00000000. 00008038 0 x00000000 dcd 0 x00000000. 0000803c 0 x00000000 dcd 0 x00000000. 00008040 0 x00000000 dcd 0 x00000000. 00008044 0 x00000000 dcd 0 x00
9、000000. ,.3. MOV MOV 加载 8 位立即数8 位立即数即第2 操作数,必须可由一个8 位常数循环移位偶数位得到,如0 xf0000000,0 xf00000001都是合法的4. 数据回写例如:ldr r0,r1! stmdb sp!,r0,r4 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 10 页 - - - - - - - - - ! 用于前索引方式中表示数据回写,例如: ldr r0,r1,#4! 后索引方式不用!, 数据始终回写 , 例如 :l
10、dr r0,r1,#4 对堆栈方式中用!, 表示堆栈自动增加或者减少访问内存的LDR/STR指令索引方式ldr r0,r1,#4前索引 , 先加ldr r0,r1,#4后索引 , 后加5. DCD 和 SPACE DCD 分配一个地址并初始化为指定的表达式如 DCD 0 x8000 就是分配一个32 位的地址,其内容是0 x8000 如果用上 标号 label ,那么 这个 label相当于一个变量,如label DCD 0X8000 这样引用 label就是使用了0 x8000 这个数值。SPACE 分配一段指定长度的内存空间并初始化为0 如label SPACE 0 x8000 就是分配一
11、段长度为0 x8000 的空间,并初始化为0 Data1 DCD 1,2,3 Data2 SPACE 12 反汇编后的结果:Data1 0 x00000001 dcd 0 x00000001 . 00008040 0 x00000002 dcd 0 x00000002 . 00008044 0 x00000003 dcd 0 x00000003 . Data2 0 x00000000 dcd 0 x00000000 . 0000804c 0 x00000000 dcd 0 x00000000 . 00008050 0 x00000000 dcd 0 x00000000 . 6. LTORG 与
12、 LDR LTORG 是与 LDR联合使用的literal pool, 可以在函数尾部声明, 这样相对 PC偏移最少 , 如果不用 LTORG, 则编译器自动在( 整个 ) 程序末尾声名,但这样偏移有可能太大而编译不通过. ARM 立即数, LDR 和 MOV 的区别Mov 是把立即数赋给一个寄存器,但对立即数的范围有要求。只能是由8bit连续有效位通过偶数次移位能得到的数。如果立即数超出这个范围,就没办法用一条 MOV 指令给寄存器赋值。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -
13、第 3 页,共 10 页 - - - - - - - - - LDR除了普通的读数之外,也有给寄存器赋立即数的功能。你只要写LDR R0 ,=0 xabcdef它没有立即数范围的限制。因为这是一条伪指令。如果立即数在MOV 的要求内,那就用一条汇编来实现。如果不在Mov的范围内,就用其它方式实现,如变成两条指令,或从 PC 偏移地址读一个 32 位数给寄存器。MOV 是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的这个立即数要符合一个8 位数循环右移偶数位的取值原因是, MOV
14、本身就是一条 32bit指令,除了指令码本身,它不可能再带一个可以表示 32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数 ( 循环右移,且数值x2) ,8bit用来表示要移位的一个基数。还有一点是关于 ldr 的, 其实 ldr 可以装载一个 32bit 立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,比如ldr r1, =0 x12345678其实真正的汇编代码是将某个地址的值传递给 r1 ,就是说需要一个地址存放0 x12345678这个立即数,实际上可以看作是一条伪指令而且如果这个立即数可以用mov 指令的形式来表达,会被编译
15、器实际用 mov来代替比如:ldr r1,=0 x10 会变成mov r1,#0 x10 ARM是 RISC结构,数据从内存到CPU 之间的移动只能通过L/S指令来完成,也就是ldr/str指令。想把数据从内存中某处读取到寄存器中,只能使用ldr 。比如:ldr r0, 0 x12345678 就是把 0 x12345678这个地址中的值存放到r0 中。而 mov 不能干这个活, mov 只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86 这种 CISC 架构的芯片区别最大的地方。 x86中没有 ldr 这种指令,因为 x86 的 mov 指令可以将数据从内存中移动到寄存器中。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年ARM几条汇编指令的比较定 2022 ARM 汇编 指令 比较
限制150内