首页 > 解决方案 > 在汇编中使用 fgets 时出现分段错误错误?

问题描述

fgets()在汇编中使用该函数,它应该可以工作,但是我的缓冲区有问题。有没有办法定义一个 char 指针?我问是因为该函数需要一个 char 指针作为第一个参数。

在这里你可以看到我的代码:

; nasm fgets.asm -f elf64 -o fgets.o
; gcc -no-pie fgets.o
; ./a.out

; Define fgets as an external function
extern fgets

SECTION .DATA
buffer: db "0000000000", 0

SECTION .TEXT
    global main

main:
    push rbp ; Push stack

    ; Set up parameters and call the C function

    mov rdi, buffer
    mov rsi,10
    mov rdx, 1
    mov rax,0
    call fgets

    pop rbp     ; Pop stack

    mov rax,0   ; Exit code 0
    ret         ; Return

我想从标准输入中读取最多 10 个字符的内容。

标签: cassemblyx86glibc

解决方案


AFILE *不是文件描述符。1不要像你那样传递,而是传递[stdin](这有效,因为stdin它是 glibc 中的全局指针,而stdinNASM 中的关键字是指向它的指针):

    mov rdx, [stdin]

如果您使用 GAS,这将起作用:

    mov stdin, %rdx

但是,您可能应该使用 RIP 相对寻址;这允许您的可执行文件被重新定位,并且是 PIE(与位置无关的可执行文件)所必需的,这是现在的默认设置。在 NASM 中,只需将其放在文件顶部:

default rel

在 GAS 中,它有点复杂。您必须添加(%rip)到您使用的所有外部符号,如下所示:

    mov stdin(%rip), %rdx

这会将位于(这是您要查找stdin的 8 字节指针)的内存加载到.FILE *rdx


推荐阅读