C&Nasm64组合-堆栈对齐、尾声、序言-OSX 64
以下程序导致分段错误,我似乎不明白原因:C&Nasm64组合-堆栈对齐、尾声、序言-OSX 64,c,macos,nasm,C,Macos,Nasm,以下程序导致分段错误,我似乎不明白原因: //something.c int somefunc3(); void somefunc2(); void* globalptr; void somefunc1(void* regs) { globalptr = regs; somefunc2(); } int foo() { return somefunc3(); } int main(void) { show_all_registers();
//something.c
int somefunc3();
void somefunc2();
void* globalptr;
void somefunc1(void* regs)
{
globalptr = regs;
somefunc2();
}
int foo()
{
return somefunc3();
}
int main(void)
{
show_all_registers();
foo();
show_all_registers();
}
asm:
几点注意:
请不要试图理解此程序的功能,因为您将找不到任何有意义的内容。这只是一个用户模式的应用程序,我创建它是为了了解一些东西
show_all_寄存器只是一个将所有64位寄存器打印到屏幕上的函数
以下是崩溃前发生的情况:
64 Bit registers:
RAX=10767ad00, RCX=1, RDX=10767ab70, RBX=0, RSP=7fff58585bd0, RBP=7fff58585bd0, RSI=20000000200, RDI=7
Segmentation fault: 11
使用GDB恢复寄存器时,somefunc2上似乎发生了崩溃
我认为这与堆栈对齐或我为ASM函数编写的尾声有关。还是有点新手,所以这很可能是一些愚蠢的事情
谢谢您的函数结尾不正确。您缺少mov rsp、rbp,因此堆栈帧在返回时完全关闭 适当的职能是:
push rbp
mov rbp, rsp
sub rsp, [size of local variables]
...
mov rsp, rbp
pop rbp
ret
或者,您可以使用请假说明简化:
push rbp
mov rbp, rsp
sub rsp, [size of local variables]
...
leave
ret
如果您使用的是GDB,那么您应该能够准确地找出问题所在。GDB显示哪个特定指令是SIGSEGV的源?somefunc2的返回操作。它应该返回的地址似乎无效或位置不正确
push rbp
mov rbp, rsp
sub rsp, [size of local variables]
...
leave
ret