Die variable Größe zu verwenden (db, dw, dd) mit x86 Assembler?
Ich bin ein Anfänger auf Montage und ich weiß nicht, was alle db, dw, dd, Dinge bedeuten.
Ich habe versucht zu schreiben, dieses kleine script, das macht 1+1, speichert es in einer variable und zeigt dann das Ergebnis. Hier ist mein code bisher:
.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
Brauche ich, um zu verstehen, was die db, dw, dd Dinge bedeuten und wie Sie Einfluss auf die variable Einstellung und der Kombination und die Art der Sache.
Vielen Dank im Voraus,
Progrmr
- db byte, 8 bits, dw Wort 16 bits, dd double word, 32 bits. Hinweis: dies ist für x86, die auf anderen Plattformen ein Wort ist 32 bit und halfword 16 bit. Andere ein byte 9 bits, etc. Was man mit einer db ist eine Sammlung von bytes. genau wie unsigned char[]=... in C.
push eax
/pop [num]
ist lächerlich. Nurmov [num], eax
. Odermov dword [num], 1+1
zu lassen, die assembler machen das 1+1 für Sie beim montieren der Zeit, statt der run-time, und Strahlen einemov m32, imm32
instruction encoding. (Diedword
Größe ist nötig, denn es gibt kein register operand zu schließen, die Größe aus). Odermov eax, 1
/add eax, 1
.- Ich gehe davon aus die Anzahl der upvotes, dass dies einer der diese RTFM-Fragen, kommt höher hinauf in google als das eigentliche Handbuch. Finden Sie unter die x86-wiki-tag für links zu Referenzmaterial und tutorials. Eine Besonderheit nicht erwähnt in den Antworten ist, dass MASM verwendet die Größe des Raumes erklärt, nachdem ein label zu bedeuten, das operand-size-Anweisungen, die sich darauf beziehen. NASM-syntax nicht irgendwelche seltsamen guess-what-you-mean Zeug Los: können Sie sagen, wie eine Belehrung montieren, ohne Blick auf andere Zeilen Quelltext.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schnelle überprüfung,
Vom x86 Assembler tutorial,
Ihre num 1 byte. Versuchen Sie deklarieren es mit
DD
so, dass es immer 4 bytes und passt mitpop
Semantik.Die vollständige Liste ist:
DB, DW, DD, DQ, DT, DDQ, und TUN (verwendet, um zu deklarieren initialisiert Daten in die Ausgabe-Datei).
Finden Sie unter: http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html
Können Sie aufgerufen werden eine Breite Palette von Möglichkeiten: (Hinweis: für Visual-Studio - verwenden Sie "h" anstelle von "0x" syntax - eg: nicht 0x55, aber 55h statt):
DT akzeptiert keine numerischen Konstanten als Operanden, und DDQ nicht annehmen float-Konstanten als Operanden. Jede Größe, die größer als DD nicht akzeptieren strings als Operanden.