mov ah,9 int 21h中的DX+2是什么意思?

What does DX + 2 mean in mov ah,9 int 21h?

mov dx, offset buffer
mov ah, 0ah
int 21h
jmp print
buffer db 10,?, 10 dup(' ')
print:
xor bx, bx
mov bl, buffer[1]
mov buffer[bx+2], '$'
mov dx, offset buffer + 2
mov ah, 9
int 21h

我知道buffer[bx+2]代表'$',但是mov ah,9中的offset buffer +2代表什么?

他们说,

"Start printing from address DS:DX + 2". From address ds:dx +2.

当用int 21h, ah=0Ah从键盘上捕获一个字符串时,该字符串有下一个结构:

可以看到,前两个字节是控制字节,用户输入的字符从第三个字节(byte 2)开始。最后一个字符是 chr(13)(ENTER 键)。

要使用 int 21h, ah=09h 显示这个捕获的字符串,您必须将最后一个字符 (13) 替换为 '$',然后使 DX 指向从第三个字节开始的有效字符:

mov dx, offset buff + 2

或这个(两者等价):

mov dx, offset buff
add dx, 2

用'$'替换chr(13)的方法在下图中解释:注意捕获的字符串的长度在第二个字节(字节1)中,我们必须添加这个长度才能达到最后一个byte chr(13),现在我们可以替换它了:

接下来是代码:

.stack 100h
.data
msg  db 'Enter text : $'
text db 11        ;MAX LENGTH ALLOWED.
     db ?         ;LENGTH ENTERED.
     db 11 dup(?) ;CHARACTERES.
.code
  mov  ax, @data
  mov  ds, ax

;DISPLAY MESSAGE TO USER.  
  mov  dx, offset msg
  mov  ah, 9
  int  21h

;CAPTURE TEXT.  
  mov  dx, offset text
  mov  ah, 0Ah
  int  21h            

;REPLACE ENTER WITH $.
  mov  bl, '$'
  mov  si, offset text + 1  ;◄■ POSITION OF LENGTH ENTERED.
  mov  al, [si]             ;◄■ GET LENGTH ENTERED.
  mov  ah, 0                ;◄■ CLEAR AH TO USE AX.
  add  si, ax               ;◄■ SI POINTS TO LAST CHAR.
  inc  si                   ;◄■ +1 TO POINT TO CHAR 13.
  mov  [si], bl             ;◄■ REPLACE 13 WITH '$'.

  mov  ax, 4c00h
  int  21h