Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C&Nasm64组合-堆栈对齐、尾声、序言-OSX 64_C_Macos_Nasm - Fatal编程技术网

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