发新帖我要提问
12
返回列表
打印
[应用相关]

ARM汇编指令 总结

[复制链接]
楼主: hanzhen654
手机看帖
扫描二维码
随时随地手机跟帖
21
hanzhen654|  楼主 | 2019-4-10 18:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
一开始,看到 STMFD sp!{R0-R5,LR} 这条命令时真是有点疑惑。STMFD的意思是:ST(store 存储) M(multiple 多次)F(full 满堆栈)D(decrease 递减堆栈),合起来就是按满的递减的方式把后面的寄存器里的值都存到sp中。
STMFD sp!{R0-R5,LR}就是把lr  r5-r0 依次存到sp中,并且sp会在存数据之前自动减一个数据的空间(因为arm栈是递减的)。至于最后一个问题,就是sp后为什么有一个“!”。如果有!号,表示在存入数据后sp会指向最后一个存入的数据的地址,否则sp会把自己的值加到一开始的地址。(就是sp在执行完这条指令之后sp指向的地址不变)。

使用特权

评论回复
22
hanzhen654|  楼主 | 2019-4-10 18:15 | 只看该作者
例子:STMFD sp!,{r0} ;将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4(因为arm栈是递减的),将r0中的低八位放入sp这个位置,第九位到第十六位放入sp+1的地址,将第十七位到第二十四位放入sp+2的位置,将第二十五位到第三十二位放入sp+3的位置。

LDMFD sp!,{r2,r3};将堆栈中的内容出栈,出栈过程是,将sp这个位置的值放入r2中的低八位,将sp+1这个位置的值放入r2中的第九位到第十六位,将sp+2这个位置的值放入r2中的第十七位到第二十四位,将sp+3这个位置的值放入r2中的第二十五位到第三十二位;将sp+4这个位置的值放入r3中的低八位,将sp+5这个位置的值放入r3中的第九位到第十六位,将sp+6这个位置的值放入r3中的第十七位到第二十四位,将sp+4这个位置的值放入r3中的第二十五位到第三十二位。最后sp=sp+8。

此外,STR指令也可以用来入栈:strr1, [sp,#4] ,将r1中的值压入堆栈,压入过程是,由于r1中的值为32位的,将r0中的低八位放入sp+4这个位置,第九位到第十六位放入sp+5的地址,将第十七位到第二十四位放入sp+6的位置,将第二十五位到第三十二位放入sp+7的位置。

使用特权

评论回复
23
hanzhen654|  楼主 | 2019-4-10 18:16 | 只看该作者
LSL(或ASL)操作
LSL(或ASL)操作的格式为:通用寄存器,LSL(或ASL) 操作数     
LSL(或ASL)可完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向左移位,低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
操作示例
MOV  R0, R1,LSL#2              ;将R1中的内容左移两位后传送到R0中。

使用特权

评论回复
24
hanzhen654|  楼主 | 2019-4-10 18:17 | 只看该作者
  LSR操作
LSR操作的格式为:通用寄存器,LSR 操作数     
LSR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
操作示例:
MOV  R0, R1, LSR#2           ;将R1中的内容右移两位后传送到R0中,左端用零来填充。

使用特权

评论回复
25
hanzhen654|  楼主 | 2019-4-10 18:18 | 只看该作者
ASR操作
ASR操作的格式为:通用寄存器,ASR 操作数     
ASR可完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向右移位,左端用第31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。
操作示例:
MOV   R0, R1, ASR#2    ;将R1中的内容右移两位后传送到R0中,左端用第31位的值来填充。

使用特权

评论回复
26
hanzhen654|  楼主 | 2019-4-10 18:18 | 只看该作者
ROR操作
ROR操作的格式为:通用寄存器,ROR 操作数     
ROR可完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端用右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。
操作示例:
MOV   R0, R1, ROR#2           ;将R1中的内容循环右移两位后传送到R0中。

使用特权

评论回复
27
hanzhen654|  楼主 | 2019-4-10 18:19 | 只看该作者
  RRX操作
RRX操作的格式为:通用寄存器,RRX 操作数     
RRX可完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端用进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(0~31)。

操作示例:
MOV  R0, R1,RRX#2             ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。

使用特权

评论回复
28
hanzhen654|  楼主 | 2019-4-10 18:19 | 只看该作者
SHL和SHR:逻辑移位指令。
SHL是逻辑左移指令,它的功能为:
(1)将一个寄存器或内存单元中的数据向左移位;
(2)将最后移出的一位写入CF中;
(3)最低位用0补充。
指令:
MOV AL,01001000b
SHL AL,1 ;将AL中数据左移一位
执行后(AL)=10010000b,CF=0。
注意:如果移动位数大于1时,必须将移动位数放在CL中。
比如,指令:
MOV AL,01010001b
MOV CL,3
SHL AL,CL
执行后(AL)=10001000b,因为最后移出的一位是0,所以CF=0。LDRB
SHR是逻辑右移指令,它和SHL所进行的操作刚好相反。

使用特权

评论回复
29
hanzhen654|  楼主 | 2019-4-10 18:23 | 只看该作者
AND
逻辑与操作指令。将operand2 值与寄存器Rn 的值按位作逻辑与操作,结果保存到Rd 中。指令格式如下:AND{cond}{S} Rd,Rn,operand2
AND 指令举例如下:
 ANDS R0,R0,#x01 ;   R0=R0&0x01,取出最低位数据
 AND R2,R1,R3 ;      R2=R1&R3

使用特权

评论回复
30
hanzhen654|  楼主 | 2019-4-10 18:24 | 只看该作者
ORR
逻辑或操作指令。将operand2 的值与寄存器Rn 的值按位作逻辑或操作,结果保存到Rd 中。指令格式如下:ORR{cond}{S} Rd,Rn,operand2
ORR 指令举例如下:
ORR R0,R0,#x0F ;     将R0 的低4 位置1
MOV R1,R2,LSR #4
ORR R3,R1,R3,LSL #8 ;  使用ORR 指令将近R2 的高8 位数据移入到R3 低8 位中

使用特权

评论回复
31
hanzhen654|  楼主 | 2019-4-10 18:24 | 只看该作者
EOR
 逻辑异或操作指令。将operand2 的值与寄存器Rn 的值按位作逻辑异或操作,结果保存到Rd 中。指令格式如下:EOR{cond}{S}Rd,Rn,operand2
EOR 指令举例如下:
EOR R1,R1,#0x0F ;   将R1 的低4 位取反
EOR R2,R1,R0 ;      R2=R1^R0
EORS R0,R5,#0x01 ;  将R5 和0x01 进行逻辑异或,结果保存到R0,并影响标志位

使用特权

评论回复
32
hanzhen654|  楼主 | 2019-4-10 18:24 | 只看该作者
ARM汇编指令的基本指令格式如下:

<opcode>[<cond>][s]<Rd>,<Rn>,[<op2>],其中,[<参数>]可选,指令长度32bit。第一项为操作码,第二项为条件助记符。常用的条件助记符及其含义如下表所示。由指令格式可知,操作码可与条件助记符结合起来一起使用,如MOVEQ,MOVNE,BLS等等

使用特权

评论回复
33
hanzhen654|  楼主 | 2019-4-10 18:26 | 只看该作者
根据下表中条件助记符的含义和操作码的含义,对于上述组合命令也就不难理解了。

使用特权

评论回复
34
wakayi| | 2019-5-5 15:21 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
35
wowu| | 2019-5-5 15:25 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
36
xiaoqizi| | 2019-5-5 15:29 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
37
木木guainv| | 2019-5-5 15:32 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则