Разница в режиме немедленной адресации? - PullRequest
0 голосов
/ 04 декабря 2018

Недавно, когда я изучал концепцию режимов адресации, первый тип - режим немедленной адресации, рассмотрим пример ADD #NUM1,R0 (выполнение инструкции слева направо)

Здесь указан адрес NUM1 хранится в регистре R1?Что касается того, когда мы делаем ADD #4,R0, чтобы указать на следующие данные, когда мы используем #4, я понял, что это добавляет 4 к содержимому регистра R0.Есть ли разница, когда мы используем #NUM1 и #4.Пожалуйста, объясните!

1 Ответ

0 голосов
/ 05 декабря 2018

Есть ли разница, когда мы используем #NUM1 и #4

В конечном машинном коде в исполняемом файле, который фактически будет запускать ЦП, нет, нет.

Если у вас есть ассемблер, который непосредственно создает исполняемый файл (без отдельного шага связывания), то ассемблер будет знать во время сборки числовой адрес NUM1 и просто развернет егосразу же, производя точно такой же машинный код, как если бы вы написали add #0x700, R0.(Предполагая, что метка NUM1 заканчивается в адресе 0x700 для этого примера.)

например, если машинное кодирование для add #imm, R0 равно 00 00 imm16, тогда вы получите 00 00 07 00 (при условиинепосредственный битовый порядок).

Здесь адрес NUM1, хранящийся в регистре R1?

Нет, добавлено к R0.Если R0 ранее содержал 4, то R0 теперь будет содержать адрес NUM1+4.

R1 не затронут.


Часто у вас есть ассемблер иотдельный компоновщик (например, as foo.s -o foo.o для сборки, а затем связывание с ld -o foo foo.o).

Числовой адрес недоступен во время сборки, только во время соединения.Формат объектного файла содержит метаданные для перемещений символов, которые позволяют компоновщику заполнить абсолютные числовые адреса, как только он решит, куда будет загружен код.

Полученный машинный код останется прежним.

...