assembly - 在程序中使用它们之前的汇编寄存器中有什么?
问题描述
初始化之前的汇编寄存器中有什么?如果我正在使用 AND、OR、XOR 之类的逻辑操作数,并且仅像这样使用它:and al,00000000b
或者and al,11111110
AL 寄存器中的值是什么?
解决方案
除非您的代码是机器在开机后运行的第一条指令(即 ROM 或闪存中的固件),否则它将被其他一些代码调用,这些代码在寄存器中留下了一些东西。
在某些情况下(例如操作系统启动一个新进程),它可能会选择在切换到用户空间之前将所有寄存器归零,以避免泄漏任何可能留在寄存器中的内核信息。(例如,Linux 在 execve 上执行此操作)。
寄存器就像全局变量,但真正跨进程全局。他们总是有一些价值。在大多数情况下,你不能假设任何事情。 and al, 1
可能产生 0 或 1,你不知道;这取决于代码运行之前在 EAX / RAX 的低位中留下了什么“随机”垃圾。它通常不是真正随机的,但也可能是因为没有规则来管理允许存在的内容。例如,它可能是一些其他代码用于某事的地址,或者它正在复制的一些数据。
考虑您的程序将寄存器留在什么状态可能很有用。 例如,当您的程序退出到操作系统时。或者对于返回的函数,调用破坏(易失性)寄存器中的值是什么:除了 EAX 中的返回值(如果您返回 32 位整数或指针),您可以在 ECX 中保留任何您想要的内容和EDX。
对于您要返回的代码,未保留调用的 reg 的寄存器状态与函数顶部的情况基本相同:它不能假设任何内容,因为其他代码可能会留下任何内容。
推荐阅读
- arrays - Keycloak 客户端角色属性数组
- reactjs - apollo usequery 导致未定义的错误
- google-chrome - 使用 AudioWorklet 问题录制麦克风音频:数据在录音之间溢出(仅限 Chrome)
- html - 由 Gutter 创建的具有间隙的 Flex Box 未按预期工作
- python - 如何通过 Django 中的用户模型引用模型?
- android - 当我打开应用程序 / kotlin 时,已经过了时间的闹钟再次响起
- php - Laravel MongoDB - 原始请求不返回任何结果
- android-jetpack-compose - 有没有办法在 Jetpack Compose Navigation 中使用斜杠(“/”)传递字符串参数?
- authentication - 我的 python 发布请求在我的登录机器人中不起作用
- colors - 使用单一颜色的条形图