MOV指令分析

2020-08-14 01:04:39

ARM中的MOV指令格式是這樣的

在这里插入图片描述

    op2是佔了12位元,其中bit11-bit8是移位數(rotate),bit7-0是一個8位元的立即數(imm),MOV Rn, op2,執行之後,Rn=op2 >> (rotate * 2),這裏的移位是回圈右移,這就決定了MOV指令不是所有的立即數都能表示的,以下是幾個例子:

1、mov r3, #0x56000000

雖然0x56000000是一個32位元的數,但是可以找到這麼一個8位元立即數,通過右移得到,看下機器碼e3a03456,展開成二進制,對照下格式

1110 0011 1010 0000 0011 0100 0101 0110

cond[31:28]=1110

[27:26]=00

L[25]=1,代表op2是一個立即數

OpCode[24:21]=1101

S[20]=0

Rn[19:16]=0000

Rd[15:12]=0011,R3

Op2[11:8]=0100,右移4 * 2位

Op2[7:0]=0101 0110,8位元立即數,0x56

首先要將0x56擴充套件成32位元的無符號數,0x00000056,然後回圈右移8位元,就得到了0x56000000

2、mov r3, #0x56000014

0x56000014是無法通過移位來得到的,這時編譯器會報錯,C語言編寫的程式,編譯器會這樣來處理:

mov r3, #0x56000000

add r3, r3, #0x14

代替mov的另外一條指令就是ldr,或許會更方便點。