汇编语言 | 随机数的生成

文章介绍了如何使用DOS下的INT21H中断生成随机数,并通过汇编语言程序进行显示。首先,展示了生成一位随机数的方法,然后扩展到生成10位随机数,通过调整GETRAM子程序中的CX值并加入延时子程序WAITM以产生不同的随机数序列。最后,给出了一个循环生成10位随机数的程序,直到检测到键盘输入为止。

利用int 21h生成,存档.

1.生成0-9的一位随机数

.MODEL SMALL
.DATA
INPUT DB "Ramdom Number:",'$'
CHANGELINE DB 0AH,0DH,'$'
NUMBER WORD ?
.CODE
MAIN PROC FAR
	MOV AX,@DATA
	MOV DS,AX
	MOV DX,OFFSET INPUT
	MOV AH,09H
	INT 21H
	CALL SHOW;显示随机数
	MOV AX,4C00H
	INT 21H
MAIN ENDP

SHOW PROC NEAR
	CALL GETRAM
	MOV AX,NUMBER
	CALL PRINT
RET
SHOW ENDP

GETRAM PROC NEAR
	MOV AH,2CH;CH:CL=时:分,DH:DL=秒:1/100秒
	INT 21H
	MOV AX,CX
	MOV CX,DX
	MOV DX,AX;DX=时:分
	MOV AX,CX;AX=CX=秒:1/100秒
	MOV CL,14
	SHR DX,CL
	MOV CX,10
	DIV CX
	MOV NUMBER,DX;余数	
RET
GETRAM ENDP

PRINT PROC NEAR; 输出十进制数
	PUSH AX;保存现场
	PUSH BX
	PUSH CX
	PUSH DX
	PUSHF;保存标志位
	XOR CX,CX;zf=1
	MOV BX,10
P1:;存余数
	XOR DX,DX;zf=1
	DIV BX
	INC CX
	ADD DX,30H
	PUSH DX ;保存DX入栈,后续
	CMP AX,0
	JNE P1;不等于零则跳转
	MOV AH,2
P2:;输出栈内所存数字
    POP DX
    INT 21H
    LOOP P2
	;MOV DL,32
	;INT 21H
	POPF
	POP DX
	POP CX
	POP BX
	POP AX
RET
PRINT  ENDP

END

2.生成10位数字的随机数

GETRAM子程序中,cx=10可生成1位数,cx=10000可生成4位数。想要生成10位数,先生成4位,再生成1位,即可生成5位,重复两次即可生成10位。由于是获取时间得到的伪随机数,所以中间设置延时子程序WAITM来达到获取不一样的随机数的目的。

.MODEL SMALL
.DATA
INPUT DB "Ramdom Number:",'$'
CHANGELINE DB 0AH,0DH,'$'
NUMBER WORD ?
.CODE
MAIN PROC FAR
	MOV AX,@DATA
	MOV DS,AX
	MOV DX,OFFSET INPUT
	MOV AH,09H
	INT 21H
	CALL SHOW;显示随机数
	MOV AX,4C00H
	INT 21H
MAIN ENDP

SHOW PROC NEAR
	
	CALL GETRAM1;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	MOV BL,1
BACK:
	MOV CX,33144
	CALL WAITM;延时
	DEC BL
	JNZ BACK
	CALL GETRAM2;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	CALL GETRAM1;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	MOV BL,1
BACK2:
	MOV CX,33144
	CALL WAITM;延时
	DEC BL
	JNZ BACK2
	CALL GETRAM2;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	
RET
SHOW ENDP

GETRAM1 PROC NEAR
	MOV AH,2CH;CH:CL=时:分,DH:DL=秒:1/100秒
	INT 21H
	MOV AX,CX
	MOV CX,DX
	MOV DX,AX;DX=时:分
	MOV AX,CX;AX=CX=秒:1/100秒
	MOV CL,8
	SHR DX,CL
	MOV CX,10000
	DIV CX
	MOV NUMBER,DX;余数	
RET
GETRAM1 ENDP

GETRAM2 PROC NEAR
	MOV AH,2CH;CH:CL=时:分,DH:DL=秒:1/100秒
	INT 21H
	MOV AX,CX
	MOV CX,DX
	MOV DX,AX;DX=时:分
	MOV AX,CX;AX=CX=秒:1/100秒
	MOV CL,14
	SHR DX,CL
	MOV CX,10
	DIV CX
	MOV NUMBER,DX;余数	
RET
GETRAM2 ENDP

PRINT PROC NEAR; 输出十进制数
	PUSH AX;保存现场
	PUSH BX
	PUSH CX
	PUSH DX
	PUSHF;保存标志位
	XOR CX,CX;zf=1
	MOV BX,10
P1:;存余数
	XOR DX,DX;zf=1
	DIV BX
	INC CX
	ADD DX,30H
	PUSH DX ;保存DX入栈,后续
	CMP AX,0
	JNE P1;不等于零则跳转
	MOV AH,2
