【发布时间】:2019-03-13 02:04:23
【问题描述】:
我有以下数据声明,数据段和代码段寄存器都正确初始化:
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 + 2会更有效:让汇编程序在构建时添加,而不是在运行时发出要添加的指令。无论如何,通过这个添加,你传递了一个指向d2末尾的指针,因此它的大小与字符串输出 DOS 函数的作用无关。 -
FWIW,
mov dx,offset d2+2相当于上面代码中的mov dx,offset d3。而db 'ABC'; db 'DE'; db 'F'; db '$'(db 'ABCDEF$',因为它们都是内存中的连续字节。
标签: assembly x86 dos x86-16 real-mode