DUP算子在哪里记数?

Where does DUP operator keeps counting number?

我需要在程序的 .DATA 部分初始化一个结构数组。大多数初始化为零,但我需要设置订单号。我可以在 .DATA 部分使用存储 DUP 运算符的寄存器来初始化数组元素的顺序号吗?或者除了在程序的 .CODE 部分使用循环之外还有另一种方法。

这里是示例程序,初始化时三个NODEi_KEY必须分别设置为1..20。项目要求在.DATA部分设置,不能设置可能是错别字

.DATA

NODE STRUCT
NODEi_KEY DWORD ?
NODEi_VALUE DWORD 0
NODE ENDS

THREE NODE 20 DUP ({,,})

虽然 Masm 非常灵活和强大,但我不相信您所要求的正是可能的。但是,您绝对可以这样做:

 array  DB 3 DUP (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19)

这不是您要的,但我不相信您可以在不剪切和粘贴或找出告诉 DUP 制作多份副本的方法的情况下完成您要执行的操作里面有什么。我上面的内容将定义三乘以二十个字节。这三个中的每一个都将在字节中具有 0 到 19 的整数值。

您也可以这样做:

 array DB 3 DUP (4 DUP (1), 2 DUP (2), 4 DUP (8))

这定义了一个总大小为 3 * 10 字节的区域,其中 1111228888 重复了三次。

你可以为所欲为,但你不能用 DUP 运算符。您需要改用 REPT(重复)指令并创建您自己的计数器:

    .DATA

NODE    STRUCT
    NODEi_KEY DWORD ?
    NODEi_VALUE DWORD 0
NODE    ENDS

THREE   LABEL   NODE
counter = 1
    REPT    20
        NODE    {counter,}
    counter = counter + 1
    ENDM        

这将创建一个包含 20 个 NODE 结构的数组,每个 NODEi_KEY 成员使用其在数组中基于 1 的位置进行初始化。

REPT 指令简单地重复所有内容,直到 ENDM 的次数由参数指定。因此,如果您要更改 REPT 指令,使参数仅为 4,它将生成以下内容:

    NODE    {counter,}
counter = counter + 1
    NODE    {counter,}
counter = counter + 1
    NODE    {counter,}
counter = counter + 1
    NODE    {counter,}
counter = counter + 1