Question

Je suis curieux de savoir est-il un GAZ spécial syntaxe pour atteindre le même comme dans les MSNA exemple:

SECTION .data       

    msg:    db "Hello World",10,0  ; the 0-terminated string.
    len:    equ $-msg              ; "$" means current address.

Je suis d'autant plus intéressé par le symbole $ qui représente l'état actuel de l'adresse.

Était-ce utile?

La solution

Il y a une comparaison utile entre le gaz et de MSNA ici: http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html

Voir en particulier cette partie, qui, je pense, répond à vos question:


Listing 2 introduit également le concept d'un emplacement de compteur (ligne 6).MSNA prévoit une variable ($et $$ variables) pour manipuler l'emplacement du compteur.Dans le GAZ, il n'y a pas de méthode pour manipuler l'emplacement du compteur et que vous avez à utiliser des étiquettes pour calculer l'emplacement de stockage suivant (données, instruction, etc.).Par exemple, pour calculer la longueur d'une chaîne, vous devez utiliser la marche suivante dans MSNA:

prompt_str db 'Enter your name: '
STR_SIZE equ $ - prompt_str     ; $ is the location counter

L' $ donne la valeur actuelle de l'emplacement du compteur, et la soustraction de la valeur de l'étiquette (tous les noms de variables sont des étiquettes) à partir de cet emplacement compteur donne le nombre d'octets présents entre la déclaration de l'étiquette et de l'emplacement actuel.Le equ directive est utilisée pour définir la valeur de la variable STR_SIZE à l'expression suivante.Un semblable langage de l'essence ressemble à ceci:

prompt_str:
     .ascii "Enter Your Name: "

pstr_end:
     .set STR_SIZE, pstr_end - prompt_str

La fin de l'étiquette (pstr_end) donne au suivant adresse de l'emplacement, et en soustrayant le départ de l'étiquette d'adresse donne la taille.Notez également l'utilisation de .set pour initialiser la valeur de la variable STR_SIZE de l'expression qui suit la virgule.Un correspondant .equ peut également être utilisé.Il n'y a pas d'alternative à GAZ de l'ensemble de la directive dans les MSNA.


Autres conseils

Extrait de info as (GNU Binutils 2.21.90), ou en ligne dans le GAZ manuel: https://sourceware.org/binutils/docs/as/Dot.html

5.4 Le Point Spécial Symbole

Le symbole spécial . se réfère à l'adresse que as est montage dans.Ainsi, l'expression melvin: .long . définit melvin pour contenir sa propre adresse.

Affectation d'une valeur à . est traité de la même comme un .org la directive.Ainsi, l'expression .=.+4 est la même chose que de dire .space 4.

msg:    .ascii "Hello World!\n"       # not zero-terminated, use .asciz for that
msglen = . - msg                      # A .equ directive would be equivalent

le GAZ est la version du même langage utilisé dans les MSNA (len equ $ - symbol) idiomatiques façon à obtenir l'assembleur pour calculer la longueur de quelque chose pour vous.

Exemple usages de .

Minimes exemple explicite:

x: .long .
mov x, %eax
mov $x, %ebx
/* eax == ebx */

Commune de combo pour les longueurs de chaîne:

s: .ascii "abcd"
s_len = . - s
mov $s_len, %eax
/* eax == 4 */

s_len = la syntaxe a expliqué à Est-il une différence entre le signe égal affectation "x = 1" et ".equ x, 1" ou ".x, 1" GNU Gaz de l'assemblée?

Ceci peut être utilisé de façon concrète, par exemple dans un minimum praticable x86 Linux autoportant exemple.

Boucle infinie:

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