wake-up-neo.com

Welche variable Größe (db, dw, dd) soll mit der x86-Assembly verwendet werden?

Ich bin ein Anfänger in der Versammlung und ich weiß nicht, was all das db, dw, dd, Dinge bedeuten. Ich habe versucht, dieses kleine Skript zu schreiben, das 1 + 1 ausführt, es in einer Variablen speichert und dann das Ergebnis anzeigt. Hier ist mein Code soweit:

.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

Ich muss verstehen, was die db-, dw-, dd-Dinge bedeuten und wie sie sich auf die variable Einstellung und Kombination und dergleichen auswirken.

Vielen Dank im Voraus, Progrmr

58
Progrmr

Schnelle Überprüfung,

  • [~ # ~] db [~ # ~] - Definiere Byte. 8 Bits
  • [~ # ~] dw [~ # ~] - Definiere Wort. In der Regel 2 Byte auf einem typischen x86-32-Bit-System
  • [~ # ~] dd [~ # ~] - Definiere Doppelwort. In der Regel 4 Byte auf einem typischen x86-32-Bit-System

Von x86-Assembly-Tutorial ,

Der Pop-Befehl entfernt das 4-Byte-Datenelement vom oberen Ende des hardwareunterstützten Stapels in den angegebenen Operanden (d. H. Register oder Speicherort). Er verschiebt zuerst die 4 Bytes, die sich am Speicherort [SP] befinden, in das angegebene Register oder den angegebenen Speicherort und erhöht dann SP um 4.

Ihre Nummer ist 1 Byte. Versuchen Sie, es mit DD zu deklarieren, damit es 4 Bytes wird und mit der Semantik pop übereinstimmt.

77
Pavan Manjunath

Die vollständige Liste lautet:

DB, DW, DD, DQ, DT, DDQ und DO (zum Deklarieren initialisierter Daten in der Ausgabedatei.)

Siehe: http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

Sie können auf vielfältige Weise aufgerufen werden: (Hinweis: Verwenden Sie für Visual-Studio "h" anstelle der "0x" -Syntax - z. B. nicht 0x55, sondern 55h):

    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 akzeptiert keine numerischen Konstanten als Operanden und DDQ akzeptiert keine Gleitkommakonstanten als Operanden. Jede Größe größer als DD akzeptiert keine Zeichenfolgen als Operanden.

27
cnd