Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Which variable size to use (db, dw, dd) with x86 assembly?

I am a beginner to assembly and I don't know what all the db, dw, dd, things mean. I have tried to write this little script that does 1+1, stores it in a variable and then displays the result. Here is my code so far:

.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 

I need to understand what the db, dw, dd things mean and how they affect variable setting and combining and that sort of thing.

Thanks in advance, Progrmr

like image 225
Progrmr Avatar asked Apr 16 '12 04:04

Progrmr


People also ask

How many bytes are used by the DW directive?

DW - The DW directive is used to declare a WORD type variable - A WORD occupies 16 bits or (2 BYTE).

What is db and DW in assembly language?

Representing data types in assembly source files requires appropriate assembler directives. The directives allocate data and format x86 little-endian values. Bytes are allocated by define bytes DB. Words are allocated by define words DW. Both allow more than one byte or word to be allocated.

What is DW in assembly code declaration?

The DW statement initializes memory with one or more word (2-byte) values. label is a symbol that is assigned the current memory address. expression is a word value that is stored in memory. Each expression may be a symbol, a string, or an expression.


2 Answers

Quick review,

  • DB - Define Byte. 8 bits
  • DW - Define Word. Generally 2 bytes on a typical x86 32-bit system
  • DD - Define double word. Generally 4 bytes on a typical x86 32-bit system

From x86 assembly tutorial,

The pop instruction removes the 4-byte data element from the top of the hardware-supported stack into the specified operand (i.e. register or memory location). It first moves the 4 bytes located at memory location [SP] into the specified register or memory location, and then increments SP by 4.

Your num is 1 byte. Try declaring it with DD so that it becomes 4 bytes and matches with pop semantics.

like image 161
Pavan Manjunath Avatar answered Sep 19 '22 04:09

Pavan Manjunath


The full list is:

DB, DW, DD, DQ, DT, DDQ, and DO (used to declare initialized data in the output file.)

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

They can be invoked in a wide range of ways: (Note: for Visual-Studio - use "h" instead of "0x" syntax - eg: not 0x55 but 55h instead):

    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 does not accept numeric constants as operands, and DDQ does not accept float constants as operands. Any size larger than DD does not accept strings as operands.

like image 31
cnd Avatar answered Sep 20 '22 04:09

cnd