8086汇编程序 利用INT 21H生成00000~99999的随机数

要求:
第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的随机数,前后拼接起来就是一个十万以内的随机数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值