dw和dd与字符串的db指令有什么不同?

Pic*_*ana 3 string x86 assembly masm nasm

假设我想在运行汇编程序(in section .data)之前定义一个初始化的变量字符串.我选择创建的变量被调用Digits,它是一个包含所有十六进制符号的字符串.

Digits: db "0123456789ABCDEF"
Run Code Online (Sandbox Code Playgroud)

我用变量定义了变量db,这意味着定义了字节.这是否意味着Digits变量长度为8位?这对我来说似乎没有意义,因为:

字符串中的每个字符都是ASCII字符,因此每个字符需要2个字节.总的来说,整个字符串需要32个字节!

那么当我将变量定义为byte时,它意味着什么?字?双字?我没有看到差异.由于我的误解,告诉字符串所需的数据类型似乎是多余的.

PD:这个问题没有帮助我理解.

Pet*_*des 6

关联问题的答案之一引用了NASM手册中的例子,它回答了你的问题.根据要求,我将针对所有三种情况进行扩展(并纠正小写与大写ASCII编码错误!):

db   'ABCDE'     ; 0x41 0x42 0x43 0x44 0x45                (5 bytes)
dw   'ABCDE'     ; 0x41 0x42 0x43 0x44 0x45 0x00           (6 bytes, 3 words)
dd   'ABCDE'     ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 2 doublewords)
dq   'ABCDE'     ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 1 quadword)
Run Code Online (Sandbox Code Playgroud)

所以区别在于,当你使用或代替时,它会用零填充元素大小的倍数.dddwdb

根据@Jose的评论,一些汇编器可能使用不同的字节顺序dd或dw字符串常量.在NASM语法中,字符串始终以与引用常量中出现的顺序相同的顺序存储在内存中.

你可以用NASM组装它(例如进入默认的平面二进制输出)并使用hexdump -C或者某些东西来确认字节顺序和填充量.


请注意,此元素大小的填充适用于每个逗号分隔的元素.所以看似无辜的人dd '%lf', 10, 0实际上是这样组装的:

;dd   '%lf',    10,        0
db    '%lf',0,  10,0,0,0,  0,0,0,0        ;; equivalent with db
Run Code Online (Sandbox Code Playgroud)

注意0换行之前; 如果你将指针传递给它printf,那么C字符串就是"%lf"由第一个0字节终止的.

(具有显式长度的write系统调用或fwrite函数将打印整个事物,包括0字节,因为这些函数适用于二进制数据,而不是C隐式长度字符串.)