Каков самый простой способ установить align 64
для некоторого кода функции ассемблера с ml64.exe
? Выравнивание по умолчанию для _TEXT
равно 16, поэтому ml64
не позволяет установить более 16 в команде align
. А ml64
не позволяет изменить выравнивание для _TEXT
.
Можно создать еще один раздел/сегмент, но можем ли мы получить выравнивание 64 byte
в основном разделе _TEXT
?
Есть ли решение?
P.S. Решение, предложенное в ответе с _TEXT$FOO
, работает!
_TEXT$FOO SEGMENT ALIGN(64)
align 64
_TEXT$FOO ENDS
Я также попытался изменить значение в поле выравнивания в Characteristics
в заголовке раздела для _TEXT
в файле obj (coff) в шестнадцатеричном редакторе. И компоновщик использовал это измененное выравнивание. Так почему же ml и jwasm не позволяют изменить эти 16 байт по умолчанию для _TEXT
, если компоновщик может использовать любое значение из этого поля в файле obj?
В некоторых случаях для кода полезно выравнивание по 64 байтам. Если вы используете выравнивание по 16 байтам, то другой код (это может быть C
код) может случайным образом переместить ваш asm
код на 4 разных смещения: 0, 16, 32, 48. И некоторые циклы, вероятно, могут пересекать 64-байтовые или 32-байтовые диапазон. Таким образом, вы можете увидеть некоторые непредсказуемые изменения производительности кода asm
, когда вы просто меняете другой код C
.
ALIGN 64
перед определением процедуры? НравитсяALIGN 64
test_proc PROC
...
ret
test_proc ENDP
? Вам не нужно изменять выравнивание самого раздела в соответствии с это оно должно выравнивать и следующую инструкцию. (Я предполагаю, что ваша команда выравнивания подразумевается как атрибут раздела _TEXT) - person Ped7g   schedule 19.12.2017ALIGN
вnasm
: она имеет локальный эффект при выравнивании следующего испускаемого байта, , но она также вызываетSECTALIGN
, поэтому весь раздел имеет хотя бы такое выравнивание. - person BeeOnRope   schedule 19.12.2017