我这里有这段代码,但我不熟悉语法。
STACK16_SIZE = 100h
stack16 db STACK16_SIZE dup (?)
我认为dup
意味着我们声明了一个数组类型的变量,因为这是一个堆栈,但我不确定。那么dup
在 TASM 中究竟是什么意思呢?
STACK16_SIZE dup (?)
表示按STACK16_SIZE
次数复制括号中的数据。相当于写?, ?, ?, ?,
...(100h次)
括号中的数据是“未初始化的数据”。也就是说,内存已分配,但未在加载时设置为任何特定值。
程序集不提供数组“类型”。如果是这样,则它仅供调试器在检查数据时使用。然而,在这个代码片段中,stack16
是一个以字节内存块开头的地址的符号——这是违反直觉的,并且可能是一个微妙错误的来源。对于 CPU 堆栈,它确实应该定义为 16 位字 ( dw
) 或 32 位字 ( dd
)。
让我们从一个不同的例子开始。您可以阅读20 DUP (0)
为“零的二十个重复项”。整个表达式INPUTSTR DB 20 DUP (0)
等价于INPUTSTR DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
。
现在,因为?
意思是“未初始化的值”,20 DUP (?)
会给你 20 个未初始化的字节。而且,在这种特定情况下,如果你有STACK16_SIZE DUP (?)
,你会得到STACK16_SIZE
未初始化的字节。
此语法不是 TASM 特定的。MASM 也支持它;查看Microsoft 的官方 MASM 参考。
?
表示没有特定值,未初始化。DUP
意味着重复。
所以你得到了 100h 个未初始化的字节。