Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/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 nasm程序集:字符串打印两次_Assembly_Nasm - Fatal编程技术网

Assembly nasm程序集:字符串打印两次

Assembly nasm程序集:字符串打印两次,assembly,nasm,Assembly,Nasm,我已经为NASM汇编程序编写了以下x86汇编代码 你好,asm 打印字符串.asm 我已经在Bochs2.2.6 emulator中运行了代码 预期输出 你好,再见 我得到的输出 你好,世界,再见,再见 为什么《再见》要印两次?还要注意,在hello,world之后还有一个额外的空格。它是从哪里来的? 注意:如果我只打印一个字符串代码就可以了。您的问题来自于行 cmp WORD [bx], 0 这意味着将bx指向的地址处的单词与0进行比较。但是,您正在查看的字符串是由字节而不是单词组成的。为了

我已经为NASM汇编程序编写了以下x86汇编代码

你好,asm

打印字符串.asm

我已经在Bochs2.2.6 emulator中运行了代码

预期输出

你好,再见

我得到的输出

你好,世界,再见,再见

为什么《再见》要印两次?还要注意,在hello,world之后还有一个额外的空格。它是从哪里来的?
注意:如果我只打印一个字符串代码就可以了。

您的问题来自于行

cmp WORD [bx], 0
这意味着将bx指向的地址处的单词与0进行比较。但是,您正在查看的字符串是由字节而不是单词组成的。为了使这个比较成功,它必须在一行中找到两个字节,也就是一个都包含零的字

这不会发生在HELLO_MSG的末尾,所以它只会一直打印字符,直接穿过下面的字符串bye_MSG,直到它最终在510-$-$$db 0处找到一对


这也解释了您看到的额外空间,因为您实际上是在HELLO_MSG的末尾打印0。

您的问题来自该行

cmp WORD [bx], 0
这意味着将bx指向的地址处的单词与0进行比较。但是,您正在查看的字符串是由字节而不是单词组成的。为了使这个比较成功,它必须在一行中找到两个字节,也就是一个都包含零的字

这不会发生在HELLO_MSG的末尾,所以它只会一直打印字符,直接穿过下面的字符串bye_MSG,直到它最终在510-$-$$db 0处找到一对

这也解释了您看到的额外空间,因为您实际上是在HELLO_MSG末尾打印0。

您的问题来自cmp WORD。如果您要查找db 0,那只是一个字节,而不是一个字,因此它在到达时间510-$-$$db 0之前找不到字符串的结尾。首先,我尝试了cmp[bx],0。但汇编器报告说,它无法确定大小。然后我尝试了mov-dx,[bx],然后是cmp-dx,0。但它给出了同样的错误输出。现在我明白为什么了!cmp字节[bx],0正在工作。你能回答吗?这样我就可以把这个标记为已回答?谢谢你的问题来自于一个词。如果您要查找db 0,那只是一个字节,而不是一个字,因此它在到达时间510-$-$$db 0之前找不到字符串的结尾。首先,我尝试了cmp[bx],0。但汇编器报告说,它无法确定大小。然后我尝试了mov-dx,[bx],然后是cmp-dx,0。但它给出了同样的错误输出。现在我明白为什么了!cmp字节[bx],0正在工作。你能回答吗?这样我就可以把这个标记为已回答?谢谢
cmp WORD [bx], 0