寄存器
ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器 应用程序工作在user模式,内核工作在supervisor svc模式 R13 堆栈指针 R14 LR链接寄存器(函数返回,中断返回) R15 PC指针 SPSR save保存进入中断后的CPSR,中断退出让其值恢复
N:代表negtive Z:代表zero(相等) I:代表取消中断 F:代表取消快速中断 M:代表模式
寻址方式
- 立即数寻址
ADD R0, R0, #0x3f; R0<-R0+0x3f - 寄存器寻址
ADD R0, R1, R2; R0<-R1+R2 - 寄存器间接寻址
LDR R0, [R2]; R0<-[R2] - 基址变址寻址
LDR R0, [R1, #4]; R0<-[R1+4] - 相对寻址
BL NEXT MOV PC, LR 跳转链接寄存器
ARM指令
使用@符号来表示注释 {}表示可写可不写的,<>表示一定要写的
MOV
MVN
#4 = 0b0100 取反 符号位1后面为0b1011,因为是负数,因此真正的值为符号位不变,其余位置取反加1,0b0100+0b1 = 0b0101也就是5,算上符号位就是-5.
SUB
操作数1必须是寄存器!
ADD
AND
ORR
BIC
标准ARM汇编%表示二进制,GNU中使用0b
CMP
比较结果在状态寄存器N表示
TST
条件
BL
LSL
ROR
MRS MSR
move register to status register move status register to register
寄存器装载和存储
store register loader register
伪指令
数据伪指令
伪/指令本身并没有所对应的机器码,它只是在编译的时候起作用,或者转 化为其他的实际指令来运行。
- global(全局符号,后面c语言也可以调用)
- ascii(字符串)
- byte(字节)
- word
- data(数据段)
- equ(宏)
- align(下面的数据对齐)
.data@数据段
hello:
.ascii "helloworld"@定义一个hello数据值为helloworld
.equ DA, 0x89@宏定义
操作类伪指令
mov指令所使用操作数不能超过8位,后面shifter_operand12位不是全部用来装数据,其中还有4位是用来看这个数据是否左移或者右移的! 使用ldr伪指令就可以达到超过8位数据赋值给寄存器,只不过ldr用伪指令的方式立即数要使用=号表示 ldr r0, =0x1ff
nop 是空操作,其实质是mov r0, r0没有意义,消耗时间
协处理器访问指令
CP15:coproces 提供16组寄存器
协处理器访问
使用mcr, mrc
|