x86_64汇编%rsp vs%esp

时间:2015-07-18 01:04:00

标签: assembly x86-64 cpu-registers

我最近一直在玩装配,我在程序中遇到了一个奇怪的错误。我发现如果我通过64位数学修改error: no matching function for call to 'Animal::Animal(const char[5], int)' note: Animal::Animal(char, int) <near match> note: candidate expects 1 argument, 2 provided ,那么一切正常,但如果我修改%rsp相同的量,除了32位数学,我得到一个分段错误。我尝试打印%esp%esp,每次运行都是一样的。

问题:当整个寄存器只使用32位时,为什么要进行64位数学运算或32位数学运算呢?

%rsp

2 个答案:

答案 0 :(得分:3)

在x86_64中,地址是64位,那么你怎么能期望对它进行32位数学运算并且仍能正常工作?此外,x86_64上的大多数32位操作将前32位置零,使地址无效

答案 1 :(得分:1)

在与KerrekSB的对话的帮助下,出现差异的原因是打印错误。当我说我打印了RSP和ESP时,我在%d调用中使用_printf这样做,打印出一个4字节的值。当应用于RSP时,它只打印低4字节(相当于ESP),这使我相信RSP只在较低的4字节中有有意义的数据。当我更改它以打印%lu时,我发现RSP和ESP确实不等效,而RSP 使用高4字节。这就是32位数学导致分段错误的原因。