Ben encore heureux que tu es là
Alors : je dois faire le test "palindrome" sur toute la chaine et pas sur chaque mot séparément. Cependant, dans la chaine, je dois sauter les espaces ! De sorte que "aze r ty y tre za" soit bien un palindrome alors que ce n'est pas vraiment symétrique à première vue ("géométriquement" parlant ...).
Donc, je crois que l'algo que tu as proposé à la fin correspond bien à ce que je cherche à faire ! Et je pense que c'est grosso modo ce que mon programme fait ! Je vais essayer de le réexpliquer ! Parce que tu vois, je préfèrerais comprendre pourquoi le mien ne fonctionne pas ! Je pourrais naturellement faire d'autres versions, mais ça m'ennuie de ne pas comprendre pourquoi celui-ci ne va pas !
Donc, je reprend en détail ! J'espère que tu pourras trouver ce qui coince parce que je cale sérieusement !
.model small
.stack
.data
ac_intro DB "Veuillez entrer la chaine de caractères à tester : $"
ac_pos DB 0ah, 0dh, "La chaine que vous avez entré est un palindrome !$"
ac_neg DB 0ah, 0dh, "La chaine que vous avez entré n'est pas un palindrome !$"
ac_work DB 250, ?, 251 dup ('$'
.code
main :
mov ax, @data
mov ds, ax
mov ax, 0900h
lea dx, ac_intro
int 21h ;affichage du message d'intro
mov ax, 0a00h
lea dx, ac_work
int 21h
;Cette sous fonction du DOS permet de saisir une chaine avec un certain nombre de caractère maximum. Ce nombre est placé dans le premier octet du tableau ac_work (ici : 250). Elle place les caractères encodés dans le 3° octet et les suivants (j'ai prévu 251 emplacements). Elle renvoie en plus le nombre de caractère qui a été effectivement encodé par l'utilisateur et place ce nombre dans le second octet de ac_work (à la place du '?'). |
mov si, 2
mov di, ac_work[1]
inc di
;Le registre SI correspond à ton "adresse deb" (plus ou moins, car c'est en fait l'offset par rapport à l'adresse de ac_work) et DI à "adresse fin". Je place si sur le premier caractère de la chaine encodée (qui se trouve au 3° octet du tableau ac_work)(si je voulais pointer le 1° caractère, je mettrais si à 0, pour le 2°, si=1 et pour le 3°, si=2).
Pour di, je récupère le nombre de caractère encodés par l'utilisateur stocké dans le 2° octet du tableau ac_work (à la place du '?') et puisque le début de la chaine est en 2 et non en 0, j'ajoute 1 à di. D'après les tests que j'ai pu faire, si et di sont correctement initialisés. |
until :
cmp si, di
jae fin1
cmp ac_work[si], 20h
je si_space
cmp ac_work[di], 20h
je di_space
mov dl, ac_work[di]
cmp ac_work[si], dl
jne fin2
dec di
inc si
jmp until
si_space :
inc si
jmp until
di_space :
dec di
jmp until
;Pour toute la boucle, voici ce que je fais :
boucle:
if (si >= di) {c'est un palindrome ;}
if (ac_work[si]==' ') {si = si + 1; retour à l'étiquette "boucle"}
if (ac_work[di]==' ') {di = di - 1; retour à l'étiquette "boucle"} /*De cette manière, j'ignore bien TOUS les espaces, où qu'ils soient*/
if (ac_work[si] == ac_work[di]) {si = si + 1; di = di - 1; retour à l'étiquette "boucle"}
else {ce n'est pas un palindrome}
|
fin1 :
mov ax, 0900h ; affichage du message de succès
lea dx, ac_pos
int 21h
jmp quit
fin2 :
mov ax, 0900h ; affichage du message d'échec
lea dx, ac_neg
int 21h
quit :
mov ax, 4c00h
int 21h
end main
Voila ! Donc, je sais bien que je peux faire d'autres versions de ce programme, et c'est ce que je ferai si personne ne trouve mon erreur ! Mais j'aimerais vraiment bien comprendre pourquoi ceci ne fonctionne pas !
Merci pour ton aide (et celle des autres, s'il y en a un jour