question TD2

Voir le sujet précédent Voir le sujet suivant Aller en bas

question TD2

Message  didi le Dim 15 Fév 2009, 11:16

en TD2 ( td2n08.asm )

Code:
;==========================================================
; Trier dans l'ordre croissant, une s�rie de nombres non
; sign�s et les afficher.
; TD2N08 - JCJ
; On utilisera l'algorithme simple du tri
; t[0..N] est le tableau � trier de minimum 2 �l�ments.
; Pour i allant de 0 � N-1
;      Pour j allant de i+1 � N
;              Si t[i]>t[j] Alors Echanger t[i] avec t[j]
;==========================================================
extern  printd
global main
;===========================
        section .data
;===========================
t      DD      56254,6895,121,6594,4557,455224,21,2425
tt      DD      tt-t ; adresse de tt - adresse de t = taille de t en bytes
;===========================
        section .code
;===========================
main:
        MOV    ESI,t          ; ESI pointe sur le premier �l�ment de t
bi:    MOV    EDI,ESI
        ADD    EDI,4          ; EDI pointe sur l'�l�ment suivant de t
bj:    MOV    EAX,[ESI]
        MOV    EBX,[EDI]
        CMP    EAX,EBX
        JNG    suiv            ; d�j� dans l'ordre
        MOV    [ESI],EBX      ; sinon on inverse les deux �l�ments de t
        MOV    [EDI],EAX
suiv:  ADD    EDI,4          ; EDI pointe sur l'�l�ment suivant de t
        CMP    EDI,tt          ; On d�passe le dernier �l�ment de t ? 
        JB      bj              ; sinon on continue la boucle
        ADD    ESI,4
        CMP    ESI,tt-4        ; On d�passe l'avant dernier �l�ment de t ?
        JB      bi              ; sinon on continue la boucle

   

jusqu' ici il range le tableau croissant
c'est ok ensuit

Code:
        MOV    ECX,[tt]        ; ECX = taille de t en bytes
        SHR    ECX,2          ; ECX = taille/4 = nombre d'�l�ments de t
        MOV    ESI,t          ; ESI pointe su le premier �l�ment de t

je ne comprend pas pourquoi on doit décaler 2 Byte (SHR ECX,2)
on est en 4 Byte (tt = DD) ?


dernière une petite question




Code:
aff:    PUSH    dword [ESI]
        CALL    printd          ; affiche l'�lement du tableau point� par ESI
        ADD    ESI,4          ; élément suivant
        LOOP    aff            ; On recommence pour tous les �l�ments

pourquoi on doit afficher les valeur en dword ? pourquoi pas en DD ?
comment ça marche le command LOOP ?
comme une boucle " pour "? comment il sais la boucle termine ?
parce que on a pas donné le dernière élément , on seulment ajout un élément à la fois ...?

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: question TD2

Message  XavBod le Dim 15 Fév 2009, 12:03

La commande Loop est une commande de boucle.
A chaque fois que Loop est atteint il jump au label indiquée et décremente le registre ECX (registre de compteur). Une fois le registre ECX à 0, le loop ne s'effectuera plus Razz enfin c'est ce que moi j'ai compris ^^ A confirmer par une personne de plus haute instance Smile

XavBod

Nombre de messages : 196
Age : 26
Prénom : Xavier
Statut : Etudiant 3eme indu
Localisation : Woluwe
Date d'inscription : 27/09/2008

Revenir en haut Aller en bas

Re: question TD2

Message  nvs le Dim 15 Fév 2009, 12:28

didi a écrit:
Code:
        MOV    ECX,[tt]        ; ECX = taille de t en bytes
        SHR    ECX,2          ; ECX = taille/4 = nombre d'�l�ments de t
        MOV    ESI,t          ; ESI pointe su le premier �l�ment de t

je ne comprend pas pourquoi on doit décaler 2 Byte (SHR ECX,2)
on est en 4 Byte (tt = DD) ?
d'abord, on ne décale pas de 2 bytes mais de 2 bits. c'est une grande différence.

décaler un motif binaire de deux positions vers la droite peut être arithmétiquement interprété comme un division par 4, à condition de bien gérer le bit de signe, si on considère le motif comme celui d'un nombre signé. il existe d'ailleurs deux instructions de décalage à droite :
Code:
shr
qui décale à droite en introduisant des zéros à gauche (on parle simplement de décalage ou shift en anglais) et
Code:
sar
qui décale à droite en recopiant le bit de signe à gauche (on parle de décalage arithmétique).

note que l'instruction
Code:
shr
est décrite dans le petit aide-mémoire des instructions du cours à l'entrée 37 en page 25 Smile

dans le contexte que tu décris, on a la variable tt qui contient la taille, en bytes, d'un tableau de double mots (double words), c'est-à-dire d'éléments s'étendant chacun sur 4 bytes. donc, pour obtenir le nombre d'éléments du tableau, il faut diviser cette taille totale par la taille d'un seul élément. plus précisément ici, diviser le contenu de tt par 4.

didi a écrit:dernière une petite question
faudra apprendre à compter car moi j'en vois bien 6 de dernières petites questions Wink

didi a écrit:
Code:
aff:    PUSH    dword [ESI]
        CALL    printd          ; affiche l'�lement du tableau point� par ESI
        ADD    ESI,4          ; élément suivant
        LOOP    aff            ; On recommence pour tous les �l�ments

pourquoi on doit afficher les valeur en dword ?
parce que les éléments du tableau on précisément comme taille celle d'un double mot.

