我最近一直在玩装配,我在程序中遇到了一个奇怪的错误。我发现如果我通过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
答案 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位数学导致分段错误的原因。