return (nasm x64) 处的汇编函数段错误
assembly function segfault at return (nasm x64)
我的 asm 函数在 return 处出现段错误。
函数原型如下: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 个字节 低于 ebp
但是您将 ebp
传递给 read
系统调用所以您覆盖保存的 rbp
、return 地址和调用者框架中的其他内容。你想要 lea rsi, [rbp-16]
而不是。
我的 asm 函数在 return 处出现段错误。
函数原型如下: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 个字节 低于 ebp
但是您将 ebp
传递给 read
系统调用所以您覆盖保存的 rbp
、return 地址和调用者框架中的其他内容。你想要 lea rsi, [rbp-16]
而不是。