2012-04-16 12 views
45

Sono un principiante al montaggio e non so cosa significano tutte le db, dw, dd, le cose. Ho provato a scrivere questo piccolo script che fa 1 + 1, lo memorizza in una variabile e quindi visualizza il risultato. Ecco il mio codice finora:assembly x86 - Quale dimensione variabile da usare (db, dw, dd)

.386 
.model flat, stdcall 
option casemap :none 
include \masm32\include\windows.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\masm32.inc 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\masm32.lib 
.data 
num db ? ; set variable . Here is where I don't know what data type to use. 
.code 
start: 
mov eax, 1    ; add 1 to eax register 
mov ebx, 1    ; add 1 to ebx register 
add eax, ebx    ; add registers eax and ebx 
push eax     ; push eax into the stack 
pop num     ; pop eax into the variable num (when I tried it, it gave me an error, i think thats because of the data type) 
invoke StdOut, addr num ; display num on the console. 
invoke ExitProcess  ; exit 
end start 

ho bisogno di capire ciò che il db, DW, le cose dd significa e come influenzano l'impostazione variabile e che unisce e quel genere di cose.

Grazie in anticipo, Progrmr

+2

byte db, 8 bit, parola dw 16 bit, dd doppia parola 32 bit. Nota: per x86 su altre piattaforme una parola è di 32 bit e la metà di 16 bit. Altri un byte è 9 bit, ecc. Quello che stai creando con un db è una raccolta di byte. proprio come char unsigned [] = ... in C. –

+0

'push eax' /' pop [num] 'è ridicolo. Solo 'mov [num], eax'. O 'mov dword [num], 1 + 1' per lasciare che l'assemblatore faccia il 1 + 1 al momento dell'assemblaggio, invece del tempo di esecuzione, ed emetta una codifica di istruzione' mov m32, imm32'. (La dimensione 'dword' è necessaria perché non esiste un operando di registro per dedurre la dimensione da). O 'mov eax, 1' /' aggiungi eax, 1'. –

+0

Presumo dal numero di upvotes che questa è una di quelle domande RTFM che emerge più in alto di google rispetto al manuale attuale.** Vedi [la wiki del tag x86] (http://stackoverflow.com/tags/x86/info) ** per i collegamenti al materiale di riferimento e ai tutorial. Una sottigliezza non menzionata nelle risposte è che MASM utilizza la dimensione dello spazio dichiarato dopo un'etichetta per implicare la dimensione dell'operando delle istruzioni che fanno riferimento ad essa. La sintassi NASM non ha strane cose su che cosa vuoi dire: puoi dire come si assemblerà un'istruzione senza guardare le altre linee di origine. –

risposta

59

recensione rapida,

  • DB - Definire Byte. 8 bit
  • DW - Definisci parola. Generalmente 2 byte su un tipico sistema x86 a 32 bit
  • DD - Definire una doppia parola. Generalmente 4 byte su un tipico x86 sistema a 32 bit

Da x86 assembly tutorial,

L'istruzione pop rimuove l'elemento dati da 4 byte dalla cima stack supportata da hardware nel operando specificato (es. registro o posizione di memoria). Si muove prima 4 byte situati memoria posizione [SP] nella posizione registro o memoria specificata, e poi incrementa SP da 4.

tuo num è 1 byte. Prova a dichiararlo con DD in modo che diventi 4 byte e corrisponda alla semantica pop.

+2

Grazie. Questo è stato molto utile! – Progrmr

20

L'elenco completo è:

DB, DW, DD, DQ, DT, DDQ, e DO

See (utilizzato per dichiarare i dati inizializzati nel file di output.): http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

essi possono essere invocati in una vasta gamma di modi: (Nota: per Visual-Studio - usare "h" invece di sintassi "0x" - ad esempio: non 0x55 ma 55h invece):

db  0x55    ; just the byte 0x55 
    db  0x55,0x56,0x57  ; three bytes in succession 
    db  'a',0x55   ; character constants are OK 
    db  'hello',13,10,'$' ; so are string constants 
    dw  0x1234    ; 0x34 0x12 
    dw  'A'     ; 0x41 0x00 (it's just a number) 
    dw  'AB'    ; 0x41 0x42 (character constant) 
    dw  'ABC'    ; 0x41 0x42 0x43 0x00 (string) 
    dd  0x12345678   ; 0x78 0x56 0x34 0x12 
    dq  0x1122334455667788 ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11 
    ddq  0x112233445566778899aabbccddeeff00 
    ; 0x00 0xff 0xee 0xdd 0xcc 0xbb 0xaa 0x99 
    ; 0x88 0x77 0x66 0x55 0x44 0x33 0x22 0x11 
    do  0x112233445566778899aabbccddeeff00 ; same as previous 
    dd  1.234567e20   ; floating-point constant 
    dq  1.234567e20   ; double-precision float 
    dt  1.234567e20   ; extended-precision float 

DT non accetta numerico c onstants come operandi e DDQ non accetta le costanti float come operandi. Qualsiasi dimensione maggiore di DD non accetta le stringhe come operandi.

+0

hmm, come @LeoMingo ha sottolineato nel suo commento (pubblicato come risposta), questo esempio è buggato! Le stringhe devono essere maiuscole per dare quei valori ASCII. L'ascii minuscolo ha valori esadecimali più alti di 0x20. –

+0

Ben avvistato! L'ho riparato. – cnd