сборка 8086 - оценка не работает должным образом - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь напечатать этот счет, чтобы создать игру, и счет печатается только в одну сторону (когда я увеличиваю счет, он печатает счет только в одну сторону, другая остается равной нулю. Это код, спасибо.

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

1 Ответ

2 голосов
/ 04 апреля 2020

Что-то, что вызывает наибольшее беспокойство.

; 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

Функция 02h B IOS .SetCursor ожидает, что вы передадите символьные координаты ячейки для нужного курсора должность. Количество ячеек символов в строке никогда не может превышать 255, и такой же предел применяется к координате строки. Если вы скажете, что стремитесь к середине экрана и передаете значение 170 для координаты столбца, на вашем экране будет около 340 столбцов! Это невозможно с этим вызовом B IOS. Вы путаетесь между координатами символов и координатами пикселей?

Например, середина цветного экрана 320x200 256 имеет координату курсора (20,12), потому что есть только 40 столбцов и 25 строк.

причина, по которой 2-й счет остается нулевым

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

Когда вы сравниваете какое-либо значение с 0, вы можете никогда получить код условия ниже, Поэтому инструкция jb goal_2 не будет никогда переходить туда, куда вы хотели бы увеличить score2 .

Видеть cmp [ballX], 315 ja goal_1 и с учетом симметрии, мой Предполагается, что вы используете экран шириной 320 пикселей. Возможно, решение состоит в том, чтобы написать cmp [ballX], 4 jb goal_2?

...