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

问题描述 投票:3回答:2

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

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

assembly x86 byte dos word
2个回答
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

正如所料。


3
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.