Как установить align 64 в ml64.отлично?
Каков простейший способ задать align 64 для некоторого кода функции ассемблера с помощью ml64.exe?
Выравнивание по умолчанию для _TEXT равно 16, поэтому ml64 не позволяет установить больше 16 в команде align.
И ml64 не позволяет изменить выравнивание для _TEXT.
Можно создать еще один раздел / сегмент, но можем ли мы получить 64 byte выравнивание в основном разделе _TEXT?
Есть ли какое-нибудь решение?
С. П.
Решение, предложенное в ответе с _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. 1 ответ:
Как вы говорите, очевидно,
ml64(Microsoft Macro Assembler (x64)) не позволяет изменять выравнивание раздела.text, поэтому в нем не может быть ничего с выравниванием больше 16 байт. Однако существует простое решение этой проблемы, и оно заключается в использовании функции группирования разделов PECOFF. Если раздел имеет знак доллара$в своем имени, то все после$игнорируется при связывании, так что все разделы с одинаковым префиксом перед$объединяются в один раздел. Объединенные разделы сортируются по полному имени раздела, включая то, что следует за$.Так, например, вы можете сделать:
В приведенном выше примере секции_TEXT$FOO SEGMENT ALIGN(64) int 3 ALIGN 64 PUBLIC function function: ret _TEXT$FOO ENDS _TEXT SEGMENT PUBLIC start start: call function int 3 _TEXT ENDS END_TEXTи_TEXT$FOOбудут объединены компоновщиком в одну секцию.text. Код в_TEXT$FOOпридет после кода в_TEXT. Обратите внимание, что если вы действительно пытаетесь выровнять данные только для чтения, а не фактический код, то вам следует поместить данные в раздел.rdata. Что-то вроде это:Обратите внимание, что вы должны использовать опцию_RDATA SEGMENT ALIGN(64) ALIAS(".rdata") READONLY DB 1h ALIGN 64 PUBLIC readonlydata readonlydata: DB 0ffh _RDATA ENDSALIAS(".rdata")здесь, потому что ассемблер не переводит автоматически_RDATAв.rdataтак же, как он переводит_TEXTи_DATAв.textи.data.
Comments