常用汇编指令小结

因为RT-Thread的移植会涉及到上下文切换代码及中断处理代码之类的移植,而且在编程指南中的“GNU GCC移植”和“STM32说明”两节也都展示了不少汇编代码,所以了解一些基本汇报指令还是有必要的。

* cpsr current program status register (程序状态寄存器)
* spsr Saved Process Status Registers (程序状态保存寄存器)

关于cpsr与spsr,详细描述可参见:hi.baidu.com/yanxuex29/blog/item/ace566313cf18251ad4b5fd8.html

fd Full Descending 满减栈标示
stmfd 入栈,栈指针向下移动一个位置
ldmfd 出栈,栈指针向上移动一个位置

mrs 状态寄存器到通用寄存器的传送指令
msr 通用寄存器到状态寄存器的传送指令
msr cpsr, r0  /* 复制r0到cpsr中 */
mrs r0, cpsr /* 复制cpsr到r0中 */

mov 数据传送指令,可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器
mov r1, r2  /* r1 =  r2 */
mov r1,#1024 /* r1 = 1024 */

ldr 当其第二个参数前面有'='时表示伪指令,否则表内存访问指令;伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
str 内存访问指令
ldr r1, =1024   /* r1 = 1024 */
ldr r1, [r2, #4] /* 将地址为r2+4的内存单元数据读取到r1中 */
ldr r1,[r2] /* 将地址为r2的内存单元数据读取到r1中 */
ldr r1,[r2], #4 /* 将地址为r2的内存单元数据读取到r1中,然后r2=r2+4 */
str r1 ,[r2, #4] /* 将r1的数据保存到地址为r2+4的内存单元中 */
str r1, [r2] /* 将r1的数据保存到r2所指向的地址中 */
str r1, [r2],#4 /*将r1的数据保存到地址为r2的内存单元,然后r2= r2+4 */

cmp 比较指令, 会更新CPSR中的相应条件标志位
nop 空操作伪指令, 可用于延进操作
beq
BEQ LOOP  /* 条件跳转到 LOOP 标号处 */

add 加指令
sub 减指令
add r1, r2, #1  /* r1=r2+1 */
sub r1, r2, #1 /* r1=r2-1 */

orr 逻辑或操作指令
and/ands 逻辑与操作指令
orr R0,R0,#x0F  /* 将 R0 的低 4 位置 1 */
ands R0,R0,#x01 /* R0=R0&0x01,取出最低位数据 */
and R2,R1,R3 /* R2=R1&R3 */

b 跳转指令
bl 带链接的跳转指令,BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR/链接寄存器)。由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回。
bx 带状态切换的跳转指令

blo
ldrlo
strlo

* sp Stack Pointer
* lr Link register
* pc Program Counter
* alu Arithmetic and Logic Unit
* swi Software Interrupt Instruction
* fiq Fast Interrupt Request
* irq Interrupt Request
* lsl Logical Shift Left
* lsr Logical Shift Right
* asr Arithmetic Shift Right
asr #n  /* 算术右移 n 位(1≤n≤32) */
lsl #n /* 逻辑左移 n 位(1≤n≤31) */
lsr #n /* 逻辑左移 n 位(1≤n≤32) */
ror #n /* 循环右移 n 位(1≤n≤31) */

关于后缀s(如上面的 and 和 ands),为可选后缀;若指定“s”,则根据指令执行结果更新CPSR中的条件码。

更多详细信息,可参阅附件:常用ARM指令即汇编

还有一篇:blogold.chinaunix.net/u/23353/showart_1770984.html
原文地址:https://www.cnblogs.com/wzc0066/p/2949295.html