![]() |
#2
xiaomarn2011-01-02 19:30
|

data segment
CC db '+'
ww db '-'
GG db '='
II db 0DH,0AH,'$'
AA db 5 DUP(?)
www dw 0
ghh db '0',0dh,0ah,'$'
bnm dw 0
data ends
stack segment
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
call RAND ;产生一随机数
call MCAT ;将随机数转换为16进制表示的ASCII码字符
mov ax,bx
push ax
cmp www,0 ;WWW=0?
je A1 ;执行'+'
cmp www,1 ;www=1?
je A2 ;执行'-'
A1: mov dl,CC ;显示'+'
mov ah,2
int 21H
call RAND1 ;产生另一随机数
call MCAT ;将随机数转换为16进制表示的ASCII码字符
mov dl,GG ;显示'='
mov ah,2
int 21H
pop ax
add ax,bx
cmp ax,0
jne B1
lea dx,ghh
mov ah,9
int 21h
jmp QQ
A2: mov dl,WW ;显示'-'
mov ah,2
int 21H
call RAND1
call MCAT
mov dl,GG
mov ah,2
int 21H
pop AX
Sbb AX,BX
cmp ax,0
jne B1
lea dx,ghh
mov ah,9
int 21h
jmp QQ
B1: mov bx,ax
call MCAT
lea dx,II
mov ah,9
int 21H
QQ: mov ah,4CH
int 21H
MCAT proc ;将随机数转换为16进制表示的ASCII码字符子程序
push aX
push bx
push cX
push dX
cmp bX,9
ja s1 ;BX大于9跳转到S1
push aX
push bX
push cX
push dX
mov ax,bx
mov bl,5
div bl
cmp ah,3
jae vb1 ;大于等于3,跳转vb1
mov www,1
jmp vn1 ;无条件跳转 vn1
vb1:mov www,0
vn1:pop dx
pop cx
pop bx
pop ax
ADD bl,30H
mov AA,bl
mov AA+1,'$'
lea dx,AA ;取AA的偏移地址放在DX中
mov ah,9 ;输出一个字符串
int 21H
jmp s3
s1:mov cl,4
mov al,0
push bx ;余数进栈
shl bx,cl ;逻辑左移4位
cmp bh,9 ;如果BH小于等于9,跳转到V1
jbe V1
sub bh,9
add bh,40H
jmp QQ1 ;无条件跳转到MM1
V1:add bh,30H
;是算加法还是算减法?
QQ1:mov AA,bh
pop bx
and bl,0FH ;清BL的高四位
push ax
push bx
push cx
push dx
mov ax,bx
mov bl,5
div bl ;AH存余数,AL存商
cmp ah,3
jae vb2
mov www,1 ;减法
jmp vn2
vb2:mov www,0 ; 加法
vn2:pop dx
pop cx
pop bx
pop ax
cmp bl,9
jbe TT1
sub bl,9
add bl,40H
jmp RR1
TT1: add bl,30H
RR1: mov AA+1,bl
mov AA+2,'$'
lea dx,AA
mov ah,9
int 21H
s3:pop dx
pop cx
pop bx
pop ax
ret
MCAT endp
;一个随机数通过DX除以101,得到0~100之间的一个余数,将得到的余数作为随机数。
;随机数存在BX中
RAND proc
push dx ;保护现场,之后用到寄存器DX,AX
push ax
sti ;允许外部中断
mov ah,0 ;读时钟计数器值
int 1AH
mov ax,dx ;清高6位
and ah,3
mov dl,101 ;除101,产生0~100余数
div dl ;AL存商,AH存余数,
mov bl,ah ;余数存BL,作随机数
pop ax ;恢复现场
pop dx
ret
RAND endp
;一个随机数通过CX除以101,得到0~100之间的一个余数,将得到的余数作为随机数。
;随机数存在BL中
RAND1 proc
push cx ;保护现场,之后用到CX,DX,AX
push dx
push ax
sti ;允许外部中断
mov ah,0 ;读时钟计数器值
int 1AH
mov ax,cx ;清高6位
and ah,3
mov dl,101 ;除101,产生0~100之间的余数
div dl ;AL存商,AH存余数
mov bl,ah ;余数存在BL,作随机数
pop ax ;恢复现场
pop dx
pop cx
ret
RAND1 endp
code ends
end start
两点不明白:1)产生随机数时,清高六位是做什么用的?CC db '+'
ww db '-'
GG db '='
II db 0DH,0AH,'$'
AA db 5 DUP(?)
www dw 0
ghh db '0',0dh,0ah,'$'
bnm dw 0
data ends
stack segment
db 200 dup(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax,data
mov ds,ax
call RAND ;产生一随机数
call MCAT ;将随机数转换为16进制表示的ASCII码字符
mov ax,bx
push ax
cmp www,0 ;WWW=0?
je A1 ;执行'+'
cmp www,1 ;www=1?
je A2 ;执行'-'
A1: mov dl,CC ;显示'+'
mov ah,2
int 21H
call RAND1 ;产生另一随机数
call MCAT ;将随机数转换为16进制表示的ASCII码字符
mov dl,GG ;显示'='
mov ah,2
int 21H
pop ax
add ax,bx
cmp ax,0
jne B1
lea dx,ghh
mov ah,9
int 21h
jmp QQ
A2: mov dl,WW ;显示'-'
mov ah,2
int 21H
call RAND1
call MCAT
mov dl,GG
mov ah,2
int 21H
pop AX
Sbb AX,BX
cmp ax,0
jne B1
lea dx,ghh
mov ah,9
int 21h
jmp QQ
B1: mov bx,ax
call MCAT
lea dx,II
mov ah,9
int 21H
QQ: mov ah,4CH
int 21H
MCAT proc ;将随机数转换为16进制表示的ASCII码字符子程序
push aX
push bx
push cX
push dX
cmp bX,9
ja s1 ;BX大于9跳转到S1
push aX
push bX
push cX
push dX
mov ax,bx
mov bl,5
div bl
cmp ah,3
jae vb1 ;大于等于3,跳转vb1
mov www,1
jmp vn1 ;无条件跳转 vn1
vb1:mov www,0
vn1:pop dx
pop cx
pop bx
pop ax
ADD bl,30H
mov AA,bl
mov AA+1,'$'
lea dx,AA ;取AA的偏移地址放在DX中
mov ah,9 ;输出一个字符串
int 21H
jmp s3
s1:mov cl,4
mov al,0
push bx ;余数进栈
shl bx,cl ;逻辑左移4位
cmp bh,9 ;如果BH小于等于9,跳转到V1
jbe V1
sub bh,9
add bh,40H
jmp QQ1 ;无条件跳转到MM1
V1:add bh,30H
;是算加法还是算减法?
QQ1:mov AA,bh
pop bx
and bl,0FH ;清BL的高四位
push ax
push bx
push cx
push dx
mov ax,bx
mov bl,5
div bl ;AH存余数,AL存商
cmp ah,3
jae vb2
mov www,1 ;减法
jmp vn2
vb2:mov www,0 ; 加法
vn2:pop dx
pop cx
pop bx
pop ax
cmp bl,9
jbe TT1
sub bl,9
add bl,40H
jmp RR1
TT1: add bl,30H
RR1: mov AA+1,bl
mov AA+2,'$'
lea dx,AA
mov ah,9
int 21H
s3:pop dx
pop cx
pop bx
pop ax
ret
MCAT endp
;一个随机数通过DX除以101,得到0~100之间的一个余数,将得到的余数作为随机数。
;随机数存在BX中
RAND proc
push dx ;保护现场,之后用到寄存器DX,AX
push ax
sti ;允许外部中断
mov ah,0 ;读时钟计数器值
int 1AH
mov ax,dx ;清高6位
and ah,3
mov dl,101 ;除101,产生0~100余数
div dl ;AL存商,AH存余数,
mov bl,ah ;余数存BL,作随机数
pop ax ;恢复现场
pop dx
ret
RAND endp
;一个随机数通过CX除以101,得到0~100之间的一个余数,将得到的余数作为随机数。
;随机数存在BL中
RAND1 proc
push cx ;保护现场,之后用到CX,DX,AX
push dx
push ax
sti ;允许外部中断
mov ah,0 ;读时钟计数器值
int 1AH
mov ax,cx ;清高6位
and ah,3
mov dl,101 ;除101,产生0~100之间的余数
div dl ;AL存商,AH存余数
mov bl,ah ;余数存在BL,作随机数
pop ax ;恢复现场
pop dx
pop cx
ret
RAND1 endp
code ends
end start
2)怎样判断当前系统时间的百分秒的奇偶性?这里好像是用余数除以5再取余数,与3比较,这样就能判断了吗?