Noa*_*mid 6 c x86 assembly gcc cpu-registers
我需要将指针插入eax,将一个指针插入ebx寄存器.我首先解决了这个问题:
register int eax asm("eax");
register int ebx asm("ebx");
int main()
{
eax = ptr1;
ebx = ptr2;
}
Run Code Online (Sandbox Code Playgroud)
这就像一个魅力.但是,当我将其添加到我的其他代码中时,我得到了一些奇怪的错误,关于gcc无法在类AREG中找到一个寄存器溢出,完全不相关的代码部分.我用Google搜索,结果实际上是gcc -.-中的一个错误.因此,我需要另一种方法,将两个指针推入eax和ebx寄存器.任何想法?谢谢!
编辑,因为人们一直在问我想在这里完成什么,我想我会解释一下.
我需要更改一些汇编代码的eax和ebx,我试图在我的程序中运行.我需要执行这个汇编代码,并通过eax和ebx寄存器给出一个指向参数的指针.我通过在ebx中推送指针来执行汇编代码并调用ebx.When我不会将寄存器称为全局,但是在本地,汇编代码崩溃了.如果我全局调用它,我会在随机函数结束时得到这个奇怪的错误.当我删除该功能时,它会在另一个随机函数中抛出相同的错误.直到我用完了函数,然后它才有效,但后来我想念剩下的代码:P
如果您有(内联)汇编代码需要EAX/中的特定参数EBX,那么在gcc中执行此操作的方法是使用以下内容:
__asm__("transmogrify %0, %1\n" : "+a"(val_for_eax), "+b"(val_for_ebx));
Run Code Online (Sandbox Code Playgroud)
这使用了gcc调用的内联汇编约束,它告诉编译器汇编代码 - 无论它是什么 - 期望val_for_eax/ val_for_ebxin EAX/ EBX(这是a/ bpart)以及它将返回这些变量的可能修改版本(就是+这些)注册也是如此.
除此之外,asm()语句中的实际代码对编译器无关紧要 - 它只需要/想要知道参数%0和%1活动的位置.由于transmogrify当前x86指令集中不存在的指令,上面的示例将在汇编程序运行时失败; 只需用有效的东西代替它.
解释为什么gcc以这种方式表现,以及你可以告诉它做的正是在GCC手册中,在:
asm操作数的约束,特别是机器特定约束列表的英特尔/ 386部分,如果需要在特定寄存器中传递/检索值,可以说什么,以及修饰符部分关于+(两者的)含义传递并返回一个值;约束中还有其他这样的"修饰符")你可以为变量指定一个特定的寄存器,但是由于gcc的工作方式/在gcc中实现内联汇编的方式,这样做并不意味着(!)寄存器从那时起保留(超出范围)以供gcc使用为了自己的目的.这只能通过约束来实现,对于特定的单个asm()块 - 约束告诉gcc 在放置实际汇编代码之前写入这些寄存器的内容,以及之后从中读取的内容.