我有以下数据声明,并且数据段和代码段寄存器都已正确初始化:
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个字节的输出?
答案 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
符合预期。