gpt4 book ai didi

C 和 Nasm64 组合 - 堆栈对齐、尾声、序言 - OSX 64

转载 作者:行者123 更新时间:2023-11-30 17:27:39 25 4
gpt4 key购买 nike

以下程序导致段错误,我似乎不明白为什么:

//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();
}

汇编:

//something1.asm

extern _somefunc1

global _somefunc2
global _somefunc3

section .text


%macro RESTORE_REGISTERS 0
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
pop rcx
%endmacro

%macro SAVE_REGISTERS 0
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
push rcx
%endmacro

_somefunc3:
push rbp
mov rbp, rsp
SAVE_REGISTERS
mov rdi, rsp

sub rsp,8
call _somefunc1
add rsp,8

pop rbp
ret

_somefunc2:
push rbp
mov rbp, rsp
RESTORE_REGISTERS
pop rbp
ret

一些注意事项:

  • 请不要试图理解这个程序的作用,因为你不会找到任何有意义的东西。这只是我为了理解某些内容而创建的用户模式应用程序。

  • show_all_registers 只是一个将所有 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

或者您可以使用 LEAVE 指令进行简化:

push rbp
mov rbp, rsp
sub rsp, [size of local variables]
...
leave
ret

关于C 和 Nasm64 组合 - 堆栈对齐、尾声、序言 - OSX 64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26322382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com