ARM中的MOV指令

    技术2022-05-20  57

            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,或许会更方便点。

     

    看了2440的datasheet,最令人费解的就是rotate了,习惯了C语言里的逻辑右移,把循环右移和逻辑右移混淆了。

     


    最新回复(0)