是什么原因使得esp作为32位操作系统上变量的参考而英特尔机器上64位操作系统上的rbp?

时间:2014-02-02 13:15:24

标签: x86 x86-64 32bit-64bit inline-assembly stack-pointer

以下程序在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是变量的参考。

1 个答案:

答案 0 :(得分:0)

我认为你不能依赖编译器如何引用或使用变量。除了针对不同体系结构的不同结果外,您可能还会通过不同的优化设置获得不同的结果。

如果您需要知道变量的位置,那么扩展的asm语法可能是一个更好的起点:http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html

你想要达到什么目的?