为什么要将这么多字节写入标准输出设备?
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
符合预期。
我有如下数据声明,数据段和代码段寄存器都正确初始化:
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
符合预期。