【问题标题】:assembly 8086 - score isn't working properly程序集 8086 - 分数无法正常工作
【发布时间】:2020-04-02 22:03:55
【问题描述】:

我正在尝试打印此分数以创建游戏,并且分数仅打印在一侧,(当我增加 分数,它只在一侧打印分数,另一侧保持零。这是代码,谢谢。

proc print_score
    ; prints the points in the middle of the screen:

    ; set cursor to the middle:
    mov  dl, 170  
    mov  dh, 45   
    mov  bh, 0
    mov  ah, 02h  
    int  10h
    ; print scores, knowing it can be 0-9 (aka one char):
    mov al, [Score1]
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0eh
    add al, '0'
    int 10h

    ; score1:score2
    mov al, ':'
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0Eh
    int 10h

    mov al, [Score2]
    mov bl, 0Fh
    mov bh, 0
    mov ah, 0eh
    add al, '0'
    int 10h

    ret
endp print_score

    proc check_goal
    pusha
;if player 1 scores to player2 inc his score
check_goal_player1:
    cmp [ballX],315d
    ja  goal_1

    jmp check_goal_player2

goal_1:
    inc [score1]

    call refrash
    ;call player_2_scored

    jmp new_round

check_goal_player2:
    cmp [ballX],0d
    jb goal_2

    jmp no_update

goal_2:

    inc [score2]
    call refrash

    ;call player_1_scored
new_round:


    call restore_ball_possition
    jmp no_update

no_update:


    popa
    ret
endp check_goal

【问题讨论】:

  • 两半的打印代码看起来相同(除了 Score1 与 Score2),因此问题可能出在其他地方。使用调试器查看内存(和寄存器)中的值。如果 Score2 没有增加,那么这个正确(?)打印什么的代码不是你的问题的minimal reproducible example
  • 是否打印冒号?还是只是 Score1 的值?
  • 它,应该同时打印 score1 和 2 的值。当我将分数增加 1 或 2 时,它应该在 2 个位置(score1:score2)打印它,它只在一侧打印分数跨度>
  • 但是你没有回答我的问题。它是否打印两个分数之间的分隔符?它总是打印 Score1 吗?还是它总是打印 Score2? Score1Score2 是如何定义的?你确定你保存的分数正确吗?您是否在调试器中运行代码以查看 [Score1][Score2] 中的内容。您显示的打印代码不太可能是问题所在,因此除非您能回答我们的问题或提供更多代码供我们查看,否则很难为您提供帮助。
  • 谢谢,我会尝试调试过程。它只是打印两个分数之间的分隔符。分数定义为字节(db)

标签: assembly x86-16 tasm


【解决方案1】:

最令人不安的事情。

; prints the points in the middle of the screen:
; set cursor to the middle:
mov  dl, 170  
mov  dh, 45   
mov  bh, 0
mov  ah, 02h  
int  10h

BIOS.SetCursor 函数 02h 要求您传递 字符单元坐标 以获得所需的光标位置。一行上的字符单元格数不能超过 255,同样的限制适用于行坐标。如果您说您的目标是屏幕中间并为列坐标传递一个值 170,那么您的屏幕将有大约 340 列!使用此 BIOS 调用是不可能的。你是否对字符坐标和像素坐标感到困惑?

例如320x200 256 色屏幕的中间有光标坐标 (20,12),因为只有 40 列和 25 行。

第二个分数为零的原因

check_goal_player2:
    cmp [ballX],0d
    jb goal_2
    jmp no_update
goal_2:
    inc [score2]

当您将某个值与 0 进行比较时,您可以永远得到 below 条件代码。因此jb goal_2 指令将从不跳转到您想要增加分数的位置score2

看到 cmp [ballX], 315 ja goal_1 并考虑到对称性,我猜您使用的是 320 像素宽的屏幕。也许解决方案是写cmp [ballX], 4jb goal_2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2012-08-24
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多