当前位置: 首页 > 面试题库 >

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

洪研
2023-03-14
问题内容

程序启动时(Linux,elf)-
,等是否为零eaxebx或者可以有任何内容(我没有进行任何调用或使用外部库)?在我的机器上确实是这样,编写asm程序时我可以继续这种行为吗?


问题答案:

这完全取决于每个平台的ABI。既然您提到了eaxebx让我们看看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上时,您可以指望所有等于零的寄存器值。不过,这并不意味着您应该这样做。:-)

动态链接

请注意,执行 动态 链接的二进制文件实际上会在执行到达您的_start(ELF入口点)之前在您的进程中运行动态链接程序代码。
这可以并且确实在ABI的允许下在寄存器中留下垃圾。 当然,除了堆栈指针ESP / RSP和atexit挂钩EDX / RDX。



 类似资料:
  • 问题内容: 我目前正在使用Linux上的ARM汇编作为学习练习。我正在使用“裸”程序集,即没有libcrt或libgcc。任何人都可以向我指出有关在调用第一条指令之前在程序开始时堆栈指针和其他寄存器处于什么状态的信息吗?显然,pc / r15指向_start,其余似乎已初始化为0,只有两个例外:sp / r13指向我程序之外的地址,而r1指向稍高的地址。 因此,提出了一些可靠的问题: r1中的值是

  • 11.2.2 状态寄存器 状态寄存器是用来标识协处理器中指令执行情况的,它相当于CPU中的标志位寄存器。80x87协处理器的状态寄存器如图11.5所示。 15 13 12 11 8 7 0 B C3 TOP C2 C1 C0 ES SF PE UE OE ZE DE IE 图11.5 80x87协处理器的状态寄存器示意图 状态寄存器各标志位(或组合位)的含义如下: ◆B(Busy,忙) 忙标志位用

  • 对于协处理器中状态寄存器的内容,程序员可用指令FSTSW把其值送到内存单元中。如果当前使用的是80287及其以后的协处理器,那么,可用指令“FSTSW AX”把该状态寄存器的值传送给通用寄存器AX。一旦状态寄存器的值复制到内存或AX中,那么,就可对其各位进行分析,并可检测出当前协处理器的工作状态。 对于80287协处理器,它还可通过I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而

  • 3.2获得 CPU 寄存器状态 一个调试器必须能够在任何时候都搜集到 CPU 的各个寄存器的状态。当异常发生的时 候这能让我们确定栈的状态,目前正在执行的指令是什么,以及其他一些非常有用的信息。 要实现这个目的,首先要获取被调试目标内部的线程句柄,这个功能由 OpenThread()实现. 函数原型如下: HANDLE WINAPI OpenThread( DWORD dwDesired

  • 问题内容: 我正在Ubuntu中编写一个PyGTK GUI应用程序以浏览一些图像,并且双击该图像时(例如在Nautilus中打开该图像时),我想在默认图像查看器应用程序中打开该图像。 我该怎么做? 问题答案: 我不知道具体使用PyGTK,但是:打开了文件的默认应用程序,因此运行类似的命令应该可以: 编辑: 我建议使用该模块,如注释中。我还不确定确切如何使用它,因此我仅在示例中进行了展示。

  • 目前在 window 系统下使用了 wsl2,使用了默认的发行版 Ubuntu。然后安装了 docker desktop,并集成了 Ubuntu。然后在 Ubuntu 中启用了多个容器实例,这个时候发现 C 盘的磁盘容量几乎没有了。 请问一下像发行版 Ubuntu 系统中的内容是保存在什么地方,还有对于容器使用的镜像和容器实例内使用的资源是保存到什么地方?