Palindrome en ASM

bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008 - 30 janv. 2003 à 18:09
Cygace Messages postés 4 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 11 janvier 2008 - 5 déc. 2003 à 09:11
Salut,

Quelqu'un pourrait-il m'aider, je suis débutant en asm et je dois faire un exrecice sur un palindrome c'est-à-dire que je dois entrer au clavier un mot ou une phrase il le programme dois dire si c'est un palindrome ou non?

Merci d'avance

12 réponses

bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008
30 janv. 2003 à 18:09
-------------------------------
Réponse au message :
-------------------------------

> Salut,
>
> Quelqu'un pourrait-il m'aider, je suis débutant en asm et je dois faire un exrecice sur un palindrome c'est-à-dire que je dois entrer au clavier un mot ou une phrase il le programme dois dire si c'est un palindrome ou non?
>
> Merci d'avance
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2003 à 21:26
-------------------------------
Réponse au message :
-------------------------------

> Salut,
>
> Quelqu'un pourrait-il m'aider, je suis débutant en asm et je dois faire un exrecice sur un palindrome c'est-à-dire que je dois entrer au clavier un mot ou une phrase il le programme dois dire si c'est un palindrome ou non?
>
> Merci d'avance

passe ptr sur chaine dans EDX
en sortie si EAX == 0 alors EST Palindrome

mov edx, offset chaine
call Palindrome
test eax, eax
jne short ERREUR

Palindrome PROC ; *psz dans EDX mov ecx, edx ; EDX d, ECX c
xor eax, eax
L1:
cmp byte ptr[edx], 0
je short L2
inc edx
jmp short L1
L2:
cmp ecx, edx
je short plndExit ; chaine vide
dec edx
L3:
cmp ecx, edx
jae short plndExit
mov al, [ecx]
sub al, byte ptr[edx]
jne short plndExit
inc ecx
dec edx
jmp short L3
xor al, al
plndExit:
ret 0
Palindrome ENDP

ciao...
0
bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008
30 janv. 2003 à 21:32
-------------------------------
Réponse au message :
-------------------------------

Tu ne serais pas expliquer ce que tu as fait sltp, merci
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2003 à 21:54
-------------------------------
Réponse au message :
-------------------------------

>
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> Tu ne serais pas expliquer ce que tu as fait sltp, merci
tu mets ECX à pointer au debut chaine.
ensuite xor eax, eax
prepare la sortie OK
tu pousses edx jusqu'au zero final de chaine.
L2:
cmp ecx, edx
je short plndExit ; chaine vide
dec edx ramène sur dernier
L3:
cmp ecx, edx ; en C serait while(ECX < EDX)
jae short plndExit
mov al, [ecx]
sub al, byte ptr[edx]
jne short plndExit ; ne sont pas egaux donc sort != 0
inc ecx
dec edx
jmp short L3
xor al, al
plndExit:
ret 0 aucun param sur pile
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008
30 janv. 2003 à 22:14
-------------------------------
Réponse au message :
-------------------------------

Voilà ce que j'ai fait mais je ne vois ce que je dois modifier pour que sa fonctionne avec ce que tu as fait:

Source:

.MODEL SMALL
.STACK
.DATA

AcMsg1 db "Entrez un mot ou une phrase: $"
AcMsg2 db "Bravo, Il s'agit d'un Palindrome"
AcMsg3 db "Non, Il ne s'agit pas d'un Palindrome"

.Code

Palindrome PROC ; *psz dans EDXmov ecx, edx ; EDX d, ECX c
xor eax, eax
L1:
cmp byte ptr[edx], 0
je short L2
inc edx
jmp short L1
L2:
cmp ecx, edx
je short plndExit ; chaine vide
dec edx
L3:
cmp ecx, edx
jae short plndExit
mov al, [ecx]
sub al, byte ptr[edx]
jne short plndExit
inc ecx
dec edx
jmp short L3
xor al, al
plndExit:
ret 0
Palindrome ENDP
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
30 janv. 2003 à 22:23
-------------------------------
Réponse au message :
-------------------------------

> -------------------------------
> Réponse au message :
> -------------------------------
>
> Voilà ce que j'ai fait mais je ne vois ce que je dois modifier pour que sa fonctionne avec ce que tu as fait:
>
> Source:
>
> .MODEL SMALL
> .STACK
> .DATA
>
> AcMsg1 db "Entrez un mot ou une phrase: $"
> AcMsg2 db "Bravo, Il s'agit d'un Palindrome"
> AcMsg3 db "Non, Il ne s'agit pas d'un Palindrome"
>
>
> .Code
>
> Palindrome PROC ; *psz dans EDX> mov ecx, edx ; EDX d, ECX c
> xor eax, eax
> L1:
> cmp byte ptr[edx], 0
> je short L2
> inc edx
> jmp short L1
> L2:
> cmp ecx, edx
> je short plndExit ; chaine vide
> dec edx
> L3:
> cmp ecx, edx
> jae short plndExit
> mov al, [ecx]
> sub al, byte ptr[edx]
> jne short plndExit
> inc ecx
> dec edx
> jmp short L3
> xor al, al
> plndExit:
> ret 0
> Palindrome ENDP

