Константа (.equ) в ассемблере

Скажем, я определяю константу, например следующую, на ассемблере:

.data
SYS_EXIT = 60

.text
.globl _start
_start:
    mov $SYS_EXIT,  %eax
   syscall

Выполняет ли ассемблер буквально эквивалент «найти-заменить» во время выполнения, чтобы заменить значение SYS_EXIT на 60? Другими словами, после подстановки программа становится следующей?

.text
.globl _start
_start:
    mov $60,  %eax
   syscall

Если да, имеет ли значение, «где» я определяю переменную SYS_EXIT? Например, нужно ли его помещать в определенный раздел, а если нет, то каково соглашение о том, куда его помещать? Например:

.data
SYS_EXIT = 60

------------------------

.rodata
SYS_EXIT = 60

------------------------

(start of file)
SYS_EXIT = 60

Наконец (возможно, отдельный вопрос), есть ли способ просмотреть все константы в gdb? Я могу просмотреть вручную, зная метку, но не делая что-то вроде info va:

>>> info va
All defined variables: [empty]
>>> p/d &SYS_EXIT
$1 = 60

person David542    schedule 16.09.2020    source источник


Ответы (1)


Это подстановка числового значения, а не подстановка текста, но в основном да.

re: порядок определения, см. Отличие памяти от константы в GNU как .intel_syntax - с $SYS_EXIT в синтаксисе AT&T нет двусмысленности, даже если константа определяется позже. С .intel_syntax может иметь значение, определена ли константа до или после инструкции, которая ее использует.

(Они не похожи на макросы препроцессора C, они больше похожи на метки; вы можете ссылаться на более поздние определения из более раннего кода, как обычно для ассемблера.)

И нет, константы времени сборки не имеют раздела. Переключение на раздел только для использования директивы foo = number вводит в заблуждение, не делайте этого.


Значения, определенные с помощью =, появляются в таблице символов объектных файлов, как и другие символы. (Вот почему вы можете увидеть это с помощью GDB или nm). Если вы используете .globl, они будут видны для использования в других файлах, как и адреса меток.

Я не уверен, что это полезно для чего-либо; вероятно, лучше всего .include создать файл определений для констант, если вы хотите использовать их в разных файлах, а не позволять компоновщику заполнять их.

Я не знаю, почему va GDB их не показывал; вероятно, потому что у них нет .type, помечающих их как переменные.

person Peter Cordes    schedule 16.09.2020
comment
Технически они находятся в абсолютном разрезе. То есть их нет ни в одном разделе. - person fuz; 16.09.2020