Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 汇编语言错误_Assembly - Fatal编程技术网

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

一些快速的观察

  • 您需要为正在读取的数据分配空间。当前
    linie
    仅为一个字节。您可以执行以下操作

    liniedb80dup(?);分配一个80字节的缓冲区

  • 使用
    fgets
    一次读取一行。确保您的
    linie
    缓冲区对于该行足够大

  • 您可以检查FGET的返回值以确定
    eof
  • 完成后请记住关闭文件

我建议您首先在C中实现您想要的功能,然后将其转换为汇编。您确实意识到,您只分配了一个字节来保存您正在使用
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