Qual è la differenza tra Times e Dup in Assembly Language?

2

In un bootloader, la penultima riga è:

TIMES 510-($-$$) db 0

Ora, anche questo comando farà lo stesso:

db 510-($-$$) DUP (0)

Se no perché?

So cosa fa TIMES , ma non è menzionato nel mio libro x86 di Mazidi (pubblicazione Pearson). Qualche idea sul perché?

E qual è il significato del segno $ esattamente? Diversi siti hanno informazioni diverse su $ .

E la riga TIMES 510-($-$$) db 0 è assolutamente necessaria anche se il mio codice bootloader ha una dimensione di 512 byte?

Quindi qualcuno può aiutarmi con queste domande?

    
posta Total Anime Immersion 16.09.2012 - 09:36
fonte

2 risposte

1

TIMES e DUP sono comandi specifici dell'assemblatore e, come tali, non fanno parte del linguaggio assembly x86. Lo stesso vale per $ e $$ .

Il simbolo $ denota l'indirizzo corrente dell'istruzione e $$ indica l'indirizzo dell'inizio della sezione corrente. Quindi le righe con DUP e TIMES calcolano l'indirizzo corrente nella sezione e lo sottrae da 510. In questo modo si azzera appena la sezione dall'inizio fino all'indirizzo corrente.

    
risposta data 16.09.2012 - 10:11
fonte
2

DUP è uno specifico identificatore di operando per le istruzioni di DB / DW / etc psuedo, dicendo loro di ripetere un valore specifico. Può essere utilizzato solo in queste istruzioni dati.

TIMES è un prefisso di istruzioni generico, che dice all'assemblatore di produrre copie multiple dell'istruzione (o dell'istruzione psuedo), qualunque essa sia.

AFAIK, TIMES è specifico per NASM, mentre DUP è ampiamente supportato. Il motivo per cui TIMES viene utilizzato in NASM è che uno degli obiettivi principali della progettazione della NASM era di semplificare l'uso delle direttive e fornire modi più logici e razionali di fare le cose. TIMES può essere usato nel modo in cui mostri uno spazio con zero, ma ci sono altre applicazioni (ad es. allineare loop generando una sequenza di NOP o istruzioni simili), e in questo modo una singola direttiva può gestire più lavori . In realtà non ero a conoscenza del fatto che DUP fosse supportato in tutto il NASM. Immagino che DUP sia stato aggiunto in una versione successiva per la compatibilità con la sintassi in stile MASM; Non sono sicuro di quando; certamente era abbastanza tardi, con il risultato che la documentazione non riporta che è disponibile), ma TIMES è preferito (almeno dagli autori originali di NASM) come una direttiva più generalmente utile.

Per quanto riguarda il significato di $ , la ragione per i diversi siti che hanno descrizioni diverse è probabilmente ancora una volta dovuta alla distinzione NASM / MASM. In NASM, $ è una variabile che contiene l'indirizzo al quale verrà assemblata l'istruzione corrente. Nota che poiché è un indirizzo , potrebbe essere soggetto a delocalizzazione o comunque modificato durante il collegamento. Pertanto non può essere utilizzato nell'istruzione TIMES , il cui valore deve essere determinabile nel punto di assemblaggio (è un espressione critica ). $$ è l'indirizzo dell'inizio della sezione, quindi $ - $$ è un offset, che non è soggetto a delocalizzazione e può quindi essere sempre trasformato in un numero. In MASM, $ ha lo stesso significato, ma non esiste alcuna equivalente $$ variabile (credo che otterresti le stesse cose usando l'operatore WRT , ma è passato un po 'di tempo da quando ho usato MASM, quindi sono non sono sicuro di questo).

Questo dovrebbe consentire di risolvere la risposta alla terza domanda: TIMES 510-($-$$) db 0 non fa nulla se $-$$ è uguale a 510 perché il numero di ripetizioni diventa 0, quindi se sai che il tuo codice è già 512 byte lunghi non ne hai bisogno.

    
risposta data 14.06.2016 - 12:43
fonte

Leggi altre domande sui tag