以下程序在32位和64位机器上提供不同的输出。当我检查编译器生成的汇编代码时,我发现32位机器上的变量引用是esp,而在64位操作系统上它是rbp。
在我看来,ebp必须是变量的引用,因为它在一个函数中保持不变。
是否有任何特定原因不使用ebp作为变量的参考?
#include "stdio.h"
void main()
{
int i=5;
while(i)
{
printf("Hello world..\t");
asm("push %rax"); // for 64bit OS
//asm("push %eax"); // for 32bit OS
printf("Have a nice day..\n");
i--;
asm("pop %rax"); // for 64bit OS
//asm("pop %eax"); // for 32bit OS
}
}
<64>在64位操作系统上
这两行都打印了6次
<32>在32位操作系统上
无限期(直到它幸运地得到0)两行的打印,因为eax是变量的参考。
答案 0 :(得分:0)
我认为你不能依赖编译器如何引用或使用变量。除了针对不同体系结构的不同结果外,您可能还会通过不同的优化设置获得不同的结果。
如果您需要知道变量的位置,那么扩展的asm语法可能是一个更好的起点:http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
你想要达到什么目的?