Какой размер переменной использовать (db, dw, dd) со сборкой x86?
Я новичок в сборке, и я не знаю, что значат все db, dw, dd, вещи. Я попытался написать этот маленький скрипт, который выполняет 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 и как они влияют на установку и объединение переменных и тому подобное.
Заранее спасибо, прогрмр
2 ответа
Быстрый обзор,
- DB - Определить байт. 8 бит
- DW - Определить слово. Обычно 2 байта в типичной 32-разрядной системе x86
- DD - определить двойное слово. Обычно 4 байта в типичной 32-разрядной системе x86
Команда pop удаляет 4-байтовый элемент данных из верхней части поддерживаемого аппаратным обеспечением стека в указанный операнд (т. Е. Регистр или ячейку памяти). Сначала он перемещает 4 байта, расположенные в ячейке памяти [SP], в указанный регистр или ячейку памяти, а затем увеличивает SP на 4.
Ваш номер 1 байт. Попробуйте объявить это с DD
так что он становится 4 байта и совпадает с pop
семантика.
Полный список:
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'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 не принимает числовые константы в качестве операндов, а DDQ не принимает константы с плавающей точкой в качестве операндов. Любой размер больше, чем DD, не принимает строки в качестве операндов.