ARM常用指令
(持续更新ing)
mov指令
在ARM体系中,mov只能用于数据在(寄存器之间)的移动或者往寄存器中写入立即数。
mov r1, r2
限制:但把立即数赋给一个寄存器,对立即数的范围有要求。只能是由8bit连续有效位通过偶 数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。
ldr指令
LDR是将(内存中的数)载入到寄存器,LDR可以载入立即数。
ldr R1, =0xE0000000 (R1=0xE0000000)
ldr R1 0xE0000000 (将内存中地址为0xE0000000的内容载入到R1)
ldr R1, [R0] (将R0中的数所指定的地址的内容传输到R1)
str指令
STR是将(寄存器中的数)载入内存。
str R1, [R0] 将R1中的内容传输到R0中的数所指定的地址的内存中去
- mov 只能用于寄存器之间的传输,传输立即数时有条件限制,只能装载通过偶数次移位能得到的立即数。
- str/ldr 可以用于寄存器与内存之间的数据交换,str是将寄存器中的数载入内存,ldr是将内存中的数载入到寄存器,ldr可以载入立即数。并且ldr在往寄存器中载入立即数时,不受立即数的限制,而mov受其限制。
- mov,本身就是一个32位的机器码,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit数来表示立即数,其中4bit表示移位的移数(循环右移,且数值X2),8bit用来表示要移位的一个基数。
lldr指令
LDR指令用于从(存储器)中将一个
32
位的字数据传送到目的寄存器中。该指令通常用于从存储器中读取
32
位的字数据到通用寄存器,然后对数据进行处理。当程序计数器
PC作为目的寄存器时,指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。
LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。
补充
机器码分析
我我们编写的汇编程序还是不够底层,CPU是直接对机器码进行操作的,所以还需要用汇编器将汇编代码转换成机器码才能被CPU处理。
ARM指令格式
分析:
-
31--28是条件段,取值表如下所示(这里的例子中mov后面没有跟条件,所以是AL,Always (unconditional) ,对应的机器码为1110)
- 27--26为保留位,恒为00
- 25位:Distinguishes between the immediate and register forms of <shifter_operand>.
-
标志shifter_operand段存放的是立即数还是寄存器。若为寄存器则置0,若为立即数则置1。
-
24--21为opcode,标明指令的类型,下面是opcode的取值表
- 20位:Signifies that the instruction updates the condition codes.表明该指令是否会影响程序状态字寄存器。是则置1,否则置零。
- 19--16位:Specifies the first source operand register.标明第一个源操作数寄存器,见每个指令的格式,有的有Rd,有的没有。
- 由MOV指令的一般格式可以看出,他是没有使用Rd的,所以这几位填全0,其他使用到Rn的,这几位填通用寄存器标号的二进制值。如r2,则为0010。
- 15--12位:Specifies the destination register. 标明目的寄存器,填充方法同Rn。
- 11--0位:Specifies the second source operand. 标明第二个源操作数,若为立即数则填该立即数的二进制值,若为通用寄存器则填通用寄存器标号的二进制值。
立即数
立即数的求值(以mov为例)
mov r1, #0x400
用11- 0位来表示立即数。假设移动到寄存器的数是0x400。对应的对应的二进制位:0b 0000 0000 0000 0000 0000 0100 0000 0000
1前面包括1有24位,,即有22/2 = 11,对应的二进制为0b 1011。所以高四位就是1011,低八位为
1