【问题标题】:assembly function segfault at return (nasm x64)返回时的汇编函数段错误(nasm x64)
【发布时间】:2015-03-29 20:07:46
【问题描述】:

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

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

基本上它从 C 主程序获取 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

【问题讨论】:

  • 这就是我的想法,但是当我删除读写块时为什么没有问题?它们中的什么修改了堆栈对齐?在读取时我不接触堆栈,在写入时我推然后弹出。

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


【解决方案1】:

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

【讨论】:

  • 实际上,对于 readwrite 系统调用,您设置了 mov rsi, rbp ; 2nd param - buffer
  • 谢谢它有效。我还不明白为什么,但我会试着弄清楚。为什么我们需要在启动时保存 ebp 但它会在每次系统调用时不断重置。而且,如果我的 MOV 坏了,我怎么能读取我的所有文件,它只会在返回时崩溃。再次感谢您;)
  • ebp 不会重置。您在ebp-16 分配了缓冲区,因此您需要将其作为地址传递,否则您将覆盖堆栈上的返回地址。这将在ret 处出错,因为它会尝试从堆栈中抓取它并跳转到那里。
  • 好吧。我现在明白了。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2023-03-12
相关资源
最近更新 更多