当程序启动时(linux,elf) - eax
,ebx
等中是否有零,或者可能有任何东西(我没有进行任何调用或使用外部库)?在我的机器上真的如此,我可以在编写asm程序时继续这种行为吗?
答案 0 :(得分:19)
这完全取决于每个平台的ABI。由于您提到eax
和ebx
,让我们看看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)
答案 2 :(得分:5)
x86-64 System V ABI 部分 3.4.1"初始堆栈和注册状态" (Basile linked to PDF):
%rsp
指向堆栈
堆栈指针保存具有最低地址的字节的地址 是堆栈的一部分。保证在进程条目时对齐16字节
%rdx
一个函数指针,如果应用程序非零,应该使用atexit注册。
应用程序应该注册的函数指针
%rbp
未指定,但用户名应将其设置为基本框架。
在进程初始化时未指定此寄存器的内容,但用户代码应通过将帧指针设置为零来标记最深的堆栈帧。
其他一切都未定义。
Linux然后关注它"因为" LSB这样说。