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/