程序启动时的默认寄存器状态是什么(asm,linux)?

时间:2012-02-05 06:45:16

标签: linux assembly elf cpu-registers

当程序启动时(linux,elf) - eaxebx等中是否有零,或者可能有任何东西(我没有进行任何调用或使用外部库)?在我的机器上真的如此,我可以在编写asm程序时继续这种行为吗?

3 个答案:

答案 0 :(得分:19)

这完全取决于每个平台的ABI。由于您提到eaxebx,让我们看看x86的情况。在fs/binfmt_elf.c行#972内,load_elf_binary()内,内核检查ABI是否在程序加载时为寄存器值指定任何requirements

/*
 * 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,它执行following

#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)

因此,当您在Linux x86上加载ELF二进制文件时,您可以指望所有寄存器值等于零。但这并不意味着你应该这样做。 : - )

答案 1 :(得分:9)

对于Linux上的AMD64或x86-64系统(64位),x86-64 ABI定义了寄存器的初始内容。

i386 ABIARM ABI等有类似的规范。

请参阅ELFABI

上的维基百科页面

答案 2 :(得分:5)

x86-64 System V ABI 部分 3.4.1"初始堆栈和注册状态" Basile linked to PDF):

  1. %rsp指向堆栈

      

    堆栈指针保存具有最低地址的字节的地址   是堆栈的一部分。保证在进程条目时对齐16字节

  2. %rdx一个函数指针,如果应用程序非零,应该使用atexit注册。

      

    应用程序应该注册的函数指针

  3. %rbp未指定,但用户名应将其设置为基本框架。

      

    在进程初始化时未指定此寄存器的内容,但用户代码应通过将帧指针设置为零来标记最深的堆栈帧。

  4. 其他一切都未定义。

  5. Linux然后关注它"因为" LSB这样说。