要求:
第1步:在屏幕上给出按空格键,开始摇号的英文提示;
第2步:用户按下空格键,摇号开始;
第3步:在屏幕上给出再次按空格键,结束摇号的英文提示;
第4步:用户再次按下空格键,摇号结束;
第5步:在屏幕上显示摇号结果(5位十进制数字00000~99999);
第6步:询问是否继续摇号,是则继续,否则退出。
.MODEL SMALL
.STACK
DB 64 DUP(?)
.DATA
DT1 DW 0;[0006H]
DT2 DW 0
DIVS DW 10000, 1000, 100, 10, 1
RSTS DB 0,0,0,0,0,"$";存放五位数ASCII码
MSG1 DB 'PRESS SPACE TO START PLEASE.'
DB 0DH, 0AH, '$'
MSG2 DB 'PRESS SPACE TO GET RESULT PLEASE.'
DB 0DH, 0AH, '$'
MSG3 DB 'INPUT CHARACTER Y TO RESTART PLEASE,OR THE PROGRAM WILL BE ENDED.'
CRLF DB 0DH, 0AH, '$'
.CODE
START:
MOV AX, STACK
MOV SS, AX
MOV AX, @DATA
MOV ES, AX
MOV DS, AX
CLD
REST: MOV Ah, 09H
LEA DX, CRLF;回车换行
INT 21H
LEA DX, MSG1;9号功能,显示提示1
INT 21H
LOOP1: MOV AH, 01H
INT 21H;等待输入
CMP AL, ' '
JNE LOOP1
;输入空格时跳出循环,开始摇号
MOV AH, 09H
LEA DX, CRLF;回车换行
INT 21H
LEA DX, MSG2;9号功能,显示提示2
INT 21H
LEA DX, CRLF;回车换行
INT 21H
CALL GETRDM1;摇号程序1
LOOP2: MOV AH, 01H
INT 21H
CMP AL, ' '
JNE LOOP2
;输入空格时结束摇号
CALL GETRDM2;摇号程序2,并显示摇号结果
MOV Ah, 09H
LEA DX, CRLF;回车换行
INT 21H
MOV Ah, 09H
LEA DX, CRLF;回车换行
INT 21H
MOV AH, 09H
LEA DX, MSG3;9号功能,显示提示3
INT 21H
MOV AH, 01H
INT 21H
CMP AL, 'Y'
JE REST;输入Y则进入RESTART,重启摇号程序
CMP AL, 'y'
JE REST
EXIT: MOV AH, 4CH
INT 21H
MOV AX, 4C00H ;退出
INT 21H
GETRDM1 PROC NEAR
MOV AH, 2CH; CH:CL=时:分,DH:DL=秒:1/100秒
INT 21H
;MOV CH, 11
;MOV CL, 17
;MOV DH, 10
;MOV DL, 10
MOV AX, CX
MOV CX, DX
MOV DX, AX
MOV AX, CX
MOV CL, 14
SHR DX, CL
MOV CX, 10
DIV CX
MOV DT1,DX;余数
RET
GETRDM1 ENDP
GETRDM2 PROC NEAR
MOV AH, 2CH; CH:CL=时:分,DH:DL=秒:1/100秒
INT 21H
;MOV CH, 11
;MOV CL, 17
;MOV DH, 10
;MOV DL, 10
MOV AX, CX
MOV CL, 4
SHR DX, CL
MOV CX, 10000
DIV CX
MOV DT2,DX;余数
MOV AX, DT1
XOR AH, AH
ADD AL, 48;
MOV DI, OFFSET RSTS
MOV BYTE PTR [DI], AL
MOV AX, DT2
CALL SHOWR;工作:改写SHOWR子程序,先打印一位DT1,再打印4位DT2,
;可以的思路是,先把DT1的尾1位放在RSTS[0],再把DT2放在RSTS[1-4],不过DT2应该需要转换成十进制
RET
GETRDM2 ENDP
SHOWR PROC NEAR
MOV SI, OFFSET DIVS
MOV DI, OFFSET RSTS
MOV CX, 5
LP1:
CMP CX, 5
JE NEXT3
MOV DX, 0
DIV WORD PTR [SI]
ADD AL, 48;从商得到相应数字的ASCII码
MOV BYTE PTR [DI], AL
NEXT3: INC DI
ADD SI, 2
MOV AX, DX
LOOP LP1
MOV CX, 4
MOV DI, OFFSET RSTS
LP2:
;CMP BYTE PTR [DI], '0' ;不输出前面的0字符
JNE PRINT
INC DI
LOOP LP2
PRINT:
MOV DX, DI
MOV AH, 09H
INT 21H
RET
SHOWR ENDP
END START
思路:两个摇号子程序,第一个利用int21h的2ch功能,模10后生成一位0~9的随机数,
第二个同理,模10000生成四位0000~9999的随机数,前后拼接起来就是一个十万以内的随机数。