在 x86程序集中使用哪个变量 size (db,dw,dd) ?

我是一个装配初学者,我不知道所有的 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 的含义以及它们是如何影响变量设置和组合的。

先说声谢谢, 程序

251068 次浏览

快速回顾一下,

  • DB -定义字节。8位
  • DW -定义 Word。典型的 x8632位系统上通常为2字节
  • DD -定义双字,在典型的 x8632位系统上通常为4字节

来自 X86组装教程,

Pop 指令 < strong > 从 硬件支持的堆栈 放入指定的操作数(即 register 它首先移动位于内存中的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 的大小都不接受字符串作为操作数。