2017-02-11 5 views
-3

encore sur ce projet que j'ai, im essayant d'imprimer un tableau et rien ne se passe ... aucune erreur ou quoi que ce soit, la seule chose qui arrive est que l'utilisateur peut entrer 9 caractères et que le programme se termine le programme a besoin d'obtenir 9 chiffres entre 0 et 9 et diviser les groupes a, b et cAsm programme ne donne pas de sortie

MODEL small 
STACK 100h 
DATASEG 
Welcome db "Welcome, please enter 9 numbers between 0 and 9: $" 
MainArr db 9 dup(0) 
Aarr db 9 dup(0) 
Barr db 9 dup(0) 
Carr db 9 dup(0) 
AarrLength db ? 
BarrLength db ? 
CarrLength db ? 
CODESEG 
start: 
mov ax, @data 
mov ds, ax 

mov dx, offset Welcome 
mov ah, 9 
int 21h 
xor di, di 
xor bx, bx 
mov si, 0 
mov cx, 0 
jmp gettingInput 
gettingInput: 
inc cx 
cmp cx, 10 
je continue 
mov ah, 1h 
int 21h 
mov [MainArr+si], al 
inc si 
cmp al, 8 
jge zoneA 
cmp al, 6 
jb zoneC 
jmp zoneB 

zoneA: 
mov [Aarr+bx],al 
inc bx 
jmp gettingInput 

zoneB: 
mov [Barr+si],al 
inc si 
jmp gettingInput 

zoneC: 
mov [Carr+di],al 
inc di 
jmp gettingInput 

continue: 

mov cx, 9 
xor ax, ax 
mov si, offset Aarr 
findLengthA: 
cmp [si], 0 
je foundLength 
inc ax 
loop findLengthA 

foundLengthA: 
mov [AarrLength], al 

mov cx, 9 
xor ax, ax 
mov si, offset Barr 
findLengthB: 
cmp [si], 0 
je foundLength 
inc ax 
loop findLengthB 

foundLengthB: 
mov [BarrLength], al 


mov cx, 9 
xor ax, ax 
mov si, offset Carr 
findLengthC: 
cmp [si], 0 
je foundLength 
inc ax 
loop findLengthC 

foundLength: 
mov [CarrLength], al 


mov bl, AarrLength 
mov bh, 0 
inc bx 
inc bx 
mov [offset Aarr + bx], '$' 
mov si, offset Aarr 
printA: 
mov ah, 9h 
mov dx, offset Aarr 
int 21 


exit: 
mov ax, 4c00h 
int 21h 
END start 
+4

Commentez votre code, surtout si vous voulez que d'autres personnes vous aident. En outre, apprenez à utiliser un débogueur. – Jester

Répondre

0

Je soupçonne que le problème réside dans vos régions ZoneA, B, C. Vous semblez compter sur des registres pour maintenir la longueur de vos tableaux. Je vous suggère de charger et stocker les variables de longueur de tableau réelles dans chaque zone. Vous utilisez également si dans le tableau principal, donc je suis sûr que c'est un bug.

0

Vous oubliez que l'entrée est un caractère. Pourtant, vous comparez comme si c'était une petite valeur!

mov ah, 1h 
int 21h 
mov [MainArr+si], al 
inc si 
cmp al, "8"  <--- Compare as character 
jge zoneA 
cmp al, "6"  <--- Compare as character 
jb zoneC 
jmp zoneB 

En raison de cette erreur, toutes les terres de données dans le tAMr. Heureusement, il s'avère, à cause des autres erreurs!
S'il vous plaît noter:

  • ZoneA obtient "8", "9"
  • ZoneB obtient "6", "7"
  • zoneC obtient "0", "1", "2", " 3 "," 4 "," 5 "

Cela ne semble pas être ce que vous vouliez, en regardant votre question précédente !!!


je foundLength 

Dans les cas A et B, vous devez ramifier à foundLengthA et foundLengthB respectivement.


Vous ne pouvez pas utiliser le registre SI pour répondre à la fois la MainArr et le Barr en même temps!
Soit utiliser

  • variables telles que @AustinHastings a suggéré
  • ou bien utiliser le registre BP avec un segment explicite override mov [ds:Barr+bp], alinc bp

Il y a plusieurs problèmes avec la façon dont vous affichez la Aarr tableau. Ceci est la façon correcte:

mov bl, AarrLength 
mov bh, 0    <--- No need to use INC BX twice 
mov [Aarr + bx], '$' 
mov ah, 09h 
mov dx, offset Aarr 
int 21h    <--- Don't forget the "h" for hexadecimal 

Afin de vous assurer que votre recherche de la terminaison zéro dans chacun des 3 tableaux est réussi, faire le stockage de 10 octets. Dans le cas où toutes les 9 entrées entrent dans le même tableau, vous trouverez toujours un zéro final.

Aarr db 10 dup(0) 
Barr db 10 dup(0) 
Carr db 10 dup(0) 
+0

Est-ce important si j'utilise 'si' dans' mainArr' et 'Barr'? –

+0

car le registre n'est pas utilisé aux deux endroits en même temps –

+0

n'imprime toujours rien –