2012-04-28 45 views
24

Per esempio, se stavamo scrivendo un semplice programma di tipo ciao mondo, la sezione .data potrebbe contenere qualcosa come:

section .data 

msg  db  'Enter something: ' 
len  equ  $ - msg 

Cosa fa il $ in questo esempio rappresentano, e perché $ - msg uguale alla lunghezza del stringa?

+0

@James: No, non si parla di un diverso uso del $ '' segno. – Job

risposta

19

Significa l'indirizzo di "qui". Qui "qui" è il byte dopo la fine della stringa msg. Qualsiasi documentazione di assemblatore descriverà questo. Leggi la documentazione

+7

Supponiamo di non aver dichiarato len immediatamente dopo il messaggio. Quindi "qui" non punterebbe più alla fine della stringa, corretto? – InvalidBrainException

+2

Questo è corretto. –

11

In questo caso, $ indica l'indirizzo corrente in base all'assemblatore. $ - msg è l'indirizzo corrente dell'assembler meno l'indirizzo di msg, che sarebbe la lunghezza della stringa.

+2

Non sono abbastanza chiaro a cosa si riferisce l'assemblatore come "l'indirizzo corrente". Con "indirizzo corrente" intendi "l'ultima istruzione compilata" (che sarebbe 'msg db 'Inserisci qualcosa:'')? – InvalidBrainException

+2

@Terribad - L'assemblatore conta il numero di byte inseriti nella sezione fino a quel momento. '$' è dove sta andando il prossimo. –

0

$ è utilizzato per fare riferimento all'indirizzo corrente e $$ è utilizzato per fare riferimento all'indirizzo di inizio della sezione corrente in assemblaggio.

esempio:

section .text 
    Mov A,0x0000 
    Mov B,0x0000 
    Mov C,0x0000 

per il 3 ° linea di $ si riferisce all'indirizzo della linea stessa, mentre $$ si riferisce all'indirizzo della linea 1 (dove la nostra sezione avviato). Questa convenzione funziona per me in nasello.

fonte: nasm.us

+2

Questo non è corretto. Il doppio simbolo del dollaro ('$$') si riferisce all'inizio della sezione corrente, _non_ l'istruzione precedente. – Virtlink

+0

Grazie per avermelo fatto notare. L'ho corretto ora. –

4

NASM documentazione

http://www.nasm.us/doc/nasmdoc3.html#section-3.5

NASM supporta due gettoni speciali nelle espressioni, permettendo calcoli per coinvolgere la posizione di montaggio corrente: il $ e $$ gettoni. $ valuta la posizione dell'assemblaggio all'inizio della riga che contiene l'espressione; così puoi codificare un loop infinito usando JMP $.

http://www.nasm.us/doc/nasmdoc3.html#section-3.2.4

EQU definisce un simbolo per un dato valore costante: quando EQU è utilizzato, la linea di source deve contenere un'etichetta. L'azione di EQU consiste nel definire il nome dell'etichetta data sul valore del suo operando (solo). Questa definizione è assoluta e non può essere modificata in seguito. Così, per esempio,

message   db  'hello, world' 
msglen   equ  $-message 

definisce msglen di essere costante 12

Problemi correlati