我正在使用TASM为我的学校项目开发基本的西洋双陆棋游戏。
我具有函数roll cubes
,据称它可以工作,尽管当我在主要函数上使用它时,它总是返回2-2、4-4或6-6。在这周里,我尝试使用Turbo汇编器调试代码,并且发生了一件很奇怪的事情:
[当我通过roll cubes
函数使用F7运行每一行代码时,直到call updatescreen
行,我都设法滚动随机多维数据集,它可以正常工作。但是,当我使用断点并运行整个代码直到call updatescreen
(cs:0697)
时,它将滚动2-2、4-4或6-6,就像运行exe应用程序时一样。
我的多维数据集存储在ds:31, ds:32
中。如果您需要图形以便updatescreen
功能有效,请与我联系。
proc rollCubes
xor cx, cx
mov [hicube], 0
mov [locube], 0
mov cx, 2
addAgainHigh:
; Random number [0, 3] --> two rolls [0, 6]
mov ax, 40h
mov es, ax
mov ax, es:6Ch ;Random number
and al, 00000011b
cmp al, 0 ;Make sure al isn't 0
je addAgainHigh ;If 0, roll again
add [hicube], al ;add to cube value
loop addAgainHigh
mov cx, 2
addAgainLow:
; Random number [0, 3] --> two rolls [0, 6]
mov ax, 40h
mov es, ax
mov ax, es:6Ch
and al, 00000011b
cmp al, 0
je addAgainLow
add [locube], al
loop addAgainLow
mov al, [locube]
mov ah, [hicube]
ret
endp rollCubes
您的代码读取某个数字(BIOS.Timer),并且仅保留可能值{1,2,3}的子集。重复之后,您将得到{2,3,4,5,6}。 您永远不能这样滚动1
掷骰子应产生从1到6的数字。
call myRandom ; -> AX = [0,65535]
xor dx, dx
mov cx, 6
div cx ; -> Remainder DX = [0,5]
inc dx ; -> Dice is [1,6]
...
proc myRandom
imul ax, [NextRandom], 25173
add ax, 13849
xor ax, 62832
mov [NextRandom], ax
ret
endp myRandom