Как lw представлен в C или C ++? - PullRequest
1 голос
/ 22 октября 2009

Так, например, что бы что-то вроде этого:

lw $ t1, 0 ​​($ t0)

или

lw $ t2,8 ($ t0)

Перевести на C или C ++? Я имею в виду, я загружаю слово из адреса в регистр, я получаю это. Является ли массив похожим понятием или как?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 22 октября 2009

Это инструкция «загрузить слово». Он загружает 4-байтовое слово из памяти в том месте, адрес которого хранится в регистре $ t0, в регистр $ t1.

В c / c ++ нет эквивалентной конструкции. Эта инструкция очень популярна и используется в большинстве конструкций, где требуется доступ к памяти, например:

int *p;
// p = ...
*p += 10;

может быть переведено в нечто подобное (учитывая, что $ t0 содержит указатель 'p')

lw $t1, 0($t0)
addi $t1, $t1, 10
sw $t1, 0($t0)

Здесь первая инструкция загружает переменную в регистр, вторая изменяет ее, а третья записывает ее обратно в память

0 голосов
/ 22 октября 2009

Если вы используете MIPS32 (и, следовательно, имеете 32-битную адресацию памяти), то это довольно просто.

lw $t1, 0($t0)

То, что это делает, загружает значение с байтовым смещением 0 из адреса памяти t0 в регистр t1.

lw $t2, 8($t0)

То, что это делает, загружает значение с байтовым смещением 8 с адреса памяти t0 в регистр t2.

Предположим, у вас есть адрес памяти 0x12345678. Затем сборка MIPS, по сути, делает следующее:

int t0 = 0x12345678;
// ...
int t1 = *(int*)(t0 + 0);
int t2 = *(int*)(t0 + 8);
0 голосов
/ 22 октября 2009

Я думаю, вы не можете написать точно такой же код. Вы можете сделать следующее:

int* wordAddress = ... + 8; // 8 or any offest
// assuming int is a word on MIPS wich I never worked with personally
int  word = *wordAddress;

Вы также можете применить смещение при получении значения:

int* wordAddress = ... + 0;
int  word = *(wordAddress + 8);

Есть примечание: Вы не можете указать необходимый register на языке. Что вы можете сделать, это дать подсказку компилятору поместить word в register:

// it is just a hint. The compiler is free to put it in memory.
register int  word = *wordAddress;
0 голосов
/ 22 октября 2009

Для первой строки:

int t1, *t0; ... t1 = *t0 или t1 = t0[0] или даже int t0, t1; ... t1 = t0.

Для второго:

int t2 = t0[2], может быть, или, возможно, int t2 = t0.thirdThing.

struct {
   int a,b,thirdThing;
} t0;

Но вы не можете знать наверняка. Это может быть char *x, **y; x = y[2]; Если мы увидим, как адрес попал в регистр, это может пролить больше света на исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...