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

时间:2019-03-13 02:04:24

标签: assembly x86 byte dos word

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

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个字节的输出?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

您的代码:

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",并打印出您在DX中传递的字符串的所有字符,直到最后的'$'。因此它会打印

ABCDEF

符合预期。