DOSBox获取随机数的思路
16位汇编好像没有得到随机数的方法,然后我想到了个替代方法,用当前时间来模拟随机数。但考虑到第二次调用时随机性不够大,所以再加了个假随机数表的方式来模拟,双重随机,使得每次调用都能获得较为合理的随机数。
效果:每调用一次就在屏幕显示一个$$,想看到效果最好是调用+延时的方式,这样可以在屏幕上不断地出现$$
{:5_109:}
代码↓↓↓
rand : jmp short sr
seat db 0,0,0,0,0 ;第一个是列的随机数表的指向位置,四为果子x,五为果子y
table1 db 5,2,7,1,8,0,5,9,4,3,6,7,8,1,9,2,6,0,3,4 ;x坐标的个位
table2 db 0ah,14h,0,14h,1dh,0ah,1dh,0ah,0,14h,0,1dh ;x坐标的十位,0,10,20,30
table3 db 2,15,22,16,13,0,12,9,19,11,1,7,21,18,6,16,17,8,4,12,14,20,3,10,5,18 ;y坐标
sr : push ax
push ds
push bx
push cx
push es
mov ax,cs
mov ds,ax ;这是写在代码段的
mov al,0
out 70h,al
in al,71h ;获取时间秒,下面处理秒
mov ah,al
mov cl,4
shr ah,cl
and al,00001111b
mov cl,seat
mov bl,cl
add bl,al
cmp bl,13h
jna bz1
sub bl,14h
bz1:mov seat,bl
mov bh,0
mov bh,table1
mov cl,seat
mov bl,cl
add bl,ah
cmp bl,0bh
jna bz2
sub bl,0ch
bz2:mov seat,bl
mov cl,bh
mov bh,0
mov bh,table2
add bh,cl
cmp bh,25h
jna bz3
sub bh,al
sub bh,ah
sub bh,al
bz3:mov seat,bh
mov al,2
out 70h,al
in al,71h ;获取时间分,下面处理分
and al,00001111b
mov cl,seat
mov bl,cl
add bl,al
cmp bl,16h ;判断是否超过16h
jna bz4
sub bl,17h
bz4:mov seat,bl
mov bh,0
mov bh,table3
mov seat,bh
mov ax,0b800h ;下面是显示$
mov es,ax
mov al,seat
add al,1
mov ah,0
mov bl,160 ;y坐标*160
mul bl
mov bl,seat
mov bh,0
add bx,bx
add bx,bx
add ax,bx
add ax,4
mov bx,ax
mov al,'
mov ah,46h
mov es:,al
mov es:,ah
mov es:,al
mov es:,ah
pop es
pop cx
pop bx
pop ds
pop ax
ret 这个跟数学太相关了,调用API就行了。 bitravel 发表于 2019-9-19 18:45
这个跟数学太相关了,调用API就行了。
啊?DOS汇编有API么,这我不知道啊
页:
[1]