désolé mais je n'ai fourni qu'une fonction, pas un prog complet. De + il faut préciser quel model et quelle plate forme tu vises.
Ma func Palindrome est pour Win32:
.586
.model flat, stdcall
option casemap :none
option prologue:none
option epilogue:none

sachant que toute chaine est finie par un zero.
0
bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008
31 janv. 2003 à 01:26
-------------------------------
Réponse au message :
-------------------------------
-------------------------------
Réponse au message :
-------------------------------
-------------------------------
Réponse au message :
-------------------------------

-------------------------------
Réponse au message :
-------------------------------

Serais-tu corriger ce qui ne vas pas dans ma boucle sltp pour que mon programme foncrtionne. Merci d'avance

Voilà ce que j'ai fait:

.MODEL SMALL
.STACK
.DATA

AcMsg1 db "Entrez un mot ou une phrase: $"
AcMsg2 db "Bravo, Il s'agit d'un Palindrome"
AcMsg3 db "Non, Il ne s'agit pas d'un Palindrome"

AcClav db 50, ?, 51 dup(' ')

.Code

main:

mov ax, @Data
mov dx, ax

mov ax, 0003h
int 10h

mov ax, 0900h
mov dx, offset AcMsg1 ;Fait pointer dx sur AcMsg1
int 21h

mov ax, 0a00h ;Permet d'entrer la chaine de carcr?re au clavier
mov dx, offset AcClav ;Fait pointer dx sur AcClav
int 21h

mov SI, 0 ;Initialisation de SI ? 0

Boucle: ; *psz dans EDX mov dx, SI ; EDX d, ECX c
xor ax, ax

L1:
cmp byte AcClav[SI], 0
je short L2
inc SI
jmp short L1

L2:
cmp dx, SI
je short plndExit ; chaine vide
dec SI

L3:
cmp dx, SI
jae short plndExit
mov al, [dx]
sub al, byte AcClav[SI]
jne short plndExit
inc dx
dec SI
jmp short L3
xor al, al
plndExit:
ret 0

Boucle END

End Main
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
31 janv. 2003 à 10:07
-------------------------------
Réponse au message :
-------------------------------

> -------------------------------
> Réponse au message :
> -------------------------------
> -------------------------------
> Réponse au message :
> -------------------------------
> -------------------------------
> Réponse au message :
> -------------------------------
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> Serais-tu corriger ce qui ne vas pas dans ma boucle sltp pour que mon programme foncrtionne. Merci d'avance
>
> Voilà ce que j'ai fait:
>
>
> .MODEL SMALL
> .STACK
> .DATA
>
> AcMsg1 db "Entrez un mot ou une phrase: $"
> AcMsg2 db "Bravo, Il s'agit d'un Palindrome"
> AcMsg3 db "Non, Il ne s'agit pas d'un Palindrome"
>
> AcClav db 50, ?, 51 dup(' ')
>
>
> .Code
>
> main:
>
> mov ax, @Data
> mov dx, ax
>
> mov ax, 0003h
> int 10h
>
> mov ax, 0900h
> mov dx, offset AcMsg1 ;Fait pointer dx sur AcMsg1
> int 21h
>
> mov ax, 0a00h ;Permet d'entrer la chaine de carcr?re au clavier
> mov dx, offset AcClav ;Fait pointer dx sur AcClav
> int 21h
>
> mov SI, 0 ;Initialisation de SI ? 0
>
>
> Boucle: ; *psz dans EDX> mov dx, SI ; EDX d, ECX c
> xor ax, ax
>
> L1:
> cmp byte AcClav[SI], 0
> je short L2
> inc SI
> jmp short L1
>
> L2:
> cmp dx, SI
> je short plndExit ; chaine vide
> dec SI
>
> L3:
> cmp dx, SI
> jae short plndExit
> mov al, [dx]
> sub al, byte AcClav[SI]
> jne short plndExit
> inc dx
> dec SI
> jmp short L3
> xor al, al
> plndExit:
> ret 0
>
> Boucle END
>
> End Main

