Salut à tous
j'aimerai bien savoir à quoi servent l'instruction BRK (break) si ça existe vraiement , et la directive EQU aussi , je ne sais pas à quoi ça sert.
Merci.
Version imprimable
Salut à tous
j'aimerai bien savoir à quoi servent l'instruction BRK (break) si ça existe vraiement , et la directive EQU aussi , je ne sais pas à quoi ça sert.
Merci.
EQU : Définition de constante
mille EQU 1000
Chaque fois que l'assembleur rencontrera la chaîne mille , il la remplacera par le
nombre 1000 (tout simplement:lol:).
Donc est ce que je doit comprendre que son avantage , contrairement à la déclaration de constante dans la section '.CONST' , est d'affecter les valeurs aux constantes mème au milieu du corps de la section '.CODE' ,et mème en plain milieu d'une certaine instruction !
quelle est la différence entre la déclaration de constantes dans la section '.CONST' et la déclaration de variables dans la section '.DATA' ?
Salut,
La section .const sert à définir une zone de texte ou ne se trouve que des constantes,c'est tout.
EQU définit des constantes et on peut placer l'instruction un peu ou l'on veut.Plus on veut d'ennuis,plus on l'a met n'importe ou.
.break sert a introduire une rupture de boucle (.while endw...) et permet d'ajouter plusieurs conditions de sortie de boucle.
Je croix que la différence entre les constantes de .CONST et les données de .DATA diffèrent les un aux autres du fait que la déclaration d'une constante et son initialization (affectation d'une valeur initiale) se traduit, lors de l'assemblage d'une instruction où cette constante est appelé en tant que opérande, par l'obtention d'un opérande du type 'immediate data',
alors que pour ls données déclarées en section .DATA, lorsqu'elles sont appelées dans une instruction en tant que opérande, c'est traduit par l'obtention d'une opérande de type espace mémoire : [adress]
ce que je ne comprend pas, c'est que l'adresse ne doit pas ètre absolue, car un mème programme peut se charger en RAm dans n'importe quelle portion, et mème on peut lancer plusieurs instances du mème programme en mème temps,
comment donc en code machine est matérialisée ce fait ?
Les constantes ne sont pas initialisées. Le compilateur opére juste un remplacement textuel dans le code source.
Le compilo remplace simplement "Bla" par 10 dès qu'il rencontre Bla.Code:
1
2
3
4
5
6
7
8 .const Bla EQU 10 .code mov eax, Bla
Dans les O.S modernes il n'y effectivement pas d'adresse "absolue" (si tu entends par là : une adresse qui serait la même pour un processus et pour un autre).Citation:
ce que je ne comprend pas, c'est que l'adresse ne doit pas ètre absolue, car un mème programme peut se charger en RAm dans n'importe quelle portion, et mème on peut lancer plusieurs instances du mème programme en mème temps,
comment donc en code machine est matérialisée ce fait ?
Si par exemple nous avons une adresse qui est 0x401000, elle pointera vers différentes choses si c'est pour le processus A et pour le processus B.
Le fait est que sous les O.S modernes (Windows, Linux, Mac O.S, Solaris, etc.) on n'accède jamais directement à la mémoire physique.Code:
1
2 mov eax, dword ptr [0x401000] ; 0x401000 => adresse différentes entre les processus. Pas les mêmes données pointées.
Il y a un phénomène de translation d'adresse entre les pages physique et les pages virtuelles. Ces mêmes pages virtuelles contiennent les adresse que nous voyons habituellement.
Une partie de cette translation est prise en charge par le processeur notamment via le registre Cr3 (Control register 3) et le TLB (Transition Lookaside Buffer) ainsi que d'autres mécanismes propres au noyau (PDE, PTE, PFN, etc. sous windows par exemple).
Chaque processus dispose de son propre espace d'adressage et chaque page (pourvue que ce soit une page valide) correspond à une adresse physique spécifique et unique.
Pour reprendre l'exemple avec l'adresse 0x401000, elle pointe sur une page physique spécifique pour le processus A et pointera sur une autre page pour le processus B. Même si l'adresse (qui est virtuelle) 0x401000 semble être la même dans les deux cas.
Je précise que dans ton exemple la section .const ne servira à rien, elle est destinée à contenir les variables globales en lecture seule.
Gavroche tu n'as pas besoin de te soucier de ce genre de fonctionnalités de haut niveau pour le moment (enfin c'est vrai que le EQU ou le = c'est pratique), concentre-toi sur le langage assembleur lui-même. Une fois que tu auras plus d'expérience et que tu auras choisi quel assembleur tu préfères tu auras tout le temps de lire sa documentation en détail.
Merci de vous avoir cassé la tète pour moi,
revenons à ma deuxieme question , est ce que vous ètes d'accord avec ToutEnAsm que la mnémo BRK permet de s'évader d'une boucle ?Citation:
Gavroche tu n'as pas besoin de te soucier de ce genre de fonctionnalités de haut niveau pour le moment (enfin c'est vrai que le EQU ou le = c'est pratique), concentre-toi sur le langage assembleur lui-même. Une fois que tu auras plus d'expérience et que tu auras choisi quel assembleur tu préfères tu auras tout le temps de lire sa documentation en détail.
.break oui, par contre BRK je n'en ai jamais entendu parler et .brk ne passe pas avec MASM.
D'où est ce que ça nous sort aussi cette .break il y avait un seul problème , maintenant il y en a deux , est ce que c'est une directive ou une instruction , et comment l'utiliser plus exactement ?
Salut,
sa sort du manuel d'intruction de masm32.
Il s'agit de .break
pour se procurer masm32 et le manuel,c'est içiCitation:
mov CPT,eax
.while(CPT)
lignesuivante:
inc NumeroLigne
dec CPT
.if CPT <= 0
.break ;une autre sortie de boucle
.endif
.endw
http://masm32.online.fr/masm32.htm
Pour débuter
http://pagesperso-orange.fr/luce.yves/debut.htm