ARM指令

Posted _WILLPOWER_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ARM指令相关的知识,希望对你有一定的参考价值。

寄存器

ARM总共有37个寄存器,31个通用寄存器,6个状态寄存器
应用程序工作在user模式,内核工作在supervisor svc模式
R13 堆栈指针
R14 LR链接寄存器(函数返回,中断返回)
R15 PC指针
SPSR save保存进入中断后的CPSR,中断退出让其值恢复


N:代表negtive
Z:代表zero(相等)
I:代表取消中断
F:代表取消快速中断
M:代表模式


寻址方式

  1. 立即数寻址
    ADD R0, R0, #0x3f; R0<-R0+0x3f
  2. 寄存器寻址
    ADD R0, R1, R2; R0<-R1+R2
  3. 寄存器间接寻址
    LDR R0, [R2]; R0<-[R2]
  4. 基址变址寻址
    LDR R0, [R1, #4]; R0<-[R1+4]
  5. 相对寻址
    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

ADRL

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

以上是关于ARM指令的主要内容,如果未能解决你的问题,请参考以下文章

arm汇编b指令是绝对地址还是相对地址跳转?

如何实现对ARM汇编指令的调试?

ARM - 如何从 C 函数中执行单个汇编指令(机器代码)

ARM指令和THUMB指令有啥区别

ARM汇编指令特点

ARM指令集Thumb指令集Thumb-2指令集