Accueil > Forum > > > > Programme en assembleur un peu tordu....
Programme en assembleur un peu tordu....
mardi 27 décembre 2005 à 15:04:45 |
Programme en assembleur un peu tordu....

linuxux
|
Bonjour,
Voilà un petit programme pour un exo qui me semble un peu tordu.
Les questions sont tout d'abord que fait ce programme (pour moi il tourne en rond) et corriger l'erreur algorithmque.
| Code: | .data
str: .zero 11
i: .long 463960
d: .long 1
j: .zero 4
.text .globl _start
_start: movl i,%ebx
L1: movl i,%eax
movl $0,%edx
movl d,%ecx
divl %ecx
push %edx
movl $10,%eax
mull %ecx
pop %edx
movl %eax,d
cmpl %edx,%ebx
jbe L1
movl $str,%ebx
movl d,%eax
movl $0,%edx
movl $10,%ecx
divl %ecx
movl %eax,d
L2: movl d,%eax
movl $0,%edx
movl $10,%ecx
divl %ecx
movl %eax,d
movl i,%eax
movl $0,%edx
movl d,%ecx
divl %ecx
movl %edx,i
movl j,%ecx
movl $0,%edx
addl $'0',%eax
movb %al,%ds:(%ebx,%ecx,1)
inc %ecx
movl %ecx,j
movl i,%eax
movl $0,%edx
cmpl %eax,%edx
jne L2
movl j,%eax
addl $str,%eax
movl $0,%edx
movb $0,%ds:(%edx,%eax,1)
movl $1,%eax
movl $0,%eax
int $0x80 |
D'avance merci pour vos réponses.
A vos compilateurs ! 
|
|
jeudi 29 décembre 2005 à 10:35:01 |
Re : Programme en assembleur un peu tordu....

patatalo
|
salut,
Déjà, on peut voir qu'il s'agit de l'assembleur de Linux.
donc "instruction src,dst"
Je commence, tu finis.
str: .zero 11 ; = db 0,0,0,0,0,0,0,0,0,0,0
i: .long 463960 = dd 463960
d: .long 1 = dd 1
j: .zero 4 = db 0,0,0,0
movl i,%ebx ; ebx = i = 463960
movl i,%eax ; eax = i = 463960
movl $0,%edx ; edx = 0
movl d,%ecx ; ecx = d = 1
divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 463960)
push %edx ; sauve reste ( esp -= sizeof LONG, [esp] = edx )
movl $10,%eax ; eax = 10h ( $ = hex ou dec ? )
mull %ecx; edx:eax = eax * ecx
pop %edx ; restore reste ( edx = [esp]; esp += sizeof LONG )
movl %eax,d ; d = eax
cmpl %edx,%ebx ; si ebx <= edx -> L1 ( verifier ordre des comparaison )
;...
une fois que tu auras tout traduit, tu pourra comprendre l'objectif de ce code.
@++
|
|
jeudi 29 décembre 2005 à 11:19:15 |
Re : Programme en assembleur un peu tordu....

