2022年ARM几条汇编指令的比较[定 .pdf

上传人:C****o 文档编号:32185073 上传时间:2022-08-08 格式:PDF 页数:10 大小:159.54KB
返回 下载 相关 举报
2022年ARM几条汇编指令的比较[定 .pdf_第1页
第1页 / 共10页
2022年ARM几条汇编指令的比较[定 .pdf_第2页
第2页 / 共10页
点击查看更多>>
资源描述

《2022年ARM几条汇编指令的比较[定 .pdf》由会员分享,可在线阅读,更多相关《2022年ARM几条汇编指令的比较[定 .pdf(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

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 指令可以将数据从内存中移动到寄存器中。

16、另外还有一个就是ldr 伪指令,虽然 ldr 伪指令和 ARM 的 ldr 指令很像,但是作用不太一样。 ldr 伪指令可以在立即数前加上= ,以表示把一个地址写名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 10 页 - - - - - - - - - 到某寄存器中 ,比如:ldr r0, =0 x12345678 这样,就把 0 x12345678这个地址写到 r0 中了。所以, ldr 伪指令和 mov是比较相似的。 只不过mov指令限制了立即数的长度为8 位,也就

17、是不能超过512 。而 ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8 位,那么在实际汇编的时候该 ldr伪指令是被转换为mov指令的。LDR 的两种用法1)LDR pc, =MyHandleIRQ 表示将 MyHandleIRQ符号放入pc 寄存器中2)LDR PC ,MyHandleIRQ 表示将读取存储器中MyHandleIRQ符号所表示的地址中的值,及需要多读一次存储器。LDR R1,=COUNT 这条伪指令, 是怎样完成将COUNT 的地址赋给R1 ,有兴趣的可以看它编译后的结果。这条指令实际上会编译成一条LDR指令和一条DCD 伪指令。ldr 伪指令和

18、ldr 指令不是一个同东西。LDR 和 STR 用于字和无符号字节指令格式:LDR/STRcondT Rd, LDR/STRcondBT Rd , LDRcondT Rd,加载指定地址的字数据到Rd 中;STRcondT Rd, 存储 Rd 中的字数据到指定的地址单元中;LDRcondBT Rd, 指令加载指定地址的字节数据到Rd 的的最低字节中 (Rd 的高 24 位清零);STRcondBT Rd, 指令存储 Rd 中的最低字节数据到指定的地址单元中。T 为可选后缀,若有T,那么即使处理器是在特权模式下,存储系统也将访问看成处理器是在用户模式下, T 在用户模式下无效,不能与前索引偏移一起

19、使用T。地址部分可用的形式有4 种:零偏移 (zero offset) Rn ,Rn 的值作为传送数据的地址。如:LDR R0,R1 ;前索引偏移 (pre-indexed offset) Rn,Flexoffset!在数据传送之前,将偏移量Flexoffse t 加到Rn 中。其结果作为传送数据的存储器地址。若使用后缀“! ”,则结果写回到Rn 中,且 Rn 不允许是R15 ,如:LDRB R0,R1,#8 LDR R0,R1,#8!程序相对偏移 (program relative) label (label 必须是在当前指令的土 4KB 范围内 ) 。程序相对偏移是前索引形式的另一种版本。

20、从PC 计算偏移量,并将PC 作为 Rn 生成前索引指令,不能名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 10 页 - - - - - - - - - 使用后缀“ !”,如:LDR R0,place ;place 地址装入 R0后索引偏移 (post-indexed offset) Rn ,Flexoffset。在数据传送后, 将偏移量 Flexoffset 加到 Rn 中,结果写回到Rn,Rn 不允许是R15 ,如:LDR R0,R1,R2,LSL 2 ;将存储器地

21、址为R1 的字数据读入寄存器R0,并将新地址R1 R2 4 写入 R1 。偏移量 Flexoffset可以是下两种形式之:1) 取值范围是 -4095 到+4095 的整数的表达式,经常是数字常量,如:STR R5,R7,#-8 2) 一个寄存器再加上移位(移位由立即数指定),如:-Rm,shift 其中:- :可选负号。若带符号“一”,则从Rn 中减去偏移量。否则,将偏移量加到Rn 中。Rm :内含偏移量的寄存器。Rm 不允许是 R15。Shift:Rm 的可选移位方法。可以是下列形式的任何一种:ASR n :算术右移 n 位(1=n=32) LSL n :逻辑左移 n 位(1=n=31)

22、LSR n :逻辑右移 n 位(1=n=32) ROR n :循环右移 n 位(1=n=31) RRX :循环右移1 位,带扩展。逻辑与操作指令指令格式:ANDcondS Rd,Rn,operand2 AND指令将操作数operand2 与 Rn 的值按位逻辑与,结果存放到目的寄存器Rd 中。若设置S,则根据运算结果影响、位,在计算第二操作数时,更新位,不影响位(指令ORR 、EOR 、BIC 对标志位的影响同 AND 指令)。指令示例:ANDS R1,R1,R2 ;R1=R1&R2 ,并根据运算的结果更新标志位AND R0,R0,#0 x0F ;R0=R0&0 x0F ,取出 R0最低位数据

23、。逻辑或操作指令指令格式: condS Rd,Rn,operand2 指令将操作数operand2 与 Rn 的值按位逻辑或,结果存放到目的寄存器Rd 中。指令示例:ORRS R1,R1,R2 ;R1=R1|R2 ,并根据运算的结果更新标志位ORR R0,R0,#0 x0F ;R0=R0|0 x0F,将最低位置,其余位不变。位清除指令指令格式: condS Rd,Rn,operand2 指令将Rn 的值与操作数operand2 的反码按位逻辑与,结果存放到目的寄存器Rd 中。指令示例: BIC R0,R0,#0 x0F ;将最低位清零,其余位不变。比较指令指令格式:名师资料总结 - - -精品

24、资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 10 页 - - - - - - - - - CMPcond Rn,operand2 指令用Rn的值减去操作数operand2 ,并将结果的状态(Rn 与 operand2 比较是大、小、相等)反映在中,以便后面的指令根据条件标志决定程序的走向。指令与指令完成的操作一样,只是指令只减,不存结果。指令示例:cmp R0,R1 ;比较 R0,R1 beq stop ;R0=R1跳到 stop blt less ;R0R1跳到 Less . . . Less

25、:. . . Stop:.减法运算指令指令格式: condS Rd,Rn,operand2 指令用Rn 的值减去操作数operand2 ,并将结果存放到目的寄存器 Rd 中。 指令示例:SUBS R1,R1,R2 ;R1=R1-R2 ,并并根据运算的结果更新标志位SUBGT R3,3,#1 ;大于则 R3=R3- SUB R0,R2,R3,LSL# ; R0=R2-(R32)ARM 分支指令助记符说明操作Bcond lable 分支指令 lable BLcond lable 带链接的分支指令 , lable BXcond Rm 带状态切换的分支指令 Rm,切换处理器状态指令的条件码条件码助记符

26、后缀标志含义 0000 EQ Z 置位 (Z=1) 相等 0001 NE Z 清零 (Z=0) 不相等 0010 CS C 置位无符号数大于等于 0011 CC C 清零无符号数小于 0100 MI N 置位负数 0101 PL N 清零整数或 0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 10 页 - - - - - - - - - 0110 VS V 置位溢出 0111 VC V 清零未溢出 1000 HI C 置位且 Z 清零无符号数大于 1001 LS Z

27、置位且 C 清零无符号数小于等于 1010 GE N 等于 V(N=V=1 或 N=V=0) 带符号数大于或等于 1011 LT N 不等于 V 带符号数小于 1100 GT Z 清零且 N 等于 V 带符号数大于 1101 LE Z 置位或 N 不等于 V 带符号数小于或等于 1110 AL 忽略无条件执行; GPIO寄存器宏定义GPFCON EQU 0 x56000050 GPFDAT EQU 0 x56000054 GPFUP EQU 0 x56000058 EXPORT LEDTEST AREA LEDTESTASM, CODE , READONLY ; 该伪指令定义了一个代码段,段名

28、为LEDTESTASM,属性只读LEDTEST ; 设置 GPF4 GPF7 为 output ldr r0,= GPFCON ldr r1, r0bic r1 , r1,# 0 xff00 orr r1, r1,# 0 x5500 str r1 , r0; 禁止 GPF4 GPF7 端口的上拉电阻ldr r0,= GPFUP ldr r1, r0orr r1, r1,# 0 xf0 str r1 , r0名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 10 页 - -

29、- - - - - - - looptest ; 将数据端口 F的数据寄存器的地址附给寄存器r2 ldr r2,= GPFDAT ldr r3, r2bic r3 , r3,# 0 xf0 orr r3, r3,# 0 xb0 str r3 , r2 ; GPF6 output 0 ldr r0,= 0 x2fffff bl delay ; 调用延迟子程序ldr r3, r2bic r3 , r3,# 0 xf0 orr r3, r3,# 0 x70 str r3 , r2 ; GPF7 output 0 ldr r0,= 0 x2fffff ; 初始计数值bl delay ; 调用延迟子程序

30、ldr r3, r2bic r3 , r3,# 0 xf0 orr r3, r3,# 0 xd0 str r3 , r2 ; GPF5 output 0 ldr r0,= 0 x2fffff bl delay ; 调用延迟子程序ldr r3, r2bic r3 , r3,# 0 xf0 orr r3, r3,# 0 xe0 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 10 页 - - - - - - - - - str r3 , r2 ; GPF4 output 0

31、ldr r0,= 0 x2fffff bl delay ; 调用延迟子程序b looptest delay sub r0 , r0,# 1 ; r0=r0- 1 cmp r0 ,# 0 x0 ; 将 r0 的值与 0 相比较bne delay ; 比较的结果不为 0(r0 不为 0),继续调用 delay , 否则执行下一条语句mov pc , lr ; 返回END ; 程序结束符名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 10 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