Выравнивание переменных в разделе .data в NASM - PullRequest
1 голос
/ 17 апреля 2020

Работая с выводом из objconv Агнера Фога, я вижу два экземпляра этого комментария:

; Note: Memory operand is misaligned. Performance penalty

Это решается с помощью предшествующего объявления данных с ALIGN 16, например:

section. data align=16
data_1: dq 0
data_2: dq 0
str_var: db "This is a string",0x00
ALIGN 16
MQX_Dcc: dq 0

Мой раздел данных начинается с align = 16, но, видимо, этого недостаточно для предотвращения смещения некоторых переменных.

Мои вопросы:

  1. Как я могу узнать (без использования дизассемблера), что операнд памяти смещен в разделе .data? Я могу посчитать количество байтов, предшествующих объявлению, но это утомительно вручную, особенно если перед переменной со смещением стоит много объявлений.

  2. Было бы полезно предварять каждое объявление данных директивой ALIGN?

1 Ответ

2 голосов
/ 17 апреля 2020

Сначала вы должны удалить опечатку в первой строке: вместо

section. data align=16

это должно быть

section .data align=16

Объявление 1: Вы можете удобно проверять смещения всех именованных операндов памяти с помощью некоторого инструмента, который отображает таблицу символов. Если вы собрали исходный код в COFF для Windows, используйте

PEVIEW.EXE RTC222.obj

Если он собран в ELF для Linux, используйте

readelf -s RTC222.o

Symbol table '.symtab' contains 7 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS RTC222.asm
     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1
     3: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT    1 data_1
     4: 0000000000000008     0 NOTYPE  LOCAL  DEFAULT    1 data_2
     5: 0000000000000010     0 NOTYPE  LOCAL  DEFAULT    1 str_var
     6: 0000000000000030     0 NOTYPE  LOCAL  DEFAULT    1 MQX_Dcc

Смещения символов находятся в столбце Значение.

Объявление 2: Нет. В соответствии с рекомендациями @fuz, поместите переменные памяти в раздел .data или .rodata, отсортированный по их требованию выравнивания в порядке убывания (последние строки) , Это сделает программу короче.

...