linuxux
|
Salut, Alors alors... J'ai mis sur papier ce que tu m'avais donné et j'ai vu qu'en fait ce bout de code ne faisait.... rien !  En fait, la dernière instruction compare ebx et edx. ebx = 463960 vu que l'on n'y a pas touché depuis le début et edx = 0 (c'est le reste restauré avec le pop). Donc, avec ce bout de code, jamais on aura ebx <= edx pourquoi faire le teste alors ? Elle est la l'erreur ? Donc on ne saute pas à L1 et on continue : Le reste ... movl $str,%ebx ; ebx = str = 0,0,0,0,0,0,0,0,0,0,0 (??)movl d,%eax ; eax = d = 1movl $0,%edx ; edx = 0movl $10,%ecx ; ecx = 10divl %ecx ; edx:eax / ecx ( edx = reste = 10, eax = quotient = 0)movl %eax,d ; ah qu'est-ce qu'on fait la, on met eax dans d ou d dans eax ? Le premier me parait impossible.
En tout cas merci pour ta réponse... on avance petit à petit.
|
|
jeudi 29 décembre 2005 à 11:36:27 |
Re : Programme en assembleur un peu tordu....
|
jeudi 29 décembre 2005 à 14:16:18 |
Re : Programme en assembleur un peu tordu....

linuxux
|
Salut patatalo, Alors ce serait un convertisseur ASCII. Mais qu'est-ce que l'on cherche à convertir ? Une donnée tapée au clavier ? Ou plutôt 463960 ? ou une autre variable ? Pour le reste voyons voir : movl %eax,d ; d = eax = 463960 (avant d valait 1) L2: movl d,%eax ; eax = d = 463960 (étrange on a fait l'inverse juste au dessus. ) movl $0,%edx ; edx = 0 movl $10,%ecx ; ecx = 10 divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 46396) movl %eax,d ; d = eax = 46396 movl i,%eax ; eax = i = 463960 movl $0,%edx ; edx = 0 (il le valait déjà) movl d,%ecx ; ecx = d = 1 divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 463960) movl %edx,i ; i = edx = 0 movl j,%ecx ; ecx = j = 0,0,0,0 (comprend pas la) movl $0,%edx ; edx = 0 addl $'0',%eax ; on additionne le code ASCII de '0' avec eax, le résultat est dans eax : eax = 463960 + 48 = 464008 movb %al,%ds:(%ebx,%ecx,1) ; alors la je coince  Ne sachant pas si ecx a été modifié je ne peux pas continuer pour l'instant. inc %ecx movl %ecx,j movl i,%eax movl $0,%edx cmpl %eax,%edx jne L2 movl j,%eax addl $str,%eax movl $0,%edx movb $0,%ds:(%edx,%eax,1) movl $1,%eax movl $0,%eax int $0x80
Sinon, concrêtement, je ne vois pas comment ça converti en code ASCII. Merci encore pour ton aide.
|
|
vendredi 30 décembre 2005 à 09:12:28 |
Re : Programme en assembleur un peu tordu....

patatalo
|
re,
movb $0,%ds:(%edx,%eax,1) ; donne "mov byte ptr [edx+eax*1],0" ( mais alors là a verifier soit au desassembleur soit sur la doc de l'assembleur linux, je ne le connais pas assez ).Le segment ds n'est pas a preciser a moins d'utiliser ebp et esp en base d'acces memoire.
ce bout de code:
movl %eax,d
L2:
movl d,%eax
on met a jour la variable d mais eax peut necessiter une remise a jour lors de la boucle L2 donc cette suite d'instruction est tout a fait normal.
que cherche t'on dans la boucle L1:
cmpl %edx,%ebx
jbe L1 ; edx = ebx quand d = ecx = 1000000 ( le below est pour plus de sureté )
cette boucle ne cherche qu'a ajuster d
ensuite, d est redivisé par 10 juste avant L2 ( d = 100000 )
il ne te reste plus que L2 a traduire.
c'est L2 qui convertis decimal -> ascii dans le buffer str
la convertion en ascii s'opere par l'ajout du caractere '0' a la valeur eax.
on sauve ensuite dans [ebx+ecx*1] ( ebx = OFFSET str et ecx = j a ce moment là )
la suite ascii "0123456789" donne 30h,31h,32h,... ( "0" = 30h )
le zero terminal est ajouté au final.
movb $0,%ds:(%edx,%eax,1) ( ebx = OFFSET str, eax = j )
là par contre, je comprends pas:
movl $1,%eax ; eax = 1
movl $0,%eax ; eax = 0
int $0x80 ; syscall linux ? terminaison programme
@++
|
|
vendredi 30 décembre 2005 à 11:33:45 |
Re : Programme en assembleur un peu tordu....

linuxux
|
re, Bon je viens de me rendre compte que j'ai mal recopié l'exo, le jump vers L1 c jne et pas jbe. Vraiment désolé...  bon on récapépette. .data str: .zero 11 i: .long 463960 d: .long 1 j: .zero 4 .text .globl _start _start: movl i,%ebx ; ebx = 463960 L1: movl i,%eax ; eax = 463960 movl $0,%edx ; edx = 0 ($ = dec) movl d,%ecx ; ecx = d = 1 divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 463960) la on a rien changé push %edx ; sauve le reste 0 dans la pile movl $10,%eax ; eax = 10 mull %ecx ; eax * ecx = 10 * 1, le resultat est dans eax, donc eax = 10 on a rien changé pop %edx ; on restore le reste edx = 0 movl %eax,d ; d = eax = 10 cmpl %edx,%ebx ; si ebx != edx alors on retourne a L1, et ebx = 463960 et edx = 0 (cf le pop) jne L1 ; donc on retourne a L1 L1: movl i,%eax ; eax = 463960
movl $0,%edx ; edx = 0 ($ = dec)
movl d,%ecx ; ecx = d = 10
divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 46396)
push %edx ; sauve le reste 0 dans la pile
movl $10,%eax ; eax = 10
mull %ecx ; eax * ecx = 10 * 10, le resultat est dans eax, donc eax = 100
pop %edx ; on restore le reste edx = 0
movl %eax,d ; d = eax = 100
cmpl %edx,%ebx ; si ebx != edx alors on retourne a L1, et ebx = 463960 et edx = 0 (cf le pop) jne L1 ; donc on retourne a L1
...... Donc en gros on effectue la boucle 7 fois, jusqu'à ce que d = 1000000 pour que, lors de la division, on ait le reste égale à 463960. Algorithmiquement, ce n'est pas très malin. Pour L1, c'est ok ! La suite.... movl $str,%ebx ; on mets str dans ebx (c'est pour travailler avec ebx au lieu de travailler directement avec str ?) movl d,%eax ; eax = d = 1000000 movl $0,%edx ; edx = 0 movl $10,%ecx ; ecx = 10 divl %ecx ; edx:eax / ecx ( edx = reste = 0, eax = quotient = 100000) movl %eax,d
|
|
vendredi 30 décembre 2005 à 11:38:55 |
Re : Programme en assembleur un peu tordu....

