Question

Il y a quelque chose que je ne peux pas digérer. J'apprends l'assembleur et en ce moment je suis au chapitre avec adressage. Je comprends le concept de supports pour déréférencement, mais en quelque sorte quand je vois l'utilisation de celui-ci, je ne peux pas absorber le point de celui-ci. Pour être plus précis un peu ici est où ma confusion a commencé:

mov al, [L1]

Ici, je suppose L1 comme un cas d'exemple est une sorte de macro qui est substitué plus tard pour une adresse réelle dans le code de la machine, à droite?

Alors, que cette instruction n'est:. Déréférencement registre al (parce que vous ne pouviez pas changer l'adresse physique) et changer la valeur à celle stockée à L1

Si jusqu'à présent tout est ok:

mov [L1], al

qui signifie analogicaly, il doit y avoir une adresse stockée (donc il y avait un moment de le faire) et vous changer à un autre endroit dans la mémoire, non?

Si vous pouviez me dire qu'il est correct dans le cas où vous ne voyez pas d'erreur s'il vous plaît le faire, ce serait le rendre possible pour moi de continuer à apprendre.

Une dernière chose, NASM ajoute un tas de 0xAA55 sous mon code (cette séquence est censée mettre fin au droit du programme?), Pourquoi est-il là tant de fois?

Était-ce utile?

La solution

L1 est généralement / probablement étiquette associé à une adresse particulière dans la mémoire. Le programmeur définit les différentes étiquettes pour son / sa convenance, et ces étiquettes sont utilisées pour représenter symboliquement un emplacement particulier dans la mémoire (L1 est un nom moche, les étiquettes sont généralement le signe de l'objectif sous-jacent de l'emplacement: dire, PingCounter, ErrorMessage, Connexion etc.).

Etiquette pour 1 octet de stockage statique est de savoir comment un compilateur C mettrait en œuvre char L1; à portée globale.


Dans la syntaxe MSNA, mov edi, L1 se chargera du montage au mov eax, imm32 forme de mov, à savoir l'étiquette adresse deviendra immédiatement dans le code de la machine 32 bits. (L'assembleur ne connaît pas la valeur numérique finale, mais l'éditeur de liens fait.) Attention que dans la syntaxe MASM, ce serait une charge et vous aurez besoin mov edi, OFFSET L1 d'obtenir une adresse de l'étiquette comme immédiate.

Mais mov al, [L1] se rassembleront à une instruction différente, avec l'adresse de 32 bits intégré dans le code de la machine comme une adresse à déréférencé. Cette instruction charge 1 octet de l'adresse L1, et le place dans AL.

Dans le langage assembleur, ce mode d'adressage indirect est signifié par carré bracketing la source ou opérande de destination d'une instruction donnée. (Mais pas les deux. X86 ne supporte que au plus un opérande de mémoire explicite par instruction)

mov al, [L1]

utilise l'adresse stockée dans L1, pour localiser un emplacement en mémoire et lit 1 octet (8 bits = = la taille du registre AL) à cet endroit, et le charge dans le registre AL.

  mov [L1], al

Est-ce dans le sens inverse. à savoir, en particulier, lire l'adresse stockée dans L1, utilisez cette adresse pour trouver une place particulière dans la mémoire et stocke le contenu de AL immatriculer.


Sous réserve que vous comprenez les informations suivantes pour être incomplète et quelque peu dépassée en ce qui concerne les nouveaux processeurs de la famille x86, cette primer sur l'architecture 8086 est probablement très utile pour obtenir un a commencé avec la langue de l'Assemblée pour la famille x86.
L'avantage de commencer par cette « ancienneté d'une unité centrale de traitement » (encore en usage, en fait), est que les concepts fondamentaux sont là, non grevé des nouveaux ensembles de registres, les modes d'adressage de fantaisie, les modes de fonctionnement et d'autres concepts. Les plus grandes tailles, les caractéristiques et les modes des nouveaux processeurs ne font qu'introduire une explosion combinatoire d'options, tout (la plupart?) D'entre eux utiles à leur manière, mais essentiellement sans importance pour une initiation.

Autres conseils

Il est difficile de suivre votre question, mais je vais essayer de vous aider.

Dans l'ensemble, un symbole est juste un nom pour une adresse. Dans votre source d'assemblage, L1 est un symbole défini par ailleurs, que l'assembleur résoudra comme un décalage à la mémoire.

Lorsque déréférencement (en utilisant le [] notation), vous pouvez déréférencer un registre (comme dans "mov al, [esi]") ou une adresse (comme dans "mov al, [L1]"). Les deux déclarations font la même chose, la seule différence est l'endroit où l'adresse provient.

Je vous conseille de télécharger Intel CPU Documentation et l'écrémage par la référence d'instruction. Si vous ne voulez pas être submergé, commencer à lire à partir d'un processeur x86 plus (par exemple, 486 ou plus), que la documentation est pas vraiment sympa, mais il est très utile d'avoir à portée de main.

Je ne connais pas les détails de MSNA, j'ai appris l'assemblage il y a 15 ans avec Turbo Assembleur, et que la connaissance est encore utile aujourd'hui:)

En outre, pourrais-je vous suggère d'essayer googler « tutoriel assembleur x86 », vous trouverez de nombreux documents pertinents qui peuvent être utiles pour vous.

  

oh et une dernière chose, ajoute une MSNA   tas de 0xAA55 sous mon code (ce   séquence est censé mettre fin à la   droit du programme?), pourquoi est-il là pour   à plusieurs reprises? Merci beaucoup pour   lire ici ..

Je suis assez sûr des thats applicable uniquement si votre création d'un bootloader. Il est la « signature de démarrage. » Dites que vous écrivez ce code sur une disquette (est votre code machine produit aussi exactement 512 octets?), Bien quand vous voulez démarrer l'ordinateur avec ce code bootloader, le BIOS se penchera sur la disquette et de déterminer si elle est une bootloader réelle. Pour ce faire, il se penchera sur les deux derniers octets du premier secteur de la disquette, ce qui devrait être 0xAA55 pour indiquer qu'il est bootable .. (aussi, cela fonctionne de la même façon si votre démarrage à partir de disque dur, ou -clé USB, ou autre chose. Un peu différent pour les CD parce qu'ils ont 4096 secteurs d'octets)

Dans votre code source, est comme la dernière ligne quelque chose comme $(times.. db 0xAA55 ou quelque chose comme ça? Si vous n'êtes pas l'intention de faire un bootloader, vous pouvez supprimer efficacement cette ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top