Как установить выравнивание 64 в ml64.exe?

Каков самый простой способ установить 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.


person Igor Pavlov    schedule 19.12.2017    source источник
comment
Это странно. В Linux с NASM или YASM, создающими объектные файлы ELF, самым большим требованием выравнивания в разделе становится требование выравнивания для этого раздела. (И, таким образом, для сегмента после связывания.)   -  person Peter Cordes    schedule 19.12.2017
comment
Какую проблему вы пытаетесь решить с помощью 64-байтового выравнивания раздела _TEXT? Я чувствую здесь возможную проблему XY. Размещение функции в строке кэша?   -  person Michael Petch    schedule 19.12.2017
comment
Как насчет ALIGN 64 перед определением процедуры? Нравится ALIGN 64 test_proc PROC ... ret test_proc ENDP? Вам не нужно изменять выравнивание самого раздела в соответствии с это оно должно выравнивать и следующую инструкцию. (Я предполагаю, что ваша команда выравнивания подразумевается как атрибут раздела _TEXT)   -  person Ped7g    schedule 19.12.2017
comment
Может быть, есть другая директива, которая устанавливает выравнивание раздела? Вот как работает директива ALIGN в nasm: она имеет локальный эффект при выравнивании следующего испускаемого байта, , но она также вызывает SECTALIGN, поэтому весь раздел имеет хотя бы такое выравнивание.   -  person BeeOnRope    schedule 19.12.2017


Ответы (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.

person Ross Ridge    schedule 20.12.2017