Сборка - неявные вычисления меняют код операции? - PullRequest
0 голосов
/ 21 марта 2020

Когда у меня есть такая операция, как mov eax, [input+10]:

Имеет ли он другой код операции, чем эта операция:

mov eax, [input] (учитывая, что входное значение теперь имеет прежнее значение input+10)

1 Ответ

5 голосов
/ 21 марта 2020

Эти две инструкции должны генерировать точно такой же машинный код.

Это потому, что «input» - это символ, обозначающий адрес, и ассемблер добавляет к нему константу «10». В обоих случаях инструкция mov register, [displacement]. Используемый режим адресации называется «Прямой», то есть «Только смещение».

ЦПУ не имеет режима адресации (или специального кода операции) для mov register, [displacement + offset].

(И не имеет никакого смысла поддерживать такой режим адресации, потому что и displacement, и offset являются константами.)

EDIT:

Особый случай возникает, когда объявляется 'input' экспортируемый в один файл сборки, а затем он импортируется в другой файл сборки, где вы пытаетесь добавить к нему смещение. В этом случае ассемблер не будет знать точное значение «ввода» при сборке вашей инструкции, поэтому он должен будет до компоновщика выяснить значение операнда во время связывания, или до загрузчика, чтобы выяснить его во время загрузки программы. Есть две возможности: Либо эти инструменты (комбинация ассемблер + компоновщик) имеют средства для обработки этого, либо они не имеют.

  • Если у них есть средства для обработки этого, то объектный код, испускаемый ассемблером, может немного отличаться в файле '.obj', но результирующий битовый шаблон после загрузки исполняемого файла в память и запуска должен оставаться точно таким же.

  • Если инструменты не могут справиться с этим, ваш ассемблер должен выдать ошибку, что он не знает, как добавить '10' к 'input', потому что 'input' является внешним символом .

...