为什么要将这么多字节写入标准输出设备?

Why are this many bytes written to the standard output device?

我有如下数据声明,数据段和代码段寄存器都正确初始化:

d1  db 1,2
d2  dw 3
d3  db 'ABC'
d4  db 'DE'
d5  db 'F'
d6  db '$'

我运行 DOSbox 上的这组指令:

mov dx, offset d2
add dx, 2
mov ah, 9
int 21h

为什么标准输出设备会写入6个字节?我理解 d2 是一个字,所以它是 2 个字节的数据。但是我不太明白为什么会有6个字节的输出?

您将 d2 的偏移量移动到 DX。它指向从 dw 3 开始的两个字节。然后将 2 添加到 DX,因此 DX 现在指向恰好是 d3 开始的 2 字节字。 Int 21/ah=9 将打印从 DX 中的偏移量开始的字符(不包括 $)。应该打印从偏移 d3 开始(到 $ 结束)的字符。该输出应该是 ABCDEF,这是您应该看到的 6 个字符。

您的代码:

mov dx, offset d2
add dx, 2
mov ah, 9
int 21h

与以下内容相同:

mov dx, offset d3 ; offset d3 equals offset d2 + 2, because d2 is a word.
mov ah, 9
int 21h

几个数据指令db在内存中产生连续的字节(这里),所以:

d3  db 'ABC'
d4  db 'DE'
d5  db 'F'
d6  db '$'

等同于:

d3  db 'ABCDEF$' ; assuming you don't need labels d4, d5, d6 somewhere else

所以你将字符串 'ABCDEF$' 传递给 int 21h,函数 AH=9"Display string",它会打印你传递给 [=19] 的字符串的所有字符=],直到最后的'$'。所以它打印

ABCDEF

符合预期。