大家好,欢迎来到IT知识分享网。
索引:鼠标右键上拉可回来
1、写在前面的话
这篇博客主要讲下ARM汇编中的数据处理指令,这类指令包括数据传送指令、算数运算指令、逻辑运算指令、比较指令等,下面详细归类说明下。
2、数据传送指令
01 MOV指令
格式:MOV{条件}{S}目标寄存器, 源操作数
用法:MOV指令可以完成从 另一个寄存器 、 被移位的寄存器 或者 将一个立即数 加载到 目标寄存器 中。其中S选项决定指令的操作是否影响CPSR中条件标志位的值,当没有S时指令不更新CPSR中条件标志位的值。
示例:
MOV R1, R0 ; 将寄存器R0的值传送到寄存器R1中去(从另一个寄存器中) MOV PC, R14 ; 将寄存器R14的值传送到PC中去,常用于子程序的返回(从另一个寄存器中) MOV PC, LR ; 效果和上面一句一样,常用于子程序的返回 MOV R1, R0, LSL#3 ; 将寄存器R0的值左移3位后传到R1(从被移位的寄存器中) MOV R1, #0xF000000B ; 将立即数#0xF000000B放到R1中(将立即数加载到寄存器中) MOVS R3, R1, LSL#2 ; R3=R1<<2,同时影响标志位
02 MVN指令
格式:MVN{条件}{S}目标寄存器, 源操作数
用法:用法和MOV一样,完成从 另一个寄存器 、 被移位的寄存器 或者 将一个立即数 加载到 目标寄存器 中,只不过加载的这个数需要先按位取反。
示例:
MVN R0, 0xA0000007 ; 执行的结果相当于R0=0x5FFFFFF8,可以使用朱老师的寄存器验证 MVN R0, #4 ; 先对4进行2进制表示,得到0b00000100,取反得到0b,求其补码,因为是负数,先 对其正数0求反得到0b,然后加1得到0b = -5 ; 负数的补码求法:正数取反 + 1
3、算数运算指令
01 ADD指令
格式:ADD{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:ADD指令用于把两个操作数相加,并将结果存放到目标寄存器中。操作数1应该是一个寄存器,操作数2可以是 一个寄存器 、 被移位的寄存器 或者是一个 立即数。
示例:
ADD R0, R1, R2 ; R0 = R1 + R2,相当于加后进行赋值 ADD R0, R1, #256 ; R0 = R1 + 256,加上一个立即数之后进行赋值 ADD R0, R2, R3, LSL#1 ; R0 = R2 + (R3 << 1),加上一个移位寄存器内的数据后赋值
02 SUB指令
格式:SUB{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:SUB指令用于把两个操作数相减,并将结果存放到目标寄存器中。操作数1应该是一个寄存器,操作数2可以是 一个寄存器 、 被移位的寄存器 或者是一个 立即数。
示例:
SUB R0, R1, #256 ; R0 = R1 - 256
03 RSB指令
格式:RSB{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:作反向减法用的,可从操作数2中减去操作数1,并赋值给目标寄存器。这个是很有用的,因为有了这个指令,操作数2选项范围会更大。
示例:
RSB R1, R0, #5 ; 相当于R1 = 5 - R0 RSB R0, R1, R2 ; 相当于R0 = R2 - R1 RSB R0, R2, R3, LSL#1 ; 相当于R0 = (R3 << 1) - R2
04 ADC指令
格式:ADC{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:带进位加法,该指令可以将操作数1和操作数2相加,同时带有进位标志。
示例:
; 编写两个64位数相加,第一个64位的低32位放在R0,高32位放在R1 ; 第二个64位的数低32位放在R2,高32位放在R3 ; 编写代码实现两个64位数的和,结果的低32位放在R4,高32位放在R5 MOV R0, #0xFFFFFFFE ; 第一个数的低32位 MOV R1, #1 ; 第一个数的高32位 MOV R2, #0x5 ; 第二个数的低32位 MOV R3, #1 ; 第二个数的高32位 ADDS R4, R0, R2 ADC R5, R1, R3 ; ADC运算的实质是R5 = R1 + R3 + 'C','C'位是CPSR进位标志
05 SBC指令
格式:SBC{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:带进位减法,该指令可以从操作数1减去操作数2。如果清除进位标志位,则结果减1。
示例:
MOV R0, #1 ; 第一个数的低32位 MOV R1, #3 ; 第一个数的高32位 MOV R2, #3 ; 第二个数的低32位 MOV R3, #1 ; 第二个数的高32位 SUBS R4, R0, R2 SBC R5, R1, R3
06 RSC指令
格式:RSC{条件}{S} 目标寄存器, 操作数1, 操作数2
用法:带进位反向减法,指令可以让操作数2减去操作数1中的值,如果清除进位标记,则结果将减1。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/105766.html