0
// gcc -g stack.c -o stack  
//  
unsigned long sp(void){ __asm__("mov %esp, %eax");}  
int main(int argc, char **argv)  
{  
    unsigned long esp = sp();  
    printf("Stack pointer (ESP : 0x%lx)\n",esp);  
    return 0;  
}

请检查上面的代码。事实上,我猜 sp() 将通过 esp->eax 返回 esp 寄存器值。但为什么?sp()的默认返回值是eax? 谁能告诉我更多关于它的信息?谢谢!

4

3 回答 3

5

处理器架构组织参数、调用和返回(以及对内核的系统调用)的方式,即调用约定,在 ABI(应用程序二进制接口)中进行了详细说明。对于 x86-64 上的 Linux,您应该阅读x86-64 ABI文档。是的,返回 a 的函数的返回值long%eaxx86-64 上的。(还有X32 ABI

请注意,它主要是传统的,但如果约定发生变化,您将需要更改编译器,可能是链接器、内核和所有库。%esp实际上,处理器制造商在设计芯片时要考虑到现有的 ABI(例如寄存器、指令的重要性SYSENTER……),这一点非常重要。

于 2012-10-06T16:33:00.443 回答
2

这是规矩!

GCC 用于 32 位汇编的调用约定是整数返回函数的返回值是%eax. GCC 也将其用于内联汇编功能。

有关所有详细信息,请参阅维基百科

于 2012-10-06T16:33:15.263 回答
-1

IIRC 正确的命令应该是“mov eax,esp”而不是“mov esp,eax”。

unsigned long sp(void){ __asm__("mov %eax, %esp");} 
于 2012-10-06T16:54:05.777 回答