MIPS程序集加载和存储内存地址

时间:2019-02-25 02:34:08

标签: assembly memory load mips store

我正在学习MIPS汇编,并且想知道如何在MIPS中加载和存储内存地址。

例如,假设我有以下C代码:

int i;

i = 0xFFFF0000;

然后我将如何存储地址?例如,我想将i的值存储到地址0x2000A000

2 个答案:

答案 0 :(得分:2)

LUI V0, 0xFFFF         << load 0xffff0000 into v0
LUI A0, 0x2000
ORI A0, A0, 0xA000     << load address to A0
SW V0, (A0)            << Stores V0 at address held in A0

或者,如果您的汇编程序支持宏操作码(我认为这些天几乎所有代码都支持)

LUI V0, 0xFFFF
LI A0, 0x2000A0000
SW V0, (A0) 

请注意,A0是WORD / 32位对齐的。

答案 1 :(得分:2)

让编译器向您展示:

GetAllReservation(duration.GetStringOrNull("startDay"), duration.GetStringOrNull("endDay"));

编译和反汇编

#define SOME_ADDRESS (*((volatile unsigned int *) 0x2000A000  ))
void fun ( void )
{
    SOME_ADDRESS = 0xFFFF0000;
}

正如评论中指出的那样,有一个错过的优化,但这不是答案的重点。 1)学习组装2)学习优化组装...使用编译器,您将看到其中的一些优化。但是在这种情况下不是。

Disassembly of section .text:

00000000 <fun>:
   0:   3c022000    lui $2,0x2000
   4:   3442a000    ori $2,$2,0xa000
   8:   3c03ffff    lui $3,0xffff
   c:   ac430000    sw  $3,0($2)
  10:   03e00008    jr  $31
  14:   00000000    nop

是的,它是为mips32构建的,以使-march = mips1和-march = mips32r6生成相同的代码。如评论所述。