Domanda

Sono curioso di sapere se esiste una sintassi GAS speciale per ottenere lo stesso risultato dell'esempio NASM:

SECTION .data       

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

Soprattutto mi interessa il simbolo $ che rappresenta l'indirizzo attuale.

È stato utile?

Soluzione

C'è un utile confronto tra gas e NASM qui: http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html

Vedi in particolare questa parte, che penso risponda alla tua domanda:


Il Listato 2 introduce anche il concetto di contatore di posizione (riga 6).NASM fornisce una variabile speciale (le variabili $ e $$) per manipolare il contatore della posizione.In GAS non esiste un metodo per manipolare il contatore della posizione ed è necessario utilizzare le etichette per calcolare la posizione di memorizzazione successiva (dati, istruzioni, ecc.).Ad esempio, per calcolare la lunghezza di una stringa, utilizzeresti il ​​seguente idioma in NASM:

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

$ fornisce il valore corrente del contatore di posizione e sottraendo il valore dell'etichetta (tutti i nomi di variabili sono etichette) da questo contatore di posizione si ottiene il numero di byte presenti tra la dichiarazione dell'etichetta e la posizione corrente.La direttiva equ viene utilizzata per impostare il valore della variabile STR_SIZE nell'espressione che la segue.Un linguaggio simile in GAS si presenta così:

prompt_str:
     .ascii "Enter Your Name: "

pstr_end:
     .set STR_SIZE, pstr_end - prompt_str

L'etichetta finale (pstr_end) fornisce l'indirizzo della posizione successiva e sottraendo l'indirizzo dell'etichetta iniziale si ottiene la dimensione.Da notare anche l'uso di .set per inizializzare il valore della variabile STR_SIZE nell'espressione che segue la virgola.È anche possibile utilizzare un file .equ corrispondente.Non esiste alternativa alla direttiva set di GAS nella NASM.


Altri suggerimenti

Estratto da info as (GNU Binutils 2.21.90) o online nel manuale del gas: https://sourceware.org/binutils/docs/as/dot.html

5.4 Il simbolo dot speciale

Il simbolo speciale . si riferisce all'attuale indirizzo che as si sta assemblando in. Quindi, l'espressione melvin: .long . definisce melvin per contenere il proprio indirizzo.

Assegnare un valore a . è trattato come a .org direttiva. Quindi, l'espressione .=.+4 è lo stesso di dire .space 4.

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

è la versione a gas dello stesso linguaggio utilizzato in NASM (len equ $ - symbol) Modo idiomatico per convincere l'assemblatore per calcolare la lunghezza di qualcosa per te.

USAGGIO DI ESEMPIO DI .

Esempio esplicito minimo:

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

Combo comune per le lunghezze della stringa:

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

s_len = sintassi spiegata a Esiste una differenza tra l'assegnazione del segno uguale "x = 1" e ".equ x, 1" o ".set x, 1" nel gruppo gas GNU?

Questo può essere usato in modo concreto, ad esempio in a Esempio di indipendente Linux Minimal Runnable Linux.

Ciclo infinito:

jmp .
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top