P2:;输出栈内所存数字
    POP DX
    INT 21H
    LOOP P2
	;MOV DL,32
	;INT 21H
	POPF
	POP DX
	POP CX
	POP BX
	POP AX
RET
PRINT  ENDP


WAITM PROC NEAR
	PUSH AX
W1:
	IN AL,61H
	AND AL,10H
	CMP AL,AH
	JE W1
	MOV AH,AL
	LOOP W1
	POP AX
RET
WAITM ENDP

END





3.跳动生成10位随机数,直至有键盘输入

.MODEL SMALL
.DATA

CHANGELINE DB 0AH,0DH,'$'
NUMBER WORD ?
.CODE
MAIN PROC FAR
	MOV AX,@DATA
	MOV DS,AX
STARTL:
	CALL SHOW;显示随机数
	CALL CLEAR
	MOV BL,4
BACKL:MOV CX,33144
	CALL WAITM
	DEC BL
	JNZ BACKL
	MOV AH,0BH
	INT 21H
	CMP AL,0FFH
	JE EXIT
	JMP STARTL
	
EXIT:
	
	MOV AX,4C00H
	INT 21H
	
MAIN ENDP

SHOW PROC NEAR
	
	CALL GETRAM1;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	MOV BL,1
BACK:
	MOV CX,33144
	CALL WAITM;延时
	DEC BL
	JNZ BACK
	CALL GETRAM2;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	CALL GETRAM1;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	MOV BL,1
BACK2:
	MOV CX,33144
	CALL WAITM;延时
	DEC BL
	JNZ BACK2
	CALL GETRAM2;获得随机数
	MOV AX,NUMBER
	CALL PRINT
	
RET
SHOW ENDP

GETRAM1 PROC NEAR
	MOV AH,2CH;CH:CL=时:分,DH:DL=秒:1/100秒
	INT 21H
	MOV AX,CX
	MOV CX,DX
	MOV DX,AX;DX=时:分
	MOV AX,CX;AX=CX=秒:1/100秒
	MOV CL,8
	SHR DX,CL
	MOV CX,10000
	DIV CX
	MOV NUMBER,DX;余数	
RET
GETRAM1 ENDP

GETRAM2 PROC NEAR
	MOV AH,2CH;CH:CL=时:分,DH:DL=秒:1/100秒
	INT 21H
	MOV AX,CX
	MOV CX,DX
	MOV DX,AX;DX=时:分
	MOV AX,CX;AX=CX=秒:1/100秒
	MOV CL,14
	SHR DX,CL
	MOV CX,10
	DIV CX
	MOV NUMBER,DX;余数	
RET
GETRAM2 ENDP

PRINT PROC NEAR; 输出十进制数
	PUSH AX;保存现场
	PUSH BX
	PUSH CX
	PUSH DX
	PUSHF;保存标志位
	XOR CX,CX;zf=1
	MOV BX,10
P1:;存余数
	XOR DX,DX;zf=1
	DIV BX
	INC CX
	ADD DX,30H
	PUSH DX ;保存DX入栈,后续
	CMP AX,0
	JNE P1;不等于零则跳转
	MOV AH,2
P2:;输出栈内所存数字
    POP DX
    INT 21H
    LOOP P2
	;MOV DL,32
	;INT 21H
	POPF
	POP DX
	POP CX
	POP BX
	POP AX
RET
PRINT  ENDP


WAITM PROC NEAR

	PUSH AX
W1:
	IN AL,61H
	AND AL,10H
	CMP AL,AH
	JE W1
	MOV AH,AL
	LOOP W1
	POP AX
RET
WAITM ENDP

CLEAR PROC NEAR
	MOV BL,3
LTIME:
	MOV CX,33144
	CALL WAITM;延时
	DEC BL
	JNZ LTIME
	MOV AH, 06h  ; 设置AH寄存器为06h,表示“清屏”
	MOV AL, 0    ; 设置AL寄存器为0,表示使用黑色背景
	MOV BH, 07h  ; 设置BH寄存器为07h,表示使用白色前景
	MOV CX, 0    ; 设置CX寄存器为0,表示从屏幕左上角开始清屏
	MOV DX, 184Fh ; 设置DX寄存器为184Fh,表示清屏到屏幕右下角
	INT 10h      ; 调用BIOS的屏幕服务,清空整个屏幕
	MOV AH, 02h  ; 设置AH寄存器为02h,表示“设置光标位置”
	MOV BH, 0    ; 设置BH寄存器为0,表示使用默认显示页
	MOV DH, 0    ; 设置DH寄存器为0,表示光标位于第一行
	MOV DL, 0    ; 设置DL寄存器为0,表示光标位于第一列
	INT 10h      ; 调用BIOS的屏幕服务,将光标移动到左上角
RET
CLEAR ENDP

END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值