didi a écrit:pourquoi pas en DD ?
Code:
DD
est une directive (define double word) de nasm pour lui demander de réserver un emplacement de 4 bytes (un double word), tandis que
Code:
dword
est une directive qui demande à nasm de considérer que ce qui suit (l'emplacement mémoire ou l'immédiat) s'étend sur 4 bytes, sans allocation mémoire.

au moment de l'affichage, il ne faut pas réserver de la mémoire, mais nasm requiert qu'on lui spécifie la taille de la zone déréférencée (avec les crochets : [esi]).

didi a écrit:comment ça marche le command LOOP ?
elle est décrite à la page 14, entrée 21, du guide d'instructions en fin de syllabus Smile

didi a écrit:comme une boucle " pour "?
en quelque sorte, sauf qu'avec
Code:
loop
on n'a pas le choix :
  • du compteur de boucle : c'est toujours ecx ;
  • de la condition de continuation de boucle : c'est toujours ecx != 0 ;
  • de l'instruction de fin de boucle : c'est toujours --ecx.


didi a écrit:comment il sais la boucle termine ?
guide des instructions, entrée 21 ou ci-dessus Wink

didi a écrit:parce que on a pas donné le dernière élément , on seulment ajout un élément à la fois ...?
là je ne comprends pas très bien ce que tu veux dire...






_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: question TD2

Message  nvs le Dim 15 Fév 2009, 15:17

nvs a écrit:
didi a écrit:comme une boucle " pour "?
en quelque sorte, sauf qu'avec
Code:
loop
on n'a pas le choix :
  • du compteur de boucle : c'est toujours ecx ;
  • de la condition de continuation de boucle : c'est toujours ecx != 0 ;
  • de l'instruction de fin de boucle : c'est toujours --ecx.
une autre différence, et non des moindres, c'est que
Code:
loop
évalue la condition de continuation après la décrémentation du compteur, en toute fin de boucle. cette instruction ressemble plus à une boucle faire ... tant que () avec un compteur. si tu veux absolument y voir une boucle pour, considère que c'en est une sans évaluation de la condition de continuation avant le premier tour Smile




_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: question TD2

Message  didi le Dim 15 Fév 2009, 20:36

encore pas compris question ...

Code:
 MOV    ECX,[tt]        ; ECX = taille de t en bytes
        SHR    ECX,2          ; ECX = taille/4 = nombre d'�l�ments de t

ça sert à quoi ces 2 ligne
parce que on utilise pas de ECX dans notre example ???
on seulment trouve combien d'élément t contiens ??

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: question TD2

Message  DeS le Dim 15 Fév 2009, 20:43

didi a écrit:encore pas compris question ...

Code:
 MOV    ECX,[tt]        ; ECX = taille de t en bytes
        SHR    ECX,2          ; ECX = taille/4 = nombre d'�l�ments de t

ça sert à quoi ces 2 ligne
parce que on utilise pas de ECX dans notre example ???
on seulment trouve combien d'élément t contiens ??

C'est simple!
Quand tu déclare tt c'est
Code:

tt DD t-tt    ; ici tu recois la taille du tableau en bytes!

donc un element de ton tableau est un Double (4bytes).
Il faut donc diviser tt par 4 pour obtenir le nombre exact d'elements de ton tableau!

Donc quand tu fais
Code:
 MOV    ECX,[tt]        ; ECX = taille de t en bytes
        SHR    ECX,2          ; ECX = taille/4 = nombre d'�l�ments de t

le Mov met la taille en octet dans ECx
Ensuite tu fais un décalage vers la droite de 2

par exemple :
Si tu avais 5 elements
Apres le Mov ECx,[tt]
ECx contiendrai 20d = 0001 0100b
tu fais le SHR Ecx,2
ECx contiendrai alors 0000 00101b = 5d

DeS

Nombre de messages : 324
Age : 27
Prénom : Denis
Statut : etd 2eme gestion
Localisation : Rebecq(village paumé où brouttent les vaches)
Date d'inscription : 15/10/2007

Revenir en haut Aller en bas

Re: question TD2

Message  nvs le Dim 15 Fév 2009, 20:54

didi a écrit:[...] on utilise pas de ECX dans notre example ???
bien au contraire car
Code:
loop
utilise implicitement ce registre (dans le code que tu as fourni ci-dessus) Smile



_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: question TD2

Message  didi le Dim 15 Fév 2009, 21:29

de l'instruction de fin de boucle : c'est toujours --ecx.

par combien ? c'est à dire on décrement par combien de bit or Byte

didi

Nombre de messages : 215
Prénom : Dinesh
Statut : Smile
Date d'inscription : 21/01/2009

Revenir en haut Aller en bas

Re: question TD2

Message  nvs le Dim 15 Fév 2009, 21:35

didi a écrit:de l'instruction de fin de boucle : c'est toujours --ecx.

par combien ? c'est à dire on décrement par combien de bit or Byte
lorsque j'écris
Code:
--ecx
j'utilise l'opérateur de prédécrémentation de java. il s'agit donc d'une décrémentation de la valeur de ecx d'une unité (si sa valeur initiale est 123456, elle passe à 123455).

pour être plus cohérent avec le thème, qui est le langage d'assemblage, j'aurais dû écrire
Code:
dec ecx
où l'instruction utilisée est décrite dans l'aide-mémoire en fin de syllabus (entrée 12, page 9).








_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: question TD2

Message  Contenu sponsorisé Aujourd'hui à 20:45


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum