Сборка - инструкция cmp всегда проходит - PullRequest
2 голосов
/ 17 октября 2019

Я играю в крестики-нолики и при создании функции проверяю, выиграл ли игрок. В целях тестирования я заставил программу просто выйти, когда игрок выиграл. Просто для запуска я заставил программу проверить только 1-ю строку:

0, 0, 0 ==> эту строку
0, 0, 0
0, 0, 0

Я столкнулся с проблемой, что программа существует каждый раз, когда я меняю позицию A на X или O, за исключением , когда я выбираю одну из позиций, которые проверяются программой (поэтому, если я выберу любую позицию в 1-й строке).
Код функции находится в конце

Я не хочу включать весь код, потому что я не просто печатаю его вна экране, но рисую его в графическом режиме (ах = 13h и 10h). Я просто покажу вам основной цикл и функцию checkIfWon, которые я отфильтровал только для важных вещей. Это код: определение платы:

.data
board   db 0,0,0
        db 0,0,0
        db 0,0,0

Функция CheckIfWon:

checkIfWon proc
    ; check rows
    ; Equal to: if (board[0] == board[1] && board[1] == board[2])
    movsx   eax, byte ptr [board]
    movsx   ecx, byte ptr [board+1]
    cmp     eax, ecx
    jne     cont

    movsx   eax, byte ptr [board]
    movsx   ecx, byte ptr [board+2]
    cmp     eax, ecx
    jne     cont

    mov ax, 4c00h
    int 21h

    cont:
    ret  

ret
endp checkIfWon
.386
; mainloop
mainloop:
    ; check for exit button (ESC)...
    ; get mouse button and cursor position...
    ;;;;;;;;;;;;;;;;;;;;;;; Check if mouse is on one of the positions 

        box0:
        ; check if it got clicked...
        drawXplayer0:
        ; draw X
        jmp boxHitten
        drawOplayer0:
        ; draw o

        jmp boxHitten

    box1:
        ; check if it got clicked...
        drawXplayer1:
            ; draw X
            jmp boxHitten
        drawOplayer1:
            ; draw o

        jmp boxHitten

    box2:
        ; check if it got clicked...
        drawXplayer2:
            ; draw X
            jmp boxHitten
        drawOplayer2:
            ; draw o

        jmp boxHitten

    box3:
        ; check if it got clicked...
        drawXplayer3:
            ; draw X
            jmp boxHitten
        drawOplayer3:
            ; draw o

        jmp boxHitten

    box4:
        ; check if it got clicked...
        drawXplayer4:
            ; draw X
            jmp boxHitten
        drawOplayer4:
            ; draw o

        jmp boxHitten

    box5:
        ; check if it got clicked...
        drawXplayer5:
            ; draw X
            jmp boxHitten
        drawOplayer5:
            ; draw o

        jmp boxHitten

    box6:
        ; check if it got clicked...
        drawXplayer6:
            ; draw X
            jmp boxHitten
        drawOplayer6:
            ; draw o

        jmp boxHitten

    box7:
        ; check if it got clicked...
        drawXplayer7:
            ; draw X
            jmp boxHitten
        drawOplayer7:
            ; draw o

        jmp boxHitten

    box8:
        ; check if it got clicked...
        drawXplayer8:
            ; draw X
            jmp boxHitten
        drawOplayer8:
            ; draw o

        jmp boxHitten

    boxHitten:  
        ; Fix overdrawn borders
        call drawBoard

        ; set cursor position 
        mov  dl, 1
        mov  dh, 1
        mov  bh, 0    ;Display page     
        mov  ah, 02h  ;SetCursorPosition
        int  10h
        ;
        ; change player
        ; if player='x': player='O' else player=x'

        ; here im playing a sound that tells the user he clicked


        ; delay
        push 500 ; 0.5 secs
        call delay
        call checkIfWon
        jmp mainloop

    takenError:
        push 14000 ; frequency for bad answer
        push 200       ; duration milliseconds
        call play

        ; delay
        push 1000
        call delay
        jmp mainloop




Программа не выходит (как я и хотел): example Существует (не то, что я хотел): notwhatiwanted

В чем может быть причина того, что программа пропускает его?

РЕДАКТИРОВАТЬ:
Я нашел решение, см. комментарий

1 Ответ

1 голос
/ 17 октября 2019

Я нашел решение моей проблемы:
Дело в том, что я определил плату как

доска дБ 0,0,0
дБ 0,0,0
дБ 0,0,0

Чек просто проходил каждый раз, так как они оба равны 0.
И когда я щелкаю что-то в позиции, доска меняется на

доска X, 0,0
0,0,0
0,0,0

Тогда проверка не проходит.
решениекод:

checkIfWon proc
     ; check rows
     ; Equal to: if (board[0] != 0 && board[0] == board[1] && board[1] == board[2])
     movsx   eax, byte ptr [board]
     movsx   ecx, byte ptr [board+1]
     cmp     eax, 0
     je cont
     cmp     eax, ecx
     jne     cont

     movsx   eax, byte ptr [board]
     movsx   ecx, byte ptr [board+2]
     cmp     eax, ecx
     jne     cont

     mov ax, 4c00h
     int 21h

cont:
    ret  

ret
endp checkIfWon
...