[英]GCC inline assembler using memory references
我正在嘗試編寫內聯匯編指令,該指令將通過使用指向該變量的指針而不是直接引用的方式將變量與寄存器的內容一起加載。
使用直接引用的代碼可以正常工作,如下所示:
int x;
int *y = &x;
int z = 1;
__asm__ __volatile__ ("mov %%edx, %0;"::"r"(z):);
__asm__ __volatile__ ("mov %0, %%edx;":"=r" (x)::);
printf("\n%x\n", x);
分歧:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: sub $0x10,%rsp
0x0000000000400535 <+8>: lea -0x10(%rbp),%rax
0x0000000000400539 <+12>: mov %rax,-0x8(%rbp)
0x000000000040053d <+16>: movl $0x1,-0xc(%rbp)
0x0000000000400544 <+23>: mov -0xc(%rbp),%eax
0x0000000000400547 <+26>: mov %edx,%eax
0x0000000000400549 <+28>: mov %eax,%edx
0x000000000040054b <+30>: mov %eax,-0x10(%rbp)
0x000000000040054e <+33>: mov -0x10(%rbp),%eax
0x0000000000400551 <+36>: mov %eax,%esi
0x0000000000400553 <+38>: mov $0x4005f4,%edi
0x0000000000400558 <+43>: mov $0x0,%eax
0x000000000040055d <+48>: callq 0x400410 <printf@plt>
0x0000000000400562 <+53>: mov $0x0,%eax
0x0000000000400567 <+58>: leaveq
0x0000000000400568 <+59>: retq
並按預期輸出1
指針版本如下所示:
int x;
int *y = &x;
int z = 1;
__asm__ __volatile__ ("mov %%edx, %0;"::"r"(z):);
__asm__ __volatile__ ("mov (%0), %%edx;":"+r" (y)::);
//or
__asm__ __volatile__ ("mov %[mem], %%edx":[mem] "=m" (y)::);
printf("\n%x\n", x);
分歧:
0x000000000040052d <+0>: push %rbp
0x000000000040052e <+1>: mov %rsp,%rbp
0x0000000000400531 <+4>: sub $0x10,%rsp
0x0000000000400535 <+8>: lea -0x10(%rbp),%rax
0x0000000000400539 <+12>: mov %rax,-0x8(%rbp)
0x000000000040053d <+16>: movl $0x1,-0xc(%rbp)
0x0000000000400544 <+23>: mov -0xc(%rbp),%eax
0x0000000000400547 <+26>: mov %edx,%eax
0x0000000000400549 <+28>: mov -0x8(%rbp),%edx
0x000000000040054c <+31>: mov -0x10(%rbp),%eax
0x000000000040054f <+34>: mov %eax,%esi
0x0000000000400551 <+36>: mov $0x4005f4,%edi
0x0000000000400556 <+41>: mov $0x0,%eax
0x000000000040055b <+46>: callq 0x400410 <printf@plt>
0x0000000000400560 <+51>: mov $0x0,%eax
0x0000000000400565 <+56>: leaveq
0x0000000000400566 <+57>: retq
每次都會打印一個不確定的整數(即bb524b90 15979050)。 在gdb中運行時,每次都會打印相同的整數(ffffe2f0),該整數不會根據z的值而變化。 有誰知道是什么原因造成的?
我從reg獲得輸出,而不是輸入,請注意參數位置為
"mov %0, %%edx;":"=r" (x)::
您對輸入/輸出術語感到困惑。
輸出操作數是從輸出asm
語句 , 到由編譯器(對於所選擇的寄存器"=r"
的情況下)。
當您使用"=m"
,編譯器會將%0
設為內存操作數。
或者,如果您使用"=a"
,則%0
將為%eax
,並且編譯器將假定C變量x
值現在位於%eax
。
在AT&T語法中,目標操作數是最后一個操作數。 我認為您確實知道這一點,但我認為您的輸入/輸出是倒退的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.