无法通过滚动立方体功能修复Bug程序集8086

问题描述 投票:1回答:1

我正在使用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
assembly x86-16 tasm
1个回答
0
投票

您的代码读取某个数字(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
© www.soinside.com 2019 - 2024. All rights reserved.