关于指令集
指令集是汇编的基础,是芯片的架构,不懂指令集看着汇编就只能干瞪眼了,所以把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中
初学汇编,内容仅为笔记和参考。
|