首页 > 解决方案 > 在程序中使用它们之前的汇编寄存器中有什么?

问题描述

初始化之前的汇编寄存器中有什么?如果我正在使用 AND、OR、XOR 之类的逻辑操作数,并且仅像这样使用它:and al,00000000b或者and al,11111110AL 寄存器中的值是什么?

标签: assemblycpu-registers

解决方案


除非您的代码是机器在开机后运行的第一条指令(即 ROM 或闪存中的固件),否则它将被其他一些代码调用,这些代码在寄存器中留下了一些东西。

在某些情况下(例如操作系统启动一个新进程),它可能会选择在切换到用户空间之前将所有寄存器归零,以避免泄漏任何可能留在寄存器中的内核信息。(例如,Linux 在 execve 上执行此操作)。

寄存器就像全局变量,但真正跨进程全局。他们总是有一些价值。在大多数情况下,你不能假设任何事情。 and al, 1可能产生 0 或 1,你不知道;这取决于代码运行之前在 EAX / RAX 的低位中留下了什么“随机”垃圾。它通常不是真正随机的,但也可能是因为没有规则来管理允许存在的内容。例如,它可能是一些其他代码用于某事的地址,或者它正在复制的一些数据。

考虑您的程序将寄存器在什么状态可能很有用。 例如,当您的程序退出到操作系统时。或者对于返回的函数,调用破坏(易失性)寄存器中的值是什么:除了 EAX 中的返回值(如果您返回 32 位整数或指针),您可以在 ECX 中保留任何您想要的内容和EDX。

对于您要返回的代码,未保留调用的 reg 的寄存器状态与函数顶部的情况基本相同:它不能假设任何内容,因为其他代码可能会留下任何内容。


推荐阅读