Assembly 汇编语言错误
);此程序仅打印文件中的第一个字。我不知道如何找到文件的结尾或如何读取整个字符串,即使它有空格Assembly 汇编语言错误,assembly,Assembly,);此程序仅打印文件中的第一个字。我不知道如何找到文件的结尾或如何读取整个字符串,即使它有空格 .data open_mode DB "r",0 file_name1 DB "prb4.txt",0 linie DB 0 format DB "%s ",0 .code start: push offset open_mode push offset file_name1 call fopen add
.data
open_mode DB "r",0
file_name1 DB "prb4.txt",0
linie DB 0
format DB "%s ",0
.code
start:
push offset open_mode
push offset file_name1
call fopen
add esp,8
mov ecx,eax
et_read:
push offset linie
push offset format
push eax
call fscanf
add esp,12
push offset linie
push offset format
call printf
add esp,4
loop et_read
push 0
call exit
end start
一些快速的观察
- 您需要为正在读取的数据分配空间。当前
仅为一个字节。您可以执行以下操作 liniedb80dup(?);分配一个80字节的缓冲区linie
- 使用
一次读取一行。确保您的fgets
缓冲区对于该行足够大linie
- 您可以检查FGET的返回值以确定
eof
- 完成后请记住关闭文件
fscanf
读取的字符串,不是吗?(liniedb0
)这将是一个问题。而linie
应该在bss
部分声明,而不是data
部分声明,因为它是可写的。非常感谢!我在assemby语言中找不到fgets的任何语法(仅在C中)。@user5640022,fgets只是另一个库调用,如fscanf、fopen等。请检查函数参数的C签名以及它们需要如何传递。我想在stackoverflow上有一些帖子是关于从assembly调用FGET的language@user5640022:如果你不确定做某事的“正常”方式是什么,你可以随时查看编译器的输出。虽然“通常”您只能用asm编写一个内部循环,而程序的其余部分则用C(或任何其他语言)编写。在asm中编写整个程序主要用作学习练习。将缓冲区放在.bss
部分,而不是.data
。可执行文件中不需要80字节的零<代码>章节.bss/linie resb 80
。