ARM和MIPS中Load 32位数据的差别

ARM和MIPS都是Load-store结构,也就是说CPU只处理寄存器中的数据,而不会直接去处理memory中的数据。要想处理memory中的数据,必须先把memory中的数据load到寄存器中。

那如何load一个32bit的立即数到寄存器中呢?我们知道,ARM和MIPS的指令长度都是32bit,也就是说,不可能用一条指令来直接load一个32bit数据到寄存器中(如果可以的话,数据占了32bit,指令该如何编码?)

ARM中采用了ldr指令来实现这个功能。

                                                        

 LDR {cond} <Rd>,<addressing mode>

                                                        

ldr 指令将一个memory中的数据load到寄存器Rd中。因此,如果需要load一个32bit立即数的话,先在memory中存放这个数据,然后调用 ldr指令来load这个数据到寄存器中。参考下面的代码中Line3。为了load 0x49020000到r0中,先在地址0x40202428中存入这个立即数,然后在调用ldr将这个数load到寄存器中。

                                                                                                           

1: 40202418 <serial_getc>:                                                                     

                                                                                                           

2: 40202418:  e52de004   push  {lr}    ; (str lr, [sp, #-4]!)                         

                                                                                                           

3: 4020241c:  e59f0004   ldr  r0, [pc, #4]  ; 40202428 <serial_getc+0x10> 

                                                                                                           

4: 40202420:  eb000042   bl  40202530 <NS16550_getc>                         

                                                                                                           

5: 40202424:  e49df004   pop  {pc}    ; (ldr pc, [sp], #4)                          

                                                                                                           

6: 40202428:  49020000   .word  0x49020000                                         

                                                                                                           

而MIPS采用了不同的做法。MIPS中采用lui和addiu的方面来load 32bit数。指令lui是将一个16bit的数据load到寄存器的高16字节,然后再调用addiu加上32bit数据的低16bit。

                                                                                                           

1: 80000430:  3c02804b   lui  v0,0x804b                                                 

                                                                                                           

2: 80000434:  3c06804b   lui  a2,0x804b                                                  

                                                                                                           

3: 80000438:  24453474   addiu  a1,v0,13428                                           

                                                                                                           

如上面代码的Line1和Line3,实现了将32bit数据0x804b3474 load到寄存器a1的功能。

比较ARM和MIPS的两种实现方法,由于ARM多了一个memory 读的动作,因因此在时间效率中,MIPS要领先ARM。在空间效率上,两种方法都占用了8个字节。这一点上是相同的

 

 

http://vm-kernel.org/blog/category/armmips/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值