Bonjour,
Je sais que le forum doit être utilisé pour résoudre des problèmes de programmation mais j’ai besoin de personnes qui s’y connaissent et qui peuvent critiquer un code source afin de l’amélioré.
Voilà, j’ai tappé ce petit programme en assembleur (avec NASM) afin de vérifier si un mot entré par l’utilisateur est un palindrome ou non (chose que l’on a tous fait dans tous les languages de prog :p).
Voici le code:
[BITS 16]
[ORG 100h]
%define MAX_SIZE 80h; /!\ max:100h
start:
;lecture de la chaîne
mov cl,MAX_SIZE
lea bx,[palindrome]
call readline;bx => Récupération de la chaine & si => longueur
;Calcul de la moité de longueur
mov ax, si
mov cl, 2
div cl;al = quotient, ah = reste
;Lancement de la comparaison
mov di, 0
xor ch, ch
mov cl, al
.compa
mov dl, byte [bx + si - 1]
mov dh, byte [bx + di]
cmp dl, dh;Comparaison des deux 'bouts'
jne .notequ
inc di; Passage au prochaines car à comparer
dec si;
loop .compa
.equ:
mov ah, 09h
mov dx, bx
int 21h
mov dx, isequ
int 21h
ret
.notequ:
mov ah, 09h
mov dx, bx
int 21h
mov dx, isnequ
int 21h
ret
;Code pour la lecture d'une chaîne de car.
; entrées: bx = Endroit de la mémoire ou stocker le mot & cl = taille maximale du buffer (max 255)
; retour: bx = Récupération de la chaine & si = longueur
readline:
mov ah, 0Ah;Pour la lecture (interruption 20h)
mov byte [bx], cl; Enregistrement de la taille du buffer max
mov dx, bx;Chaine sur dx (interruption 20h)
int 21h;lecture de la chaine de ds:dx (ah = Ah)
;Lecture de la taille du buffer trouvé
xor cx, cx
mov cl, [byte bx+1];récupération de la taille tappée
mov si, cx;cx ==> pointeur
add bx, 2
mov byte [bx+si], '$';Ajout du '$' à la fin
retn
isequ db " est un palindrome", '$'
isnequ db " n'est pas un palindrome", '$'
palindrome resb MAX_SIZE
Je ne sais pas si vous voyez des choses à modifier afin d’améliorer le programme, du point de vue de l’optimisation par exemple.
Autre petite question, qui touche toujours à l’assembleur.
Sous NASM il n’existe pas la directive ASSUME. Es-ce handicapant sachant que MASM et TASM l’utilisent?