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