常用汇编指令小结
因为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 通用寄存器到状态寄存器的传送指令
mov 数据传送指令,可以把一个寄存器的值赋给另外一个寄存器,或者把一个常数赋给寄存器
ldr 当其第二个参数前面有'='时表示伪指令,否则表内存访问指令;伪命令,不是真实存在的指令,编译器会把它扩展成真正的指令;如果该常数能用“立即数”来表示,则使用mov指令,否则编译时将该常数保存在某个位置,使用内存读取指令把它读出来。
str 内存访问指令
cmp 比较指令, 会更新CPSR中的相应条件标志位
nop 空操作伪指令, 可用于延进操作
beq
add 加指令
sub 减指令
orr 逻辑或操作指令
and/ands 逻辑与操作指令
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
关于后缀s(如上面的 and 和 ands),为可选后缀;若指定“s”,则根据指令执行结果更新CPSR中的条件码。
更多详细信息,可参阅附件:常用ARM指令即汇编
还有一篇:blogold.chinaunix.net/u/23353/showart_1770984.html
* 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