Эти две инструкции должны генерировать точно такой же машинный код.
Это потому, что «input» - это символ, обозначающий адрес, и ассемблер добавляет к нему константу «10». В обоих случаях инструкция mov register, [displacement]
. Используемый режим адресации называется «Прямой», то есть «Только смещение».
ЦПУ не имеет режима адресации (или специального кода операции) для mov register, [displacement + offset]
.
(И не имеет никакого смысла поддерживать такой режим адресации, потому что и displacement
, и offset
являются константами.)
EDIT:
Особый случай возникает, когда объявляется 'input' экспортируемый в один файл сборки, а затем он импортируется в другой файл сборки, где вы пытаетесь добавить к нему смещение. В этом случае ассемблер не будет знать точное значение «ввода» при сборке вашей инструкции, поэтому он должен будет до компоновщика выяснить значение операнда во время связывания, или до загрузчика, чтобы выяснить его во время загрузки программы. Есть две возможности: Либо эти инструменты (комбинация ассемблер + компоновщик) имеют средства для обработки этого, либо они не имеют.
Если у них есть средства для обработки этого, то объектный код, испускаемый ассемблером, может немного отличаться в файле '.obj', но результирующий битовый шаблон после загрузки исполняемого файла в память и запуска должен оставаться точно таким же.
Если инструменты не могут справиться с этим, ваш ассемблер должен выдать ошибку, что он не знает, как добавить '10' к 'input', потому что 'input' является внешним символом .