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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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_X86_Dos_Masm_X86 16 - Fatal编程技术网

Assembly 关闭文件后,程序集无法再进行比较

Assembly 关闭文件后,程序集无法再进行比较,assembly,x86,dos,masm,x86-16,Assembly,X86,Dos,Masm,X86 16,我无法理解为什么在放入读取文件模块(从打开\u文件到关闭\u错误)后,我不能再在继续标签上执行比较。如果我删除读取文件模块,它可以工作 组装和链接时没有错误。运行程序时没有错误消息。程序在运行时不会崩溃。无限循环,如果我把读取文件模块。 显示3测试读取文件模块是否已删除 什么寄存器会影响这一点?还是哪面旗?我怎样才能解决它 文件: 这里您将缓冲区声明为单个字节 buffer db ? 这里你读入了那个单字节 lea dx, buffer int 21h ; AX = b

我无法理解为什么在放入读取文件模块(从
打开\u文件
关闭\u错误
)后,我不能再在
继续
标签上执行比较。如果我删除读取文件模块,它可以工作


组装和链接时没有错误。运行程序时没有错误消息。程序在运行时不会崩溃。无限循环,如果我把读取文件模块。 显示3测试读取文件模块是否已删除

什么寄存器会影响这一点?还是哪面旗?我怎样才能解决它

文件:


这里您将
缓冲区
声明为单个字节

buffer db ?
这里你读入了那个单字节

lea dx, buffer
int 21h             ; AX = bytes read

lea bx, buffer              ; get the length of buffer
mov si, ax                  
mov byte ptr [bx+si], '$'   ; put terminator at the end of buffer
因此,即使您只从文件中读取一个字节,您也已经将
$
放在了缓冲区变量的末尾,从而超出了缓冲区变量的限制


我不知道您的输入文件有多长,但很可能您无意中覆盖了更大的内存。

什么是“无法执行比较”呢?组装和链接时是否出现错误?运行程序时是否收到错误消息?程序崩溃了吗?它是否提供了意外的输出(以何种方式)…组装和链接时没有错误。运行程序时没有错误消息。程序没有崩溃。如果我把读取文件模块放入无限循环。我怀疑关闭文件后零标志是否已经更改。是否有重置零标志的方法?然而,
缓冲区db?
是一个非常小的缓冲区(只有一个字节)。因此,您可能正在覆盖一系列其他变量(如
try
tryCount
)。Ya。在扩展缓冲区大小后,问题得到了解决。谢谢这个问题就是所谓的内存泄漏吗?这是缓冲区溢出,不是内存泄漏。如果您分配了内存,但没有释放内存,则会导致内存泄漏。对于长时间运行的进程,这将导致它消耗越来越多的内存。如果你能接受naswer,那就太好了。:)顺便说一句:我不知道你是怎么解决的。正确的解决方案是分块读取文件,如果文件比缓冲区大,但这当然取决于您必须处理的预期数据。我只是将其更改为buffer db 10240 dup($):)你能告诉我如何分块阅读这个文件吗?我不知道怎么做。谢谢。分块阅读意味着你必须阅读N个字节,直到没有更多的字节为止。这取决于你的算法,因为你需要处理中间的数据。因此,您可以读取特定的记录大小(如果您有固定的或已知的数据结构)。然而,评论起来有点复杂。您可以在这里查看并参考
readbyte\u 1\u文件:
,它基本上是一个字符接一个地读取并打印。当然,你可以阅读的不仅仅是一本charu,我可以添加到facebook吗?:)
lea dx, buffer
int 21h             ; AX = bytes read

lea bx, buffer              ; get the length of buffer
mov si, ax                  
mov byte ptr [bx+si], '$'   ; put terminator at the end of buffer