Каково состояние регистра по умолчанию при запуске программы (asm, linux)? - PullRequest
14 голосов
/ 05 февраля 2012

Когда программа запускается (linux, elf) - есть ли нули в eax, ebx и т. Д., Или может быть что-нибудь (я не делаю никаких звонков или не использую внешние библиотеки)? На моей машине это действительно так, могу ли я передать такое поведение при написании программ asm?

Ответы [ 3 ]

19 голосов
/ 05 февраля 2012

Это полностью зависит от ABI для каждой платформы.Поскольку вы упоминаете eax и ebx, давайте посмотрим, что происходит с x86.В fs/binfmt_elf.c строке # 972 внутри load_elf_binary() ядро ​​проверяет, определяет ли ABI какие-либо требования для значений регистра при загрузке программы:

/*
 * The ABI may specify that certain registers be set up in special
 * ways (on i386 %edx is the address of a DT_FINI function, for
 * example.  In addition, it may also specify (eg, PowerPC64 ELF)
 * that the e_entry field is the address of the function descriptor
 * for the startup routine, rather than the address of the startup
 * routine itself.  This macro performs whatever initialization to
 * the regs structure is required as well as any relocations to the
 * function descriptor entries when executing dynamically links apps.
 */

Затем оно вызывает ELF_PLAT_INIT, который является макросом, определенным для каждой архитектуры в arch/xxx/include/elf.h.Для x86 он выполняет после :

#define ELF_PLAT_INIT(_r, load_addr)        \
    do {                                    \
        _r->bx = 0; _r->cx = 0; _r->dx = 0; \
        _r->si = 0; _r->di = 0; _r->bp = 0; \
        _r->ax = 0;                         \
    } while (0)

Таким образом, когда ваш двоичный файл ELF загружается в Linux x86, вы можете рассчитывать, что все значения регистров равны нулю.Это не значит, что ты должен.: -)

10 голосов
/ 05 февраля 2012

Для систем AMD64 или x86-64 (64 бита) в Linux x86-64 ABI определяет начальное содержимое регистров.

Существуют аналогичные спецификации для i386 ABI , ARM ABI и т. Д.

См. Страницы википедии на ELF и ABI

5 голосов

x86-64 Система V ABI секция 3.4.1 «Начальное состояние стека и регистра» ( Базилик связан с PDF ):

  1. %rsp указывает на стэк

    Указатель стека содержит адрес байта с наименьшим адресом, который является частью стека. Он гарантированно выровнен по 16 байтам при входе в процесс

  2. %rdx указатель на функцию, которую приложение должно зарегистрировать в atexit, если оно не равно нулю.

    указатель на функцию, которую приложение должно зарегистрировать в

  3. %rbp не определено, но пользовательская область должна установить его в базовый кадр.

    Содержимое этого регистра не определено во время инициализации процесса, но пользовательский код должен пометить самый глубокий кадр стека, установив указатель кадра в ноль.

  4. Все остальное не определено.

Linux затем следует «потому что» LSB говорит об этом.

...