16

我这里有这段代码,但我不熟悉语法。

STACK16_SIZE    =       100h
stack16         db      STACK16_SIZE dup (?)

我认为dup意味着我们声明了一个数组类型的变量,因为这是一个堆栈,但我不确定。那么dup在 TASM 中究竟是什么意思呢?

4

3 回答 3

23

STACK16_SIZE dup (?)表示按STACK16_SIZE次数复制括号中的数据。相当于写?, ?, ?, ?,...(100h次)

括号中的数据是“未初始化的数据”。也就是说,内存已分配,但未在加载时设置为任何特定值。

程序集不提供数组“类型”。如果是这样,则它仅供调试器在检查数据时使用。然而,在这个代码片段中,stack16是一个以字节内存块开头的地址的符号——这是违反直觉的,并且可能是一个微妙错误的来源。对于 CPU 堆栈,它确实应该定义为 16 位字 ( dw) 或 32 位字 ( dd)。

于 2013-04-11T18:30:20.060 回答
10

让我们从一个不同的例子开始。您可以阅读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 参考

于 2014-11-06T17:53:56.983 回答
10

?表示没有特定值,未初始化。DUP意味着重复。

所以你得到了 100h 个未初始化的字节。

于 2013-04-11T18:31:23.790 回答