Меняет ли MASM инструкции за вашей спиной? - PullRequest
2 голосов
/ 29 сентября 2011

Меня удивило следующее при чтении HLA faq :

MASM имеет неприятную привычку менять инструкции за вашим назад. HLA также, похоже, имеет ту же проблему.

Затем я искал в Интернете, но ничего не нашел по этому поводу. Это правда или просто миф?

Ответы [ 4 ]

2 голосов
/ 30 сентября 2011

MASM может изменить вещи на вас. Например, он может исправить ваши условные переходы. То есть если вы напишите:

    add ax,bx
    jnz NotZero

    ...
NotZero:

Если NotZero находится вне диапазона условного перехода, MASM может переписать ваш код как:

    add ax,bx
    jz Zero
    jmp NotZero
Zero:
    ...
NotZero:

Насколько я помню, есть ключи командной строки, чтобы предотвратить это. Вы также можете специально сказать, jnz near NotZero, чтобы предотвратить это. Если вы сделаете это, а цель выйдет за пределы условного ограничения, вы получите ошибку.

Я помню, что MASM делал что-то похожее, но это было очень давно. Я не помню, что это были за конкретные вещи.

1 голос
/ 30 сентября 2011

Это наполовину правда.Некоторые инструкции могут быть закодированы несколькими способами, и время от времени (по причинам, которые они никогда не объясняли) Microsoft изменила способ кодирования нескольких конкретных инструкций.

Начиная с версии 6, она также имела несколькопроходной режим, который может / будет кодировать прыжки, используя наименьшую форму прыжка, которая «достигнет» пункта назначения.До 5.x вам приходилось вручную указывать ближний и дальний прыжки, и если вы догадались неправильно, на втором проходе это привело бы к «фазовой ошибке».Начиная с v6, он будет автоматически регулировать размер.Так как это меняет размер инструкции, это также может привести к изменению других окружающих переходов (и, аналогично, в другом направлении, меньшее кодирование для перехода может уменьшить размер кода, чтобы другой переход мог достичь своего назначения с меньшей кодировкой).

Это , а не , однако, с точки зрения большинства людей, это "неприятная привычка" - наоборот, большинству людей нравится, когда она автоматически кодирует инструкции настолько эффективно, насколько это возможно.В нескольких случаях (например, самомодифицирующемся коде) вам нужно это предотвратить, но те - это те, которые обычно квалифицируются как "неприятные привычки" (по крайней мере, если вы действительно делаете это привычно).

1 голос
/ 30 сентября 2011

Возможно, это не то, что вы ищете, но я встречал случаи, когда MASM не выдает такой же вывод для того же ввода, что и другие подобные ассемблеры (например, NASM).То есть немного другая последовательность байтов, которая разбирается на одно и то же.

Как правило, это вообще не проблема, и единственная причина, по которой я даже заметил это, была из-за странного случая, когда мне требовались определенные биты в инструкции, чтобы иметь определенное значение;с одним ассемблером все было в порядке, а с другим - нет, и мне пришлось применить ручные исправления.

Надеюсь, это поможет.

0 голосов
/ 29 сентября 2011

Я думаю, что это «изменение» касается планирования команд и оптимизации глазка.Вы можете избежать этого, когда пишете свой код с помощью "cat> pgm.o".

...