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