我写了一个汇编程序,需要在x86-64上的5个GPR工作正常。但我试图将其移植到32位x86。编译器抱怨不可能使用5个GPR。x86汇编技巧,以获得更多的GPR
代码的x86-64低于:
__asm__("mov %0,%%r8\n\t"
"mov %1,%%r10\n\t"
"lfence\n\t"
"rdtsc\n\t"
"mov %%eax,%%edi\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"mov (%%r8), %%r8\n\t"
"lfence\n\t"
"rdtsc\n\t"
"sub %%edi, %%eax\n\t"
"mov %%eax, (%%r10)\n\t"
:
:"r"(head),"r"(time_buf)
:"eax","edx","edi","r8","r10"
);
我怎样才能解决这个问题?
处理器:英特尔®酷睿™2双核处理器T9400
如果你已经用完了寄存器,就没办法。你需要将一些值泄漏到内存中。另一种方法是泄漏到SSE/AVX寄存器,但我认为除非您尝试对代码进行矢量化,否则性能不会更好。您可以使用'-fomit-frame-pointer'在32位模式下获得最多7个GPR。 –
你可以将'%ebx','%ebp'和''end'弹出来,在asm语句本身中。当然,编译器在此情况下不会意识到它们的使用。但给出的答案可能是你真正想要的。就目前而言,你的代码是不正确的 - 你不知道你的clobbered寄存器是别名'%0'还是'%1'。 –