mov指令:加载12位立即数到寄存器或转移一个寄存器的值到另外一个寄存器
mov r0, #2 ;加载立即数2到寄存器r0,MOV{S}<c> <Rd>, #<const>
mov r1, r0 ;将r0寄存器的值加载到r1,MOV{S}<c> <Rd>, <Rm>
逻辑右移(LSR):最高位补0,不考虑数值的符号位(无符号数)
1011 0010 >>(LSR) 1: 0101 1001
算术右移(ASR):最高位补符号位,考虑数值的符号位(有符号数)
1011 0010 >>(ASR) 1:1101 1001
循环右移(ROR):循环将每次移出的最低位补到最高位
1011 0010 >>(ROR) 1 : 0101 1001 >>(ROR) 1:1010 1100
add指令:
ADD{S}<c> <Rd>, <Rn>, #<const>
ADDS}<c> <Rd>, <Rn>, <Rm>{, <shift>}
sub指令:
SUB{S}<c> <Rd>, <Rn>, #<const>
SUB{S}<c> <Rd>, <Rn>, <Rm>{, <shift>}
立即数:
如果某个数的数值范围是0~0xFF之间,那么这个数一定是立即数;
把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
这个数的二进制序列凑够8位之后的的右边必须为偶数个连续的 0
ldr指令:
功能1:将非立即数加载到通用寄存器
功能2:将RAM中的数据加载到通用寄存器
LDR<c> <Rt>, [<Rn>{, #+/-<imm12>}]
str指令: 将通用寄存器中的值写入到RAM中
bic指令:将某个通用寄存器清0(操作数中为bit1的位清0),清0结果写回到通用寄存器
orr指令:将某个通用寄存器置1(操作数中为bit1的位置1),置1结果写回到通用寄存器
stmfd:入栈保护
STMFD<c> <Rn>{!}, <registers>
stmfd sp!, <r0,r1,lr>
ldmfd:出栈恢复
LDMFD<c> <Rn>{!}, <registers>
ldmfd sp!, <r0, r1, lr>
b指令:实现无条件跳转指令
b 条件分支
b 循环
b 函数调用
bl指令:函数跳转前,会将函数返回地址保存到lr寄存器
bx指令:bx lr 等价于mov pc, lr,bx指令加一个地址
mrs指令:读取某个特殊寄存器(cpsr)的值到通用寄存器
msr指令:将通用寄存器中的值写入到特殊寄存器(cpsr)
栈分类:满增栈 、空增栈 、满减栈 、空减栈
增栈:入栈时,sp指针往上走
减栈:入栈时,sp指针往下走
空栈:先写数据,再挪指针
满栈:先挪指针,再写数据
ARM采用满减栈。
汇编调用C函数:
当参数小于等于4个时,通过通用寄存器进行传参(R0 – R3)
当参数超过4个时,必须通过栈进行传参(入栈保护 出栈恢复)
C语言将函数运行结果返回给R0寄存器
C调用汇编函数:
C语言向汇编函数传参,参数会被保存到通用寄存器
汇编函数的结果通过R0寄存器返回给C语言


