Подтвердить что ты не робот

X86 - Какой размер переменной использовать (db, dw, dd)

Я начинаю сборку, и я не знаю, что означают все вещи db, dw, dd. Я попытался написать этот маленький script, который делает 1 + 1, сохраняет его в переменной и затем отображает результат. Вот мой код:

.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

Мне нужно понять, что означают вещи db, dw, dd и как они влияют на настройку и комбинирование переменных и такие вещи.

Спасибо заранее, Progrmr

4b9b3361

Ответ 1

DB - определение байта. 8 бит

DW - определение слова. Обычно 2 байта в стандартной 32-разрядной системе x86

DD. Определите двойное слово. Обычно 4 байта в стандартной 32-разрядной системе x86

Из учебник по сборке x86,

Команда pop удаляет 4-байтовый элемент данных из верхней части связанный с оборудованием стек в указанный операнд (т.е. регистр или памяти). Сначала он перемещает 4 байта, расположенных в памяти местоположение [SP] в указанный регистр или ячейку памяти, а затем увеличивает SP на 4.

Ваше число - 1 байт. Попробуйте объявить его с помощью DD, чтобы он стал 4 байтами и соответствовал семантике pop.

Ответ 2

Полный список:

DB, DW, DD, DQ, DT, DDQ и DO (используется для объявления инициализированных данных в выходном файле.)

Смотрите: http://www.tortall.net/projects/yasm/manual/html/nasm-pseudop.html

Они могут быть вызваны различными способами: (Примечание: для Visual-Studio используйте "h" вместо синтаксиса "0x" - например: не 0x55, а вместо 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 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 не принимает числовые константы в качестве операндов, а DDQ не принимает константы с плавающей запятой в качестве операндов. Любой размер, отличный от DD, не принимает строки в качестве операндов.