1

下面的程序在 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 位操作系统上,这两行打印了 6 次

在 32 位操作系统上无限次(直到它幸运地得到 0)打印两行,因为 eax 是对变量的引用。

4

1 回答 1

1

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

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

你想达到什么目的?

于 2014-02-03T13:13:29.403 回答