【问题标题】:Why are this many bytes written to the standard output device?为什么要向标准输出设备写入这么多字节?
【发布时间】: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


【解决方案1】:

您的代码:

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

正如预期的那样。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2015-11-19
      • 1970-01-01
      • 2021-09-29
      • 1970-01-01
      • 2012-01-01
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多