【发布时间】:2019-08-01 10:48:04
【问题描述】:
在 MASM 版本 11 SDK 中使用 32 位 MASM 程序集,我在编译过程中发现了一个错误。该错误指向我声明具有双字 (dd) 大小的变量的行。该消息说该变量对于我尝试分配给它的字符串来说太小了。当我将变量定义为字节而不是(db)时,程序编译时没有错误。这意味着使用 db 指令声明变量可以比声明双倍数据大小允许更多的存储空间。下面是错误信息指向的双字变量的声明代码:
.data
msg_run dd "Ran a function.", 0
我把msg_run的数据大小改成了一个字节:
.data
msg_run db "Ran a function.", 0
当我尝试用第二行编译时,程序编译并运行没有问题。为什么该错误暗示声明为字节大小的变量比声明为双字大小的变量具有更大的容量?尾随的“,0”有影响吗?
我审查的来源:
https://www.cs.virginia.edu/~evans/cs216/guides/x86.html https://www.shsu.edu/~csc_tjm/fall2003/cs272/intro_to_asm.html
【问题讨论】:
-
“字符串”实际上只是一个以零结尾的字符数组。每个字符都是一个单字节(对于窄字符,C 中的
char)。使用dd可以使数组的每个元素成为双字,即每个元素都是 32 位,这并不正确。 -
当您使用
db时,MASM 会以特殊方式处理字符串(引号之间的内容)。db是单个字符(字节),因此 MASM 将获取每个字符并将其存储在一个字节中。对于大于字节的类型(dw 和 dd),这种类型的处理不会以相同的方式发生。在这些情况下,MASM 会尝试将您的字符串填充到单个 DWORD(32 位值)中。看看如果你使用dd并让你的字符串长度
标签: assembly size declaration masm