linuxux
|
oup désolé j'ai cliqué alors que j'avais pas fini !
je continue...
movl %eax,d ; on met à jour d = 100000
La voila l'erreur algorithmique ! Enfin je pense.... On sait que l'on a un zéro de trop pour d, donc on refait une division par 10. Cette erreur aurait pu être corrigé dans la boucle L1.
J'ai toujours une petit question : qu'est-ce que l'on cherche à convertir en ASCII ? quelle valeur ? là je vois pas.
Je vais bouquinner pour la ligne movb $0,%ds:(%edx,%eax,1)
@++ et encore merci
|
|
vendredi 30 décembre 2005 à 14:18:18 |
Re : Programme en assembleur un peu tordu....
|
vendredi 30 décembre 2005 à 14:24:45 |
Re : Programme en assembleur un peu tordu....
|
Cette discussion est classée dans : programme, eax, edx, ecx, movl
Répondre à ce message
Sujets en rapport avec ce message
optimisation [ par sajid_morad ]
salut tout le monde , j ai une parti du code en c++, que j ai voulu optimiser , le l ai reécri en asm , mai ça donne pas grand chose, si quelqu un po
# Export Table - Kernel32.dll - GetProcessAddress # [ par joanna ]
Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la
# Export Table --- Kernell32.dll --- GetProcAddress # [ par joanna ]
Voici le code qui devrait récupérer l'adresse de la fonction "GetProcessAddress" connaissant l'ImageBase du module "kernel32.dll".Malheureusement à la
Pb registre DL [ par AlexMAN ]
Bonjour, J'ai un ptit pb avec le code qui suit, au nivo du mov dl, [ecx] ://Renvoie pointeur sur fin de chaine (permet d'eviter l'utilisation de strca
LecteurEstDvd asm inline [ par AlexMAN ]
Bonjour, Voila j'ai un ptit pb au nivo, je pense, de l'appel de la fonction DeviceIoControl, le code : //Fonction Cint __stdcall LecteurEstDvd(char *p
exception 13 lors du scan memoire haute [ par patatalo ]
salut, pourquoi ce code de detection de memoire en mode 32 bits sans paging me donne une exception 13 sur certaines cartes meres ( ASUS ) a l'adresse
asm cryptage ? [ par pic22 ]
Salut Le programme Terminal fonctionne bien, et les données reçus sont cryptées ou compresser ? je pense quelles sont cryptées mais je n’arrive pas
j'ai un prob avec mon buffer ; ya pas d'amuses gueules (masm32) [ par papiboff ]
bj si je mets le buffer "somme " en dd avec charge eax et que j'ajoute deux 'dec ebx ' , ben , marche pas correctement ; (pêrqué ???? = en french) sv
Inversion de chaîne [ par Bidou ]
Bonjour à tous,A vrai dire je suis plutôt nouveau en asm et pas très bon lol. Mais bon, faut bien commencer un jour hein. Pour me faire la main, j'ai
Aligner des données pour le SSE [ par epineurien ]
Bonjour à tous !J'ai un petit problème avec du code dont je mesure la vitesse: suivant la compilation, la vitesse varie du simple au double .J'expliqu
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|