Вот мой опыт:
Сценарий 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
Сборка:
- Установите флажок «Собрать все файлы в каталоге»
- Откройте a.asm и активируйте окно
- Соберите
Результат: Это работает нормально, получает правильное значение данных в $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
, так что у каждого будет точка входа симулятора, например - в результате вы захотите собрать свою главную в главном окне.