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

时间:2015-03-29 20:07:47

标签: linux assembly nasm x86-64 system-calls

我的asm功能会在返回时发生段错误。

这是函数原型: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

1 个答案:

答案 0 :(得分:1)

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