浅述ARM汇编的立即数

大多数的数据处理指令和部分状态寄存器访问指令用到立即数,在ARM中不是所有数都能用作立即数;

 

一条典型的ARM汇编语法格式:

<opcode>{cond}{S} <Rd>,<Rn>,<shifter_operand>
        
其中  opcode:                  指令助记符,如ADD、SUB、MOV等;
          cond:                      条件码助记符,如EQ(0000)、NE(0001)、AL(1110)等;
          S:                            如果指令有S后缀,则该指令的操作会影响CPSR的值;
          Rd:                         目标寄存器;
          Rn:                         包含第一个源操作数的寄存器;
          shifter_operand:  表示第二个源操作数,可以为立即数

 

一条典型的ARM汇编编码格式:

操作数的语法格式:
#<immediate>
其中, <immediate>=immed_8循环右移(2*rotate_imm)

immediate  :  立即数
immed_8    :  8位的常数
rotate_imm :  4位的循环右移值

意思是每个立即数都是由一个8位的常循环右移偶数位得到。

 

ROR 循环右移:即将操作数循环按指定的数量向右循环移位,左边用右边移出的位来填充;

 

例如:有效的立即数:0x104、0xff0
 immediate    :    0x104            //  0001 0000 0100
   immed_8    :    0x41               //  0100 0001
      左边补0    :    0x00000041 //  0000 0000 0000 0000 0000 0000 0100 0001
rotate_imm   :    15                   //  循环右移(2*15)位
                                                    //  0000 0000 0000 0000 0000 0001 0000 0100
                                                    //  0x0000 0104

immediate    :    0xff0               //  1111 1111 0000
   immed_8   :    0xff                 //  1111 1111
   左边补0      :    0x000000ff   //  0000 0000 0000 0000 0000 0000 1111 1111
rotate_imm  :    14                   //  循环右移(2*14)位
                                                    //  0000 0000 0000 0000 0000 1111 1111 0000
                                                    //  0x0000 0ff0

无效的立即数不能通过上面的构造方法得到:0x101、0x102、0xff1
0x101: 0001 0000 0001 (不能通过一个八位常数获得)
0x102: 0001 0000 0010 (不能通过移动偶数位获得)
0xff1:   1111 1111 0001   (不能通过一个八位常数获得)

但是有时候用出现这种情况,如:0x3f0   // 0011 1111 0000
可以为:#0x3f,ror (2*14)                          // 0000 0011 1111 
或:    #0xfc,ror (2*15)                             // 0000 1111 1100

面对这种情况,ARM有如下规则:
1. 当立即数的值0-0xFF时,immed_8=<immediate>,rotate_imm=0;
2. 其它情况下,汇编编译器选择使 rotate_imm 的数值最小的编码方式.

所以0x3f0 是通过 0x3f>>(2*14) 的方式获得。

 

LDR伪指令: 装入32位立即数或地址到寄存器

语法: LDR{<cond>} <register>,=[<expr>|label-expr]

expr表示32位常数

eg:

    ldr r3,=0xFFF
    ldr r1, =12345678

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值