Salut,
tu peux aller voir le prog complet dans mes sources. Tu verras comment appeler cette fonction.
ciao...
0
bugs2600 Messages postés 14 Date d'inscription dimanche 24 novembre 2002 Statut Membre Dernière intervention 6 septembre 2008
2 févr. 2003 à 19:45
-------------------------------
Réponse au message :
-------------------------------

>
>
>
>
> -------------------------------
> Réponse au message :
> -------------------------------
>
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
> > -------------------------------
> > Réponse au message :
> > -------------------------------
> >
Besoin d'aide pourrais-tu regarder le programme et me dire pourquoi il ne prend pas les espaces et si tu serais le simplifier et me l'expliquer merci d'avance:

MODEL SMALL
.STACK
.DATA

AcMsg DB 'Entrer une Phrase ou un Mot: $'
AcMsg1 DB 'Oui, Un Palindrome $'
AcMsg2 DB 'Non, Pas un Palindrome $'

STRING LABEL BYTE
MAXLEN DB 50
STRLEN DB ?
STRFLD DB 50 DUP(' ')

.CODE

MAIN: MOV AX,@DATA
MOV DS,AX

CALL CLS ;Efface l'?crant
CALL CURSOR ;Place le curseur ? (0,0)
CALL READ

CALL CLS
CALL CURSOR

LEA BX,STRFLD
MOV CH,00H
MOV CL,STRLEN
CMP CX,02H
JC PAL
MOV DX,BX
ADD DX,CX
DEC DX
SHR CX,1

AGAIN: MOV AL,[BX]
XCHG BX,DX
CMP AL,[BX]
JNE NOTPAL
XCHG BX,DX
INC BX
DEC DX
LOOP AGAIN

PAL: MOV AH,09H
LEA DX,AcMsg1
INT 21H
JMP HALT

NOTPAL: MOV AH,09H
LEA DX,AcMsg2
INT 21H

HALT: MOV AX,4C00H ;Termine le programme
INT 21H

;Efface l'?crant
CLS: MOV AX,0600H
MOV BH,07H
MOV CX,0000H
MOV DX,184FH
INT 10H
RET

;Place le curseur
CURSOR: MOV DX,0000H
MOV AH,02H
MOV BH,00H
INT 10H
RET

READ: MOV AH,09H ;Message d'affichage
LEA DX,AcMsg
INT 21H

MOV AH,0AH
LEA DX,STRING
INT 21H
RET

WRITE: MOV AH,09H
LEA DX,STRFLD
INT 21H
RET

End MAIN
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
13 avril 2003 à 21:20
Voici l'exemple d'un source qui tien compte des espaces qui ne fait aucune différence entre majuscule et minuscule mais pas pour les accents. De plus lors de la saisie, tu ne dois pas appuyer sur les touches F (F1 à F12à.

;---------------------------------------------------
; assembleur: TASM
; Taille saisie max: 80 caractères

.model small
.386

TAILLE_MAX equ 80

pile segment use16 stack
db 1000h dup(?)
pile ends

data segment use16
invite db "Veuillez saisir une chaine:", 13, 10, '$'
mot db "Mot saisi:", 13, 10, '$'
buffer db TAILLE_MAX + 1
nbCar db 0
chaine db (TAILLE_MAX + 1) dup(?)
resPos db "Ce mot est un palindrome", 13, 10, '$'
resNeg db "Ce mot n'est pas un palindrome", 13, 10, '$'
nbMess db 10
nbConv db "00"
db " caracteres saisis", 13, 10, '$'
noCarMess db "Aucun caractere saisi", 13, 10, '$'
fin db 1000h dup(0) ; Evite les effets de bord
data ends

code segment use16
assume cs:code, ds: data, es: data, ss: pile

start:
push data ; Initialisation
push data
pop ds
pop es
cld

mov dx, offset buffer ; Affichage de l'invite
mov ah, 9
int 21h

mov dx, offset buffer ; Saisie de la chaine
mov ah, 0Ah
int 21h

mov di, offset nbConv ; Teste du nombre de caractères
xor dx, dx
xor ax, ax
mov al, byte ptr [nbCar]
push ax
or al, al
jnz convertCar

mov dx, offset noCarMess
mov ah, 9
int 21h

mov al, 2 ; Code retour 2
jmp short termine

convertCar:
mov bx, 10 ; Conversion du nombre de caractères
div bx
add al, '0'
add dl, '0'
stosb
xchg ax, dx
stosb

mov dx, offset nbMess ; Affichage du nombre de caractères
mov ah, 9
int 21h

pop cx ; Cherher la fin du mot
mov si, offset chaine
mov di, si

chercherMotLoop:
lodsb
or al, 32h ; Mettre en minuscule
stosb
cmp al, ' '
loopne chercherMotLoop

mov al, 13
stosb

mov al, 10
stosb

mov al, '$'
stosb

mov ah, 9
mov dx, offset mot
int 21h

mov ah, 9
mov dx, offset chaine
int 21h

cherchePalind: ; Verifier que le mot est un palindrome
dec si
mov di, offset chaine

cherchePalindLoop:
cmpsb
jne pasTrouve
sub si, 2
cmp si, di
jnbe cherchePalindLoop

trouve:
mov dx, offset resPos
mov ah, 9
int 21h

xor ax, ax ; Code retour 0
jmp short termine

pasTrouve:
mov dx, offset resNeg
mov ah, 9
int 21h

mov al, 1 ; Code retour 1

termine:
mov ah, 4Ch
int 21h
code ends

end start

; Fin du source
;---------------------------------------------------

Core Breaker :)
0
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
13 avril 2003 à 21:26
Version définitive

Voici l'exemple d'un source qui tient compte des espaces qui ne fait aucune différence entre majuscule et minuscule mais pas pour les accents. De plus lors de la saisie, tu ne dois pas appuyer sur les touches F (F1 à F12).

;---------------------------------------------------
; assembleur: TASM
; Taille saisie max: 80 caractères

.model small
.386

TAILLE_MAX equ 80

pile segment use16
db 1000h dup(?)
pile ends

data segment use16 stack
invite db "Veuillez saisir une chaine:", 13, 10, '$'
mot db "Mot saisi:", 13, 10, '$'
buffer db TAILLE_MAX + 1
nbCar db 0
chaine db (TAILLE_MAX + 1) dup(?)
resPos db "Ce mot est un palindrome", 13, 10, '$'
resNeg db "Ce mot n'est pas un palindrome", 13, 10, '$'
nbMess db 10
nbConv db "00"
db " caracteres saisis", 13, 10, '$'
noCarMess db "Aucun caractere saisi", 13, 10, '$'
fin db 1000h dup(0) ; Evite les effets de bord
data ends

code segment use16
assume cs:code, ds: data, es: data, ss: pile

start:
push data ; Initialisation
push data
pop ds
pop es
cld

mov dx, offset invite ; Affichage de l'invite
mov ah, 9
int 21h

mov dx, offset buffer ; Saisie de la chaine
mov ax, 0A00h
int 21h

mov di, offset nbConv ; Teste du nombre de caractères
xor dx, dx
xor ax, ax
mov al, byte ptr [nbCar]
push ax
or al, al
jnz convertCar

mov dx, offset noCarMess
mov ah, 9
int 21h

mov al, 2 ; Code retour 2
jmp short termine

convertCar:
mov bx, 10 ; Conversion du nombre de caractères
div bx
add al, '0'
add dl, '0'
stosb
xchg ax, dx
stosb

mov dx, offset nbMess ; Affichage du nombre de caractères
mov ah, 9
int 21h

pop cx ; Cherher la fin du mot
mov si, offset chaine
mov di, si

chercherMotLoop:
lodsb
or al, 20h ; Mettre en minuscule
stosb
cmp al, ' '
loopne chercherMotLoop

mov al, 13
stosb

mov al, 10
stosb

mov al, '$'
stosb

mov ah, 9
mov dx, offset mot
int 21h

mov ah, 9
mov dx, offset chaine
int 21h

cherchePalind: ; Verifier que le mot est un palindrome
dec si
mov di, offset chaine

cherchePalindLoop:
cmpsb
jne pasTrouve
sub si, 2
cmp si, di
jnbe cherchePalindLoop

trouve:
mov dx, offset resPos
mov ah, 9
int 21h

xor ax, ax ; Code retour 0
jmp short termine

pasTrouve:
mov dx, offset resNeg
mov ah, 9
int 21h

mov al, 1 ; Code retour 1

termine:
mov ah, 4Ch
int 21h
code ends

end start
; Fin du source
;---------------------------------------------------

Core Breaker :)
0
Cygace Messages postés 4 Date d'inscription vendredi 5 décembre 2003 Statut Membre Dernière intervention 11 janvier 2008
5 déc. 2003 à 09:11
Bonjour à tous,

merci à tous le code source de ce palindrome m'a bien aidé. Cependant il y a des choses que je ne comprend pas bien dans ce code (je suis bon en c mais alors assembleur :s)
et surtout au niveau du modèle choisis et de la pile (stack).

Pourriez vous donc expliquer les grandes lignes du programme (toutes ce serait parfait :) ) car cela me permettrait de tout comprendre et comme je dois rendre un boulot pour lundi ce serait bien de comprendre ce que je fais :)

Merci d'avance
0
Rejoignez-nous