汇编语言 | 随机数的生成

利用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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值