【发布时间】:2020-03-10 18:54:07
【问题描述】:
我在汇编中使用了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 个字符的内容。
【问题讨论】:
-
你已经正确设置了缓冲区——你的问题是第三个参数(在 rdx 中),它需要是
FILE *,而不是文件描述符。 -
你知道我如何从标准输入读取数据吗?
-
是的,从全局变量
[stdin]中加载FILE *stdin的值。查看编译器输出(但要注意 GNU .intel_syntax 与 NASM 语法差异) -
请注意,
stdin不一定是全局变量——在非 glibc 实现中,它可能是访问某个数组或其他名称不同的对象的宏。但只要你只关心 glibc,你应该没问题mov rdx, qword [stdin] -
您不需要先将 AL 归零;
fgets不采用可变数量的参数。它不会伤害,但它与mov ecx, 0一样无关紧要。