我需要将一个指针压入 eax 并将另一个压入 ebx 寄存器。我首先解决了这个问题:
register int eax asm("eax");
register int ebx asm("ebx");
int main()
{
eax = ptr1;
ebx = ptr2;
}
这就像一个魅力。然而,当我将它添加到我的其他代码中时,我得到了一些奇怪的错误,关于 gcc 无法在类 AREG 中找到溢出的寄存器,在代码的完全不相关的部分。我用谷歌搜索了一下,结果发现实际上是 gcc -.- 中的一个错误。所以,我需要另一种方法,将两个指针压入 eax 和 ebx 寄存器。有人有什么想法吗?
编辑:
由于人们一直在问我要在这里完成什么,所以我想我要解释一下。
我需要为我试图在我的程序中运行的一些汇编代码更改 eax 和 ebx。我需要执行这段汇编代码,并通过 eax 和 ebx 寄存器提供指向参数的指针。我通过在 ebx 中推送指向它的指针来执行汇编代码,然后调用 ebx。当我不在全局范围内而是在本地调用寄存器内容时,汇编代码会崩溃。如果我全局调用它,我会在随机函数结束时得到这个奇怪的错误。当我删除该函数时,它会在另一个随机函数中抛出相同的错误。直到我用完函数,然后它才能工作,但后来我错过了其余的代码:P
最佳答案
如果您的(内联)汇编代码需要 EAX
/EBX
中的特定参数,则在 gcc 中执行此操作的方法是使用以下内容:
__asm__("transmogrify %0, %1\n" : "+a"(val_for_eax), "+b"(val_for_ebx));
这使用了 gcc 调用的内联汇编 constraints 告诉编译器汇编代码 - 无论它是什么 - 期望 val_for_eax
/val_for_ebx
在EAX
/EBX
(即 a
/b
部分)以及它将返回可能修改的版本这些寄存器中的这些变量(即 +
)也是如此。
除此之外,asm()
语句中的实际代码对编译器来说并不重要——它只需要/想知道参数 %0
和 %1
直播。由于当前 x86 指令集中不存在 transmogrify
指令,上述示例将在汇编器运行时失败;只需将其替换为有效的内容即可。
GCC 为何以这种方式运行以及您可以告诉它做什么的解释在 GCC 手册中,位于:
- Extended Assembly - Assembler Instructions with C operands
- Constraints for
asm
operands ,特别是 Machine-specific Constraints list 的 Intel/386 部分如果您需要在特定寄存器中传递/检索值,以及 Modifiers 时该说些什么关于诸如+
之类的东西的含义的部分(传递和返回一个值;约束还有其他这样的“修饰符”)
您可以为变量指定一个特定的寄存器,但是由于 gcc 的工作方式/内联汇编在 gcc 中的实现方式,这样做并不意味着(!)寄存器从那时起保留(超出范围)供 gcc 用于其自身目的。这只能通过约束来实现,对于特定的单个 asm()
block - 约束告诉 gcc 在放置实际汇编代码之前将什么写入这些寄存器,以及之后从他们那里读到什么。
关于c - 将指针插入 GCC 中的 eax 和 ebx 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751246/