1. 什么是立即数?立即数判断的规则?
立即数就是12位立即数imm12
- 如果某个数的数值范围是0~0xFF之间,那么这个数一定是立即数;
- 把某个数展开成2进制,这个数的最高位1至最低位1之间的二进制数序列的位数不能超过8位;
- 这个数的二进制序列凑够8位之后的的右边必须为偶数个连续的 0
2. ldr和str指令作用?
ldr指令:
功能1:将非立即数加载到通用寄存器
功能2:将RAM中的数据加载到通用寄存器
str指令:
将通用寄存器中的值写入到RAM中
3. bic和orr指令作用?
bic指令:将某个通用寄存器清0(操作数中为bit1的位清0),清0结果写回到通用寄存器
orr指令:将某个通用寄存器置1(操作数中为bit1的位置1),置1结果写回到通用寄存器
4. stmfd和ldmfd指令作用?
stmfd:入栈保护
STMFD<c> <Rn>{!}, <registers>
stmfd sp!, <r0,r1,lr>
ldmfd:出栈恢复
LDMFD<c> <Rn>{!}, <registers>
ldmfd sp!, <r0, r1, lr>
5.b、bl、bx指令区别?
b指令:实现无条件跳转指令(b 条件分支 b循环 b函数调用)
bl指令:函数跳转前,会将函数返回地址保存到lr寄存器
bx指令:bx lr 等价于mov pc, lr,bx指令加一个地址
6. mrs和msr指令作用?
mrs指令:读取某个特殊寄存器(cpsr)的值到通用寄存器
msr指令:将通用寄存器中的值写入到特殊寄存器(cpsr)
MRS<c> <Rd>, <spec_reg>
mrs r0, cpsr
MSR<c> <spec_reg>, <Rn>
msr cpsr, r0
sp_user 2048
sp_irq
7. 栈有哪几种类型?ARM采用何种栈?
栈分类:满增栈 空增栈 满减栈 空减栈
增栈:入栈时,sp指针往上走
减栈:入栈时,sp指针往下走
空栈:先写数据,再挪指针
满栈:先挪指针,再写数据
ARM 满减栈 *--sp;
8. 汇编中调用C语言函数需要注意什么?
当参数小于等于4个时,通过通用寄存器进行传参(R0 - R3)
当参数超过4个时,必须通过栈进行传参(入栈保护 出栈恢复)
C语言将函数运行结果返回给R0寄存器