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
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
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
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 ... –