gpt4 book ai didi

似乎无法将 %ES 添加到 clobberlist(内联汇编、GCC)

转载 作者:行者123 更新时间:2023-12-02 09:37:06 25 4
gpt4 key购买 nike

我正在阅读 Micheal Abrash 的图形编程黑皮书(顺便说一句,我真的很喜欢,我强烈推荐它),所以我正在使用的示例代码相当旧。尽管如此,我不明白问题是什么:

__asm__(
//Some setup code here
"movl %%esi, %%edi;"
"movw %%ds, %%es;"
//A whole bunch more assembly code in between
"divloop:"
"lodsw;"
"divl %%ebx;"
"stosw;"
"loop divloop;"
//And a little more code here
: "=r" (ret)
: "0" (ret) /*Have to do this for some reason*/, "b" (div), "c" (l), "S" (p)
: "%edi", "%es"
);
  • l 变量是一个 unsigned int,p 变量是一个 char*。 lp 指向的字符串长度的字节计数。 div是除数,是一个无符号整数。 ret 是返回值(unsigned int) 的函数并设置在汇编 block 内部是除法的余数。

我收到的错误消息是“错误:‘asm’中未知的寄存器名称‘%es’”(这是唯一的错误消息)。我最好的猜测是它在 GAS 语法中有另一个名称。我知道我正在使用旧代码,但据我所知,在我相当新的 intel i3 上仍然有一个由 stos* 使用的 ES 寄存器

其次,有一个问题一直困扰着我。我基本上别无选择,只能假设 DS 已经设置到正确的内存位置以与 lods* 一起使用。由于我正在读取、修改和写入同一内​​存位置(使用 stos* 和 lods*),因此我将 ES 设置为等于 DS。然而,让我感到害怕的是我的 DS 可以是任何东西,而且我不知道还能将其设置为什么。更重要的是,ESI 和 EDI 已经是 32 位寄存器,它们本身应该足以访问内存。

根据我的经验,两个奇怪的问题通常是相关的,并且是由一个更根本的问题(通常是 PEBKAC)引起的。然而,我现在很困惑。有谁知道这是怎么回事吗?

非常感谢

附注我正在尝试重新创建第 9 章(读者给我的提示, list 9.5,第 182 页)中的代码,该代码将存储在连续内存中的大量数字除以 EBX。除了我个人的成长和娱乐之外,没有其他原因这样做。

最佳答案

如果您在平面 32 位保护模式环境中运行(例如 Linux 或 Windows 用户模式进程),则无需设置 es。

段寄存器是由操作系统为您设置的,es 和 ds 都允许您访问平面 32 位地址空间。

GCC 不会生成保存/恢复段寄存器的代码,因此它不允许您将它们添加到破坏列表中也就不足为奇了。

关于似乎无法将 %ES 添加到 clobberlist(内联汇编、GCC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24578722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com