Что такое состояние регистрации по умолчанию при запуске программы (asm, linux)?

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

Ответ 1

Это полностью зависит от 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, вы можете рассчитывать на то, что все значения регистра равны нулю. Но это не значит, что вы должны.: -)

Ответ 2

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

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

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

Ответ 3

x86-64 System V ABI раздел 3.4.1 "Начальное состояние стека и регистрации" (Basile, связанный с PDF):

  • %rsp указывает на стек

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

  • %rdx указатель функции, который приложение должно регистрировать с помощью atexit, если оно отличное от нуля.

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

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

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

  • Все остальное undefined.

Затем Linux следует за ним, потому что LSB говорит так.