帮忙看一段汇编代码

DSEG SEGMENT 'DATA'

STRING DB 20,0,20 DUP(?)

DSEG ENDS
MOV AX,DSEG
MOV DS,AX
LEA DX,STRING
MOV AH,0AH
INT 21H
MOV CL,STRING+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX],'$'
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
===========================
从MOV CL,STRING+1这句开始不是很明白

当你调用0AH的时候,DS:DX为缓冲区首地址,(DS:DX)存储的是缓冲区最大字符数, (DS:DX+1)存储的是缓冲区实际字符数。所以你数据段中申请的STRING缓冲区的第一个字节数据20表示你的STRING最多能存储20个字节的数据,STRING缓冲区的第二个字节数据(STRING+1)的0表示缓冲区中实际只有0个数据,STRING+2才开始存储你输入的数据。
所以

DSEG SEGMENT 'DATA'
STRING DB 20,0,20 DUP(?) //申请最大存储20个字节的缓冲区,起始字节数为0
DSEG ENDS

MOV AX,DSEG
MOV DS,AX
LEA DX,STRING //取STING的首地址存储在DX中
MOV AH,0AH
INT 21H
MOV CL,STRING+1 //将实际输入的字节数存放在CL中(STRING+1会根据你的输入自动计数)
XOR CH,CH //CH清零
(这里好像少句ADD DX,02H)
ADD DX,CX //两者相加结果为输入字符串末尾的下一个单元的地址
MOV BX,DX
MOV BYTE PTR[BX],'$' //在字符串末尾添加"$"结束符,便于调用09H输出
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H

以上,希望我说的你能明白~
温馨提示:答案为网友推荐,仅供参考
相似回答