汇编程序有几个小问题 希望好心人能帮我解答下谢谢

DATAS SEGMENT
str db 20
db 0
db 20 dup (?)str1
db 20 dup (?)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
call input ;输入
xor cx, cx
mov cl, str + 1
lea si,str + 2
lea di,str1
call insert ;插入
mov dl,0dh ;回车换行
mov ah,2
int 21h
mov dl,0ah
int 21h
lea dx,str1
call output ;输出
MOV AH,4CH
INT 21H
input proc
lea dx, str
mov ah, 10
int 21h
ret
input endp
insert proc
i1:
cmp byte ptr [si], 'a'
jb i2
cmp byte ptr [si], 'z'
ja i2
sub byte ptr [si], 32
i2:
mov al,[si]
mov [di],al
inc di
mov byte ptr [di], 20h
inc si
inc di
loop i1
mov byte ptr [di], '$'
ret
insert endp
output proc
mov ah,9
int 21h
ret
output endp
CODES ENDS
END START

问题1: xor cx,cx 什么意思

问题2: MOV cl,str+1 程序里没有用到cl寄存器 问什么要把str+1 送给cl呢

问题3:str、和str1 分别用作哪里呢 str用于确定输入字符串中字符的位置 str1用于插入空格吗? 既然是要在转换后的字母后插入空格为什么要用两个寄存器 或者您直接说一下插入空格用的是什么原理可以吗

问题4: call insert ;插入
mov dl,0dh ;回车换行
mov ah,2
int 21h
mov dl,0ah 这段看不太懂
程序为
编程将键盘随即输入的字符串中小写字母转换为大写字母并在字母间插入空格后在屏幕输出。要求:键盘输入,空格插入,显示输出分别由子程序完成

问题1: xor cx,cx 什么意思
--是 MOV CX, 0 的另一个写法,高手常用。

问题2: MOV cl,str+1 程序里没有用到cl寄存器 问什么要把str+1 送给cl呢
--执行后 CL 中就是实际输入的字符数。
--后面,要用的吧。

问题3:str、和str1 分别用作哪里呢
str用于确定输入字符串中字符的位置
str1用于插入空格吗?
既然是要在转换后的字母后插入空格为什么要用两个寄存器
或者您直接说一下插入空格用的是什么原理可以吗
--具体算法,各人思路不同,
--看别人的程序,往往不好理解。
--你可以自己编一个试试看,也许会更简单。

问题4: call insert ;插入
mov dl,0dh ;回车换行
mov ah,2
int 21h
mov dl,0ah 这段看不太懂
--0DH,是回车符。
--0AH,是换行符。
--在屏幕上,起回车、换行的作用。追问

您在线到几点?请问 可能还有几个问题 真的特别感谢您解答了我的问题

追答

试试如下程序:

DATAS SEGMENT
X DB 13, 10, 81 DUP('$')
DATAS ENDS

CODES SEGMENT
ASSUME CS:CODES, DS:DATAS
START:
MOV AX, DATAS
MOV DS, AX
LEA DI, X + 2
MOV CX, 40
LP:
CALL INPUT ;输入
CMP BYTE PTR [DI - 1], 0DH ;是回车吗
JZ PRINT
CALL INSERT ;插入
LOOP LP ;循环40遍
PRINT:
CALL OUTPUT ;输出
MOV AH, 4CH
INT 21H
;--------------
INPUT PROC
MOV AH, 1
INT 21H
CMP AL, 'a'
JB ZZZ
CMP AL, 'z'
JA ZZZ
SUB AL, 32
ZZZ:
MOV [DI], AL
INC DI
RET
INPUT ENDP
;--------------
INSERT PROC
MOV BYTE PTR [DI], ' '
INC DI
RET
INSERT ENDP
;--------------
OUTPUT PROC
LEA DX, X
MOV AH, 9
INT 21H
RET
OUTPUT ENDP
;--------------
CODES ENDS
END START

追问

这个比那个简单一点 我现在没有电脑 明天试试能不能运行 但是还是有几个小问题 定义x 那比较高端 X DB 13,10,81DUP('$') 还有就是 LEA DI,X+2 和CMP……[di-1] 为什么加2减1不太明白 初学者 比较笨 还望您体谅

追答

X,开始是回车、换行符号。
用 9 号功能调用,从 X 开始显示时,可以换下一行显示。

X + 2,后面就是 81 个 $。用于存放输入的字符和空格。

输入数据存入[DI]后,把 DI,加了一个一。
那么,再判断输入什么了,就得到 [DI-1] 去找。

看看我的百度空间吧,有无数的例程。

追问

采纳晚啦 抱歉 感谢您 好人一生平安 我会好好学习您的空间代码的

追答

编写程序,不仅仅是凑付能用,还要:

执行速度快,占用空间小、简单明了,便于理解和维护。

还有书写格式、变量命名规则、注释方法...等等。

要想达到高手的层次,还是有很大的提升空间的。

温馨提示:答案为网友推荐,仅供参考