web-dev-qa-db-fra.com

Quelle taille variable utiliser (db, dw, dd) avec un assemblage x86?

Je suis un débutant à l’Assemblée et je ne sais pas ce que signifient tous les db, dw, dd. J'ai essayé d'écrire ce petit script qui fait 1 + 1, le stocke dans une variable et affiche ensuite le résultat. Voici mon code jusqu'à présent:

.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

J'ai besoin de comprendre ce que les choses db, dw, dd signifient et comment elles affectent le paramétrage et la combinaison des variables et ce genre de chose.

Merci d'avance, Progrmr

58
Progrmr

Examen rapide,

  • [~ # ~] db [~ # ~] - Définit l'octet. 8 bits
  • [~ # ~] dw [~ # ~] - Définit le mot. Généralement 2 octets sur un système x86 32 bits typique
  • [~ # ~] dd [~ # ~] - Définit le double mot. Généralement 4 octets sur un système x86 32 bits typique

De tutoriel sur l’assemblage x86 ,

L'instruction pop supprime l'élément de données de 4 octets situé en haut de la pile prise en charge par le matériel dans l'opérande spécifié (c.-à-d. Registre ou emplacement mémoire). Il déplace d'abord les 4 octets situés à l'emplacement de mémoire [SP] dans le registre ou l'emplacement de mémoire spécifié, puis incrémente SP de 4.

Votre numéro est 1 octet. Essayez de le déclarer avec DD pour qu'il devienne 4 octets et corresponde à la sémantique pop.

77
Pavan Manjunath

La liste complète est:

DB, DW, DD, DQ, DT, DDQ et DO (utilisés pour déclarer des données initialisées dans le fichier de sortie.)

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

Ils peuvent être appelés de différentes manières: (Remarque: pour Visual-Studio - utilisez la syntaxe "h" au lieu de "0x" - par exemple, pas 0x55 mais 55h à la place):

    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 n'accepte pas les constantes numériques en tant qu'opérandes et DDQ n'accepte pas les constantes à virgule flottante en tant qu'opérandes. Toute taille supérieure à DD n'accepte pas les chaînes en tant qu'opérandes.

27
cnd