c - 在汇编中使用 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 个字符的内容。
解决方案
AFILE *
不是文件描述符。1
不要像你那样传递,而是传递[stdin]
(这有效,因为stdin
它是 glibc 中的全局指针,而stdin
NASM 中的关键字是指向它的指针):
mov rdx, [stdin]
如果您使用 GAS,这将起作用:
mov stdin, %rdx
但是,您可能应该使用 RIP 相对寻址;这允许您的可执行文件被重新定位,并且是 PIE(与位置无关的可执行文件)所必需的,这是现在的默认设置。在 NASM 中,只需将其放在文件顶部:
default rel
在 GAS 中,它有点复杂。您必须添加(%rip)
到您使用的所有外部符号,如下所示:
mov stdin(%rip), %rdx
这会将位于(这是您要查找stdin
的 8 字节指针)的内存加载到.FILE *
rdx
推荐阅读
- firebase - 如何查看 Cloud Firestore 日志?
- python - 如何在 PythonVM 上将 Python 字节码组装成目标码(用于处理器)?
- vbscript - 在 VBS 脚本中强制注销
- java - 捕获异常后代码失败
- sorting - 对表字段 octobercms 中的数据进行排序
- python - pandas:按垂直顺序写入数据帧的第一行
- kubernetes - 从 pod 访问服务 IP
- python-3.x - BeautifulSoup - find_all 具有不同类名的 div 标签
- angular - 如果 aspnetboilerplate 的 AbpAuthorize 在 Angular 4 请求中失败,如何重定向到登录页面?
- scala - Scala设计模式-具有两个泛型的密封特征,子方法在参数列表中具有相同类型的对象