Как установить 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.
595   1  

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  ENDS
Обратите внимание, что вы должны использовать опцию ALIAS(".rdata") здесь, потому что ассемблер не переводит автоматически _RDATA в .rdata так же, как он переводит _TEXT и _DATA в .text и .data.

Comments

    Ничего не найдено.