我正在尝试将该汇编函数与该 C++ 代码链接起来:
.text
.global _Z7scambiaRiS_
_Z7scambiaRiS_:
pushq %rbp
mov %rsp, %rbp
mov (%rdi), %rax
mov (%rsi), %rcx
mov %rcx, (%rdi)
mov %rax, (%rsi)
leave
ret
.data
#include <iostream>
void extern scambia(int &a, int &b);
int main()
{
int a, b;
std::cin>>a>>b;
std::cout<<"a: "<<a<<" b: "<<b<<"\n";
scambia(a, b);
std::cout<<"a: "<<a<<" b: "<<b<<"\n";
return 0;
};
汇编是英特尔 x86-64 版本。
程序运行,但随后因段错误而停止,这里是输出,作为输入3 4
:
3 4
a: 3 b: 4
a: 4 b: 3
*** stack smashing detected ***: terminated
Aborted (core dumped)
我真的不明白我是如何设法破坏堆栈的,即使使用 gdb 进行调试,我也无法找出问题所在
scambia
被声明为引用int
,在此平台上为 4 个字节。然而正在执行 8 字节加载和存储,因为
rax
和rcx
是 64 位寄存器。因此它们每个都写入int
您传入的 之外的 4 个字节,这意味着其他堆栈空间被覆盖,从而触发堆栈破坏检测器。要按原样使用汇编函数,应在 C++ 中将其声明为引用
int64_t
或某些其他 64 位类型,并相应调整类型a,b
。(long int
在许多 x86-64 平台上是 64 位,但不是全部)。为了保持声明为交换两个
int
,请将汇编代码更改为使用 32 位寄存器来存储移入和移出内存的数据:请注意
rdi
和rsi
应该保持原样,因为它们是指针,是 64 位的。