sas*_*alm 12 x86 assembly tasm
我这里有这个代码,但我不熟悉语法.
STACK16_SIZE = 100h
stack16 db STACK16_SIZE dup (?)
Run Code Online (Sandbox Code Playgroud)
我认为dup
意味着我们声明一个类型为array的变量,因为这是一个堆栈,但我不确定.那么dup
TASM究竟意味着什么呢?
wal*_*lyk 19
STACK16_SIZE dup (?)
表示按STACK16_SIZE
时间复制括号中的数据.这相当于写作?, ?, ?, ?,
...(100h次)
parens中的数据是"未初始化的数据".也就是说,内存已分配,但未在加载时设置为任何特定值.
程序集不提供数组"类型".如果是,则仅在检查数据时使用调试器.但是,在此代码段中,stack16
是一个带有地址的符号,它开始一个字节的内存块 - 这是违反直觉的,可能是一个微妙的bug的来源.对于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 参考。