Есть ли разница, когда мы используем #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
).
Числовой адрес недоступен во время сборки, только во время соединения.Формат объектного файла содержит метаданные для перемещений символов, которые позволяют компоновщику заполнить абсолютные числовые адреса, как только он решит, куда будет загружен код.
Полученный машинный код останется прежним.