недостающие массивы в разделе .data MIPS - PullRequest
0 голосов
/ 21 марта 2020

Я работаю над программой в MIPS, использующей симулятор MARS для чтения и записи файлов .pgm. Он состоит из нескольких файлов, содержащих различные вспомогательные функции, но для целей этого вопроса есть два файла: main.asm и writeimage.asm.

В сегменте .data файла writeimage.asm, Я хочу инициализировать: строковый литерал "P5 \ n" строковый литерал "P2 \ n" размер буфера, чтобы я мог играть с этим параметром без необходимости жестко кодировать размер буфера.

Вот 'preamble' (если можно так назвать) writeimage.asm:

                  .data
myStack:          .space 5
writeBuffer:      .space 128
                  .align 2
writeBufferSize:  .word 128
                  .align 2
p5:               .ascii "P5\n"
                  .align 2
p2:               .ascii "P2\n"
                  .text
                  .globl write_image
                  write_image: ... 

По какой-то причине, когда я запускаю свою программу из main, когда я пытаюсь получить доступ к writeBufferSize, вот так:

la $t0, writeBufferSize
lw $s0, ($t0)

значение, загруженное в $s0, равно нулю. Кроме того, строки p2 и p5, по-видимому, не существуют по адресам, по которым MARS говорит, что они находятся. Позже в коде я пытаюсь записать эти строки в файл, и когда я загружаю адрес строки в $a1 и выполнить системный вызов, то, что будет напечатано в файле, - ничто; и когда я смотрю на адрес, который загружен в $a1, и использую отладчик, чтобы увидеть содержимое этого адреса памяти, он пуст, как будто строка никогда не существовала.

У меня нет этой проблемы когда я собираю только writeimage.asm, только когда я собираю из main, и когда я собираю все файлы в каталоге.

Я очень расстроен этим, и я действительно не хочу go усердно длина буфера кодирования по всему моему коду. Пожалуйста, помогите!

Спасибо

1 Ответ

1 голос
/ 21 марта 2020

Вот мой опыт:

Сценарий A

main.asm:

    .data
    .extern p3, 4   # this will be commented out in some of the other scenarios
    .text
    la $t0, p3
    lw $t1, ($t0)

a.asm:

    .data
    .globl p3       # this will be commented out in some of the other scenarios
p3: .word 200

Сборка:

  1. Установите флажок «Собрать все файлы в каталоге»
  2. Откройте a.asm и активируйте окно
  3. Соберите

Результат: Это работает нормально, получает правильное значение данных в $t1: 200.

Сценарий B

То же, что и сценарий A, за исключением того, что для шага сборки (2.) активируйте окно для main. АСМ вместо

Результат: он получает ошибку ассемблера (следовательно, не запускается)!

Очевидно, если он сначала видит .globl, то .extern в другом файле - это нормально, но если сначала он видит .extern, .globl считается противоречивым.

Сценарий C

main.asm: аналогично сценарию A, за исключением комментария .extern в main.asm

a.asm: без изменений от сценария A

Результат: оба сценария сборки ios как A & B работают правильно!

Сценарий D

main.asm: без изменений от Сценария A (то есть с использованием .extern)

a.asm: отсутствует (комментарий) директива .globl

Результат: Независимо от того, какое окно активируется при сборке, ошибок сборки нет, но неверный код. Метка ссылается на местоположение 0x10000000, а не на правильное 0x10010000. Таким образом, ноль загружается в $t1.

По-видимому, .extern удовлетворяет ассемблер, поэтому он молча позволяет это, даже если нет истинного определения метки.


Рекомендация: Сценарий C - используйте .globl, но не используйте .extern!

Кроме того, файл, окно которого активируется (в первую очередь) при нажатии кнопки сборки, кажется, тот, который идет «первым» для .text и .data, так что у каждого будет точка входа симулятора, например - в результате вы захотите собрать свою главную в главном окне.

...