什么`dup(?)`在TASM中意味着什么?

sas*_*alm 12 x86 assembly tasm

我这里有这个代码,但我不熟悉语法.

STACK16_SIZE    =       100h
stack16         db      STACK16_SIZE dup (?)
Run Code Online (Sandbox Code Playgroud)

我认为dup意味着我们声明一个类型为array的变量,因为这是一个堆栈,但我不确定.那么dupTASM究竟意味着什么呢?

wal*_*lyk 19

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

parens中的数据是"未初始化的数据".也就是说,内存已分配,但未在加载时设置为任何特定值.

程序集不提供数组"类型".如果是,则仅在检查数据时使用调试器.但是,在此代码段中,stack16是一个带有地址的符号,它开始一个字节的内存块 - 这是违反直觉的,可能是一个微妙的bug的来源.对于CPU堆栈,它实际上应该被定义为16位字(dw)或32位字(dd).


Ale*_*nze 7

?意味着没有特定的价值,没有初始化.DUP意味着重复.

所以你获得了未初始化的100h字节.


rkh*_*khb 7

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