c - 将指针插入 GCC 中的 eax 和 ebx 寄存器

标签 c gcc assembly x86 cpu-registers

我需要将一个指针压入 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_ebxEAX/EBX(即 a/b 部分)以及它将返回可能修改的版本这些寄存器中的这些变量(即 +)也是如此。

除此之外,asm() 语句中的实际代码对编译器来说并不重要——它只需要/想知道参数 %0%1 直播。由于当前 x86 指令集中不存在 transmogrify 指令,上述示例将在汇编器运行时失败;只需将其替换为有效的内容即可。

GCC 为何以这种方式运行以及您可以告诉它做什么的解释在 GCC 手册中,位于:

您可以为变量指定一个特定的寄存器,但是由于 gcc 的工作方式/内联汇编在 gcc 中的实现方式,这样做并不意味着(!)寄存器从那时起保留(超出范围)供 gcc 用于其自身目的。这只能通过约束来实现,对于特定的单个 asm() block - 约束告诉 gcc 在放置实际汇编代码之前将什么写入这些寄存器,以及之后从他们那里读到什么。

关于c - 将指针插入 GCC 中的 eax 和 ebx 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16751246/

相关文章:

c - 为什么 fork() 之前的 printf() 甚至在 fork() 之后执行?

c - 为什么 size_t 更好?

c - 为什么 NdisFRegisterFilterDriver 在 Windows 8 下失败并出现 NDIS_STATUS_FAILURE?

c - 从 AVR 的 UART 接收 char *

c++ - C 到 C++ 表内联定义

ubuntu - 在 HPI 上运行 LLVM 测试套件显示找不到脚本错误,如何解决?

xcode - 如果不是这个 CFString 废话,我可以让 GCC 4.6.2 在 Xcode 4.2 中工作

algorithm - 是什么导致此代码输出多行(mips 汇编)?

assembly -/4在FF/4中是什么意思?

linux - 为什么这个 int $0x10 BIOS INT 在 Linux 上不工作?