我有以下数据声明,数据段和代码段寄存器都已正确初始化:
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个字节的输出?
你的代码:
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
正如所料。
您将d2
的偏移移动到DX。这指向从dw 3
开始的两个字节。然后将DX添加到DX,因此DX现在指向恰好是d3
开头的2字节字。 Int 21/ah=9将从DX的偏移开始打印字符(不包括$
)。应打印以偏移量d3
(并以$
结尾)开头的字符。那个输出应该是ABCDEF
,这是你应该看到的6个字符。