2017-05-23 3 views
0

J'ai eu et résolu ce problème plusieurs fois maintenant, mais je ne sais toujours pas comment je l'ai résolu. C'est la troisième fois que j'ai cette erreur particulière et je ne peux pas la réparer.Pourquoi est-ce que j'obtiens une erreur de «saut relatif hors limites» à chaque fois que j'ajoute du code?

Le code est assez long (mais répétitif) donc je vais couper juste les parties importantes

Ceci est la partie où je change et obtenir des erreurs

call putx 

fou: 
    cmp al,'4' 
    jE fou1 
    jNE fiv 

    fou1: 

    mov ah, 02 
    ;mov ch, 8 
    mov dh, 8 
    ;mov cl, 30 
    mov dl, 30 
    int 10h 

    call putx 

    fiv: 
     cmp al,'5' 
     jE fiv1 
     jNE six 

     fiv1: 
     mov ah, 02 
     mov dh, 8 
     mov dl, 34 
     int 10h 

     call putx 

     six: 
      mov ah,'3' 

Chaque fois que j'ajouter du code à « six: » Je reçois l'erreur ici sur 140 disant « Jump relative hors de portée par 0002h octets

Stosb     ;Else no put the byte in the buffer 
cmp bl,32h 
Je pl1 
Jne wla 
    pl1: 
    mov ah,09 
    lea dx,p1 
Stosb     ;Else no put the byte in the buffer 
cmp bl,32h 
Je pl1 
Jne wla ;this is line 140 
    pl1: 
    mov ah,09 
    lea dx,p1 

Qu'est-ce que cela signifie? Que signifie 0002 octets? Je ne sais pas pourquoi j'ai cette erreur. Je l'ai résolu plus tôt mais je ne sais pas comment.

Voici le code complet si nécessaire. Nu avec moi, il est long (je ne sais pas où l'erreur peut être donc je vais le mettre dans son ensemble)

.model small 
.code 
org 100h 

start: 


start: jmp main 
lin db "|===|===|===|$" 
r1 db "| 1 | 2 | 3 |$" 
r2 db "| 4 | 5 | 6 |$" 
r3 db"| 7 | 8 | 9 |$" 
spa db 0ah,0dh,24h 

p1 db"Player 1's Turn (X) : $" 
p2 db"Player 2's Turn (O) : $" 


main: 

;start of the crap 
mov ah, 02 
mov ch, 5 
mov dh, 5 
mov cl, 28 
mov dl, 28 
int 10h 

call line 
call down 
call row1 

mov ah,09 
lea dx,r1 
int 21h 

call down 
;le end 



;start of the crap 
mov ah, 02 
mov ch, 7 
mov dh, 7 
mov cl, 28 
mov dl, 28 
int 10h 

call line 
call down 
call row2 

mov ah,09 
lea dx,r2 
int 21h 

call down 
;le end 




;start of the crap 
mov ah, 02 
mov ch, 9 
mov dh, 9 
mov cl, 28 
mov dl, 28 
int 10h 

call line 
call down 
call row3 

mov ah,09 
lea dx,r3 
int 21h 

call down 
;le end 

mov ah, 02 
mov ch, 11 
mov dh, 11 
mov cl, 28 
mov dl, 28 
int 10h 

call line 
call down 





;input goes here 
mov ah, 02 
mov ch, 20 
mov dh, 20 
mov cl, 10 
mov dl, 10 
int 10h 

mov ah,09 
lea dx,p1 
int 21h 

mov ah,02 
mov dl,al 
int 21h 

call down 



;mov cx,2 
;again: 
      CLD      ;Incrementing direction 
    mov bl,30h 
    Get_another_byte: 

    add bl,1h 
    call down 
    mov ah,02 
    mov dl,bl 
    int 21h    ;show the bl 

    Mov AH, 7    ;Ms.Dos code to get one char 
    Int 21h     ;Ms.Dos does that for us and puts it in AL 

    Cmp AL, 20h    ;Did he hit the return key ? 
    Je exi   ;Yes, now we can go on 

    Stosb     ;Else no put the byte in the buffer 
    cmp bl,32h 
    Je pl1 
    Jne wla 
     pl1: 
     mov ah,09 
     lea dx,p1 
     int 21h 

     mov ah,02 
     mov dl,al 
     int 21h 

      ;code ni player 1 

cmp al,'1' 
jE one 
jNE two 

one: 

mov ah, 02 
mov ch, 6 
mov dh, 6 
mov cl, 30 
mov dl, 30 
int 10h 


call putx 

two: 

    cmp al,'2' 
    jE two1 
    jNE thr 

    two1: 

    mov ah, 02 
    mov ch, 6 
    mov dh, 6 
    mov cl, 34 
    mov dl, 34 
    int 10h 

    call putx 


    thr: 

    cmp al,'3' 
    jE thr1 
    jNE fou 

    thr1: 

    mov ah, 02 
    mov ch, 6 
    mov dh, 6 
    mov cl, 38 
    mov dl, 38 
    int 10h 

    call putx 

    fou: 
     cmp al,'4' 
     jE fou1 
     jNE fiv 

     fou1: 

     mov ah, 02 
     ;mov ch, 8 
     mov dh, 8 
     ;mov cl, 30 
     mov dl, 30 
     int 10h 

     call putx 

     fiv: 
      cmp al,'5' 
      jE fiv1 
      jNE six 

      fiv1: 
      mov ah, 02 
      mov dh, 8 
      mov dl, 34 
      int 10h 

      call putx 

      six: 
       mov ah,'3' 


    taps: 
    mov bl,30h 
    jmp Get_another_byte 

    exi: 
    jmp exit 
      ;end of code player1 

     ;mov bl,30h 
     sub bl, 2h ;babalik niya yung 32 sa 1 (32-2 = 31) 
     call down 
     Jmp Get_another_byte 
    wla: 
     mov ah,09 
     lea dx,p2 
     int 21h 

     mov ah,02 
     mov dl,al 
     int 21h 

     ;mov bl,30h 
     call down 
     Jmp Get_another_byte ;He's not done, so keep on 

;loop again 


row1 proc 
    mov ah, 02 
    mov ch, 6 
    mov dh, 6 
    mov cl, 28 
    mov dl, 28 
    int 10h 
    ret 
row1 endp 


row2 proc 
    mov ah, 02 
    mov ch, 8 
    mov dh, 8 
    mov cl, 28 
    mov dl, 28 
    int 10h 
    ret 
row2 endp 


row3 proc 
    mov ah, 02 
    mov ch, 10 
    mov dh, 10 
    mov cl, 28 
    mov dl, 28 
    int 10h 
    ret 
row3 endp 




line proc 
    mov ah, 09 
    lea dx, lin 
    int 21h 
    ret 
line endp 

down proc 
    mov ah, 09 
    lea dx, spa 
    int 21h 
    ret 
down endp 



putx proc 
    mov ah,02 
    mov dl,"X" 
    int 21h 
    ret 
putx endp 


    exit: 

int 20h 
end start 
+1

Vous avez oublié de dire à votre assembleur que vous avez un processeur qui prend en charge les sauts de 16 bits et que votre code dépasse les distances par défaut de 8 bits. Spécifiez cpu ou réécrivez votre code de sorte qu'il ne nécessite pas de longs sauts conditionnels. L'astuce habituelle consiste à inverser la condition et à utiliser une plage plus longue inconditionnelle 'jmp'. En fait, votre code est déjà configuré pour cela, un 'jne' après un' je' peut être juste un 'jmp' ... – Jester

+0

Je ne pensais pas que c'était ce genre de problème. Merci de répondre. Comment spécifiez-vous cpu? Si jamais je ne peux pas réécrire le code avec des conditions plus courtes – Leia

+0

regardez le codage de l'instruction, les sauts relatifs auront un décalage relatif pc dans le codage. il y a seulement beaucoup de bits pour chaque encodage, certains ne peuvent atteindre que 127 octets vers l'avant si vous le demandez pour aller 129 alors vous êtes 2 octets plus loin que ça peut aller ... –

Répondre

1

Le saut relatif utilise un octet comme un décalage, donc il ne peut sauter 127 Octets vers l'avant et 128 octets vers l'arrière.
Si vous voulez sauter plus d'octets vers l'avant ou vers l'arrière, vous devez spécifier un processeur qui supporte cela, ce qui n'est pas le cas de l'original 8086. Si vous utilisez MASM, placez .386 au début du fichier, cela activera les extensions spécifiques introduites après le 8086. L'une de ces extensions est le décalage relatif de 16 bits, ce qui est amplement suffisant pour votre usage. Si vous utilisez un autre assembleur, tapez: assembler directives [assembler name] cpu.
Cela devrait résoudre votre problème.

+0

Merci. Cela a beaucoup aidé – Leia