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

Nov 8th, 2008 | Posted by yajin | Filed under ARM/MIPS

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个字节。这一点上是相同的

Tags:
  1. omycle
    Feb 1st, 2010 at 09:59
    Reply | Quote | #1

    "如果可以的话,数据占了32bit,指令该如何编码?"
    只知道不能直接处理memory的数据,不过,你是这样解释的,第一次听说啊,受教啦