MIPS сборка загрузки и хранения адреса памяти - PullRequest
0 голосов
/ 25 февраля 2019

Я изучаю сборку MIPS и мне было интересно, как я загружаю и сохраняю адрес памяти в MIPS.

Например, допустим, у меня есть этот код C:

int i;

i = 0xFFFF0000;

И как потомя бы сохранил адрес?Например, я хочу сохранить значение i по адресу 0x2000A000.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Пусть компилятор покажет вам:

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

скомпилируйте и дизассемблируйте

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

Как указано в комментариях, есть пропущенная оптимизация, но это не главноеответ.1) Изучите АСМ 2) Научитесь оптимизировать АСМ ... в будущем.Используя компилятор, вы увидите некоторые из этих оптимизаций.Но не в этом случае.

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

00000000 <fun>:
   0:   3c022000    lui $2,0x2000
   4:   3c03ffff    lui $3,0xffff
   8:   ac434000    sw  $3,16384($2)
   c:   03e00008    jr  $31
  10:   00000000    nop

Да, он был построен для mips32, чтобы получить -march = mips1 и -march = mips32r6 для получения одинакового кода.как прокомментировано.

0 голосов
/ 25 февраля 2019
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 / 32bit.

...