gpt4 book ai didi

c - 在汇编中使用 fgets 时出现段错误错误?

转载 作者:行者123 更新时间:2023-12-02 19:48:05 25 4
gpt4 key购买 nike

我在汇编中使用了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 个字符长的内容。

最佳答案

一个FILE *不是文件描述符。而不是通过 1像你一样,通过 [stdin] (这是有效的,因为 stdin 是 glibc 中的全局指针,而 NASM 中的关键字 stdin 是指向它的指针):

    mov rdx, [stdin]

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

    mov stdin, %rdx

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

default rel

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

    mov stdin(%rip), %rdx

这会加载位于 stdin 的内存(这是您正在寻找的 8 字节 FILE * 指针)进入 rdx .

关于c - 在汇编中使用 fgets 时出现段错误错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58863145/

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