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.