gpt4 book ai didi

linux - 返回时的汇编函数段错误 (nasm x64)

转载 作者:太空宇宙 更新时间:2023-11-04 10:54:34 25 4
gpt4 key购买 nike

我的 asm 函数在返回时出现段错误。

这是函数原型(prototype):void ft_cat(int fd);

基本上它从 C main 获取一个 fd 并像 cat shell 命令一样工作。

如果我删除读写部分,我不会遇到任何问题,所以问题可能出在系统调用上。我只是不知道。我已经花了好几个小时来寻找它。

有什么线索吗?

%define MACH_SYSCALL(nb) 0x2000000 | nb
%define READ 3
%define WRITE 4
%define LSEEK 19
%define STDOUT 1
%define SEEK_CUR 1

section .text
global _ft_cat

_ft_cat:
push rbp ; save base pointer
mov rbp, rsp ; place base pointer on stack
sub rsp, 16 ; align stack to keep 16 bytes for buffering
push rdi ; save function parameter (int fd)

read:
mov rdi, [rsp] ; 1st param - get fd from stack
mov rsi, rbp ; 2nd param - buffer
mov rdx, 16 ; 3rd param - buffer size
mov rax, MACH_SYSCALL(READ)
syscall
cmp rax, 0 ; if read return <= 0 jump to end
jng end

write:
push rax ; save read return
mov rdi, STDOUT ; 1st param
mov rsi, rbp ; 2nd param - buffer
mov rdx, rax ; 3rd param - read return
mov rax, MACH_SYSCALL(WRITE)
syscall
pop rax
cmp rax, 16 ; if read return < 16 then it is finished
je read

end:
mov rsp, rbp ; restore stack and base pointers
pop rbp ;
ret ; return >> segfault

最佳答案

你分配的缓冲区是 16 字节 below ebp 但你将 ebp 传递给 read 系统调用所以你覆盖保存的 rbp、返回地址和调用者框架中的其他内容。您需要 lea rsi, [rbp-16]

关于linux - 返回时的汇编函数段错误 (nasm x64),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29334233/

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