求下面程序每步的说明DATA SEGMENT LIST DB 10,,10 DUP("$")X DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX ,DATA MOV DS ,AX LEA DX,LISTMOV AH,0AHINT 21H ; 输入字符串MOV DL,10MOV AH,2INT 21H ;回车换行MOV AH,01HINT 21H ;

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 16:57:48

求下面程序每步的说明DATA SEGMENT LIST DB 10,,10 DUP("$")X DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX ,DATA MOV DS ,AX LEA DX,LISTMOV AH,0AHINT 21H ; 输入字符串MOV DL,10MOV AH,2INT 21H ;回车换行MOV AH,01HINT 21H ;
求下面程序每步的说明
DATA SEGMENT
LIST DB 10,,10 DUP("$")
X DB
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX ,DATA
MOV DS ,AX
LEA DX,LIST
MOV AH,0AH
INT 21H ; 输入字符串
MOV DL,10
MOV AH,2
INT 21H ;回车换行
MOV AH,01H
INT 21H ;输入单个字符
MOV CL,LIST+1
MOV CH,0
MOV BX,CX
ADD BX,2
MOV LIST[BX],AL
L1:MOV DL,LIST[BX-1]
CMP DL,LIST[BX]
JB EXIT
MOV AL,LIST[BX]
MOV LIST[BX],DL
MOV LIST[BX-1],AL
DEC BX
LOOP L1
EXIT:
INC LIST+2
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,10
MOV AH,2
INT 21H
LEA DX,LIST+2
MOV AH,09H
INT 21H
MOV AX ,4C00H
INT 21H
CODE ENDS
END START

求下面程序每步的说明DATA SEGMENT LIST DB 10,,10 DUP("$")X DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX ,DATA MOV DS ,AX LEA DX,LISTMOV AH,0AHINT 21H ; 输入字符串MOV DL,10MOV AH,2INT 21H ;回车换行MOV AH,01HINT 21H ;
DATA SEGMENT
LIST DB 10,,10 DUP("$")
X DB
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX ,DATA
MOV DS ,AX
LEA DX,LIST
MOV AH,0AH
INT 21H ; 输入字符串
;INT21H的0A功能,调用前缓冲区的第一个字节即LIST[0]是缓冲区的大小;
;定义中的10表示最多输入9个字符,因为最后一个字符总是要填那个回车(ASCII 13)
;返回时DOS会在LIST[1]里填上实际输入的字符数(但这个数不包括那个回车符,对这程序来说就是最大到9)
;实际输入的内容是从LIST[2]开始存放的
MOV DL,10
MOV AH,2
INT 21H ;换行,因为输入时最后已经有个回车了,这时只要再加个换行符(ASCII 10)即可
MOV AH,01H
INT 21H ;再输入单个字符
MOV CL,LIST+1 ;CL=LIST[1]得到的是0A调用输入的字符数
MOV CH,0 ;
MOV BX,CX ;BX=CX=实际输入的字符数(不含回车符)
ADD BX,2 ;BX加2是要跳过LIST[0]和LIST[1]这两个不是实际输入的字节
;即BX为那个输入结尾的回车符的位置(从LIST开头算的)
MOV LIST[BX],AL ;用后来输入的单个字符(在AL里)替换掉前次输入最后的回车符
L1:MOV DL,LIST[BX-1];比较[BX]和[BX-1]里字符,
CMP DL,LIST[BX] ;如果[BX]里的较大则跳出
JB EXIT
MOV AL,LIST[BX] ;否则交换这两个字符(使小的在前面)
MOV LIST[BX],DL
MOV LIST[BX-1],AL
DEC BX ;BX向前移动
LOOP L1 ;再继续循环
;这段程序有点不明所以,好像要完成的事情是:假设第一次输入的字串是从小到大预排序的,这循环把后来输入的单个字符插到合适位置
;但是又有点古怪……看不出这程序到底要干吗
EXIT:
INC LIST+2 ;把实际输入的字串的第一个字符(在LIST[2]里)加1
MOV DL,0DH ;回车
MOV AH,2
INT 21H
MOV DL,10 ;换行
MOV AH,2
INT 21H
LEA DX,LIST+2 ;把处理完的字符串显示出来
MOV AH,09H ;注意:09号功能要求字串以美元符结尾,程序没给字串填上结尾的$,所以实际输出会多了很多乱码
INT 21H
MOV AX ,4C00H ;退出
INT 21H
CODE ENDS
END START