大家好,欢迎来到IT知识分享网。
关于指令集
指令集是汇编的基础,是芯片的架构,不懂指令集看着汇编就只能干瞪眼了,所以把ARM指令集全都记录下来做个笔记。
可能会和WIN32的指令集有出入,比如WIN32中MOV可以把数据从内存中加载到寄存器中去,但在ARM的RISC结构中,MOV只能将数据从寄存器移动到寄存器,WIM32的看小甲鱼的视频。说白了X86是复杂指令集(CISC),ARM是精简指令集(RISC)。
复杂指令集是将很多操作集成起来,精简是可以很细节的去处理。
51的看刘健老师
ARM汇编初学者视频
ARM指令集
ARM指令是32位的,而Thumb指令时16位的。
如果在1K的存储空间中,可以放32条ARM指令,就可以放64条Thumb指令,因此在存放Thunb指令时,代码密度高。
助记符 | 操作 |
---|---|
MOV | 移动 |
ADD | 加 |
SUB | 减 |
RSB | 反减 |
CMP | 比较 |
TST | 测试 |
AND | 逻辑与 |
EOR | 逻辑或 |
LSL | 逻辑左移 |
ASR | 算术右移 |
MUL | 有符号长乘 |
SMUL | 乘 |
SMLAL | 有符号长累乘 |
MSR | 移入状态寄存器 |
B | 分支 |
BX | 分支与交换 |
LDR | 载入字 |
LDRH | 载入半字 |
LDRB | 载入字节 |
LDRSH | 载入有符号半字 |
LDRSB | 载入有符号字节 |
LDM | 载入乘 |
LDRBT | 转化载入寄存器字节 |
LDRT | 转化载入寄存器 |
MCR | 移入协处理器 |
LDC | 协处理器数据处理 |
MVN | 移非 |
ADC | 带进位加 |
SBC | 带进位减 |
RSC | 带进位反减 |
CMN | 比较取反 |
TEQ | 测试等价 |
BIC | 位清零 |
ORR | 逻辑 ( 包括 ) 或 |
MLA | 累乘 |
UMULL | 无符号长乘 |
UMLAL | 无符号长累乘 |
MRS | 由状态寄存器移出 |
BL | 分支与链接 |
SWI | 软件中断 |
STR | 恢复字 |
STRH | 恢复半字 |
STRB | 恢复字节 |
STRBT | 转化保存寄存器字节 |
STRT | 转化保存寄存器 |
STM | 多路保存 |
SWPB | 交换字节 |
MRC | 由协处理器移出 |
STC | 由协处理器保存 |
Thumb指令集
PS:和C不同,在汇编中可不区分大小写。
助记符 | 操作 |
---|---|
MOV | 移动 |
ADD | 加 |
SUB | 减 |
CMP | 比较 |
TST | 测试 |
AND | 逻辑与 |
EOR | 逻辑或 |
LSL | 逻辑左移 |
ASR | 算术右移 |
MUL | 乘 |
B | 分支 |
BX | 分支与交换 |
LDR | 载入字 |
LDRH | 载入半字 |
LDRB | 载入字节 |
LDRSH | 载入有符号半字 |
LDMIA | 载入乘 |
PUSH | 将寄存器推入堆栈 |
MVN | 移非 |
ADC | 带进位加 |
SBC | 带进位减 |
CMN | 比较取反 |
NEG | 去反 |
BIC | 位清零 |
ORR | 逻辑 ( 包括 ) 或 |
LSR | 逻辑右移 |
ROR | 右转 |
BL | 分支与链接 |
SWI | 软件中断 |
STR | 保存字 |
STRH | 保存半字 |
STRB | 保存字节 |
LDRSB | 载入有符号字节 |
STMIA | 多路保存 |
PUSH 将寄存器推入堆栈 POP | 将寄存器推出堆栈 |
Thumb不是完整的指令集
Thumb是ARM 指令集的一个子集
Thumb指令可以看做是ARM指令压缩形式的子集,是针对代码密度【1】的问题而提出的,它具有16为的代码密度。Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集。因此,Thumb指令只需要支持通用功能,必要时,可借助完善的ARM指令集,例如:所有异常自动进入ARM状态。
在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。编写ARM指令时,可使用伪指令CODE32声明。
Thumb 指令集分为:
- 分支指令
- 数据处理指令
- 载入与保存指令
- 批量载入与保存指令
- 异常产生指令
Thumb模式下,R0~R7八个通用功能寄存器有效。与执行ARM指令时的R0~R7相同。 某些 Thumb 指令还访问程序计数器 (ARM 寄存器 15)、链接寄存器 (ARM 寄存器 14) 及
堆栈指针 (ARM 寄存器 13)。其他指令对 ARM 寄存器 8 ~ 15 的访问有所限制。
简单的指令集操作
mov ax,18 ; 将18送入AX ax=18
mov ah,78 ;将78送入AH ah=78
add ax,8 ;将寄存器AX中的数值加上8 ax+=8
LDR R0,0x1234 ;将0x1234这个地址存放到R0中
初学汇编,内容仅为笔记和参考。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/12397.html