Верно ли мое понимание инструкции lw в MIPS? - PullRequest
1 голос
/ 16 марта 2019

Я только начинаю понимать MIPS, и конкретная инструкция "lw" смущает меня.

Из цепочки Понимание того, как на самом деле работают `lw` и` sw` в программе MIPS , вот что я собрал:

Если, скажем, мыhave:

lw a, 4(b) // a and b are registers

Тогда это просто означает, что мы получим данные (или обычно называемые «словом», которое я до сих пор не понимаю, почему ...) по адресу памяти b увеличивается на 4. Затем сохраните его в a. Другими словами, получая следующие данные, сохраненные по адресу сразу после адреса b, поскольку каждое "слово" составляет 4 байта.

Кроме того, означает ли это, что данные, хранящиеся в b, должны быть структурой данных, подобной массиву?Чтобы мы могли получить данные по адресу памяти b+4?

Извините, я знаю, что моя формулировка довольно запутанная ... но я на правильном пути?И кто-нибудь, пожалуйста, объясните мне, простыми словами, что такое "слово"?Это в основном данные?

1 Ответ

1 голос
/ 16 марта 2019

Вы на правильном пути.«Слово» - это 4 байта данных.

lw a, 4(b)

Эта инструкция загружает одно слово из адреса в b со смещением 4. Было бы целесообразно, чтобы по этому адресу была структура данных, подобная «массиву», но она не нужна.Зависит от того, чего вы хотите достичь.

Я приведу вам короткий пример:

.globl main

.data
    array: .word 1, 2, 3, 4, 5, 6,    # numbers

.text
main:
    addi $t0, $0, 0                 # p value in $t0
    addi $t1, $0, 0                 # array in $t1

    la $t1, array                      # load array into $t1
    lw $t0, 0($t1)                  # load first word into $t0 --> 1
    lw $t0, 4($t1)                  # load second word into $t0 --> 2

    addi $t1, $t1, 4                    # increase address  += 4
    lw $t0, 0($t1)                  # load first word into $t0 --> 2
    lw $t0, 4($t1)                  # load second word into $t0 --> 3

    addi $v0, $0, 10                    # load exit syscall 
    syscall                                     

Допустим, массив начинается с примера адреса 1000, и мы загружаем этот адрес в $ t1, используяпсевдоинструкция ла.lw $t0, 0($t1) загружает первое слово в $ t0 (загружает данные из примеров адресов 1000-1003).lw $t0, 4($t1) загружает второе слово в $ t0 (загружает данные из примеров адресов 1004 - 1007).

Вы можете использовать http://spimsimulator.sourceforge.net/ для отладки программы.Он покажет вам, какой адрес на самом деле находится в б.

Надеюсь, это поможет.

...