Assembly 为什么可以';我是否声明了一个变量,该变量接受程序集中未引用变量的值?

Assembly 为什么可以';我是否声明了一个变量,该变量接受程序集中未引用变量的值?,assembly,nasm,Assembly,Nasm,在汇编(x86 NASM)中,这样做完全可以 a dd 17h a2 dd a 通过数据段中的这两行代码,我声明了一个双字a,我为其赋值17h。然后我声明另一个双字,我给这个双字a地址的值。这是可行的,我明白发生了什么 但当我尝试这样做时: a dd 17h a2 dd [a] 我得到一个语法错误!我真的不知道为什么。我希望这段代码定义一个双字a,其值为17h(与上一个示例相同),然后定义一个双字a2,该双字取a,因此17h。但正如我所说,这似乎不起作用。我不明白为什么这行不通。据我所知,只

在汇编(x86 NASM)中,这样做完全可以

a dd 17h
a2 dd a
通过数据段中的这两行代码,我声明了一个双字
a
,我为其赋值
17h
。然后我声明另一个双字,我给这个双字a地址的值。这是可行的,我明白发生了什么

但当我尝试这样做时:

a dd 17h
a2 dd [a]
我得到一个语法错误!我真的不知道为什么。我希望这段代码定义一个双字
a
,其值为
17h
(与上一个示例相同),然后定义一个双字
a2
,该双字取
a
,因此
17h
。但正如我所说,这似乎不起作用。我不明白为什么这行不通。据我所知,只要我们遵循地址偏移公式,就可以寻址内存,该公式的形式为[base+index*scale+constant]。在我的例子中,
a
a的地址是常量,因此这将是公式中的常量,基数和小数位数将为零。至少我是这么想的。但很明显,它不起作用

但正如我所说,这似乎不起作用。我不明白为什么这行不通

仅仅是因为汇编程序不支持它,尽管他们可以

据我所知,只要我们遵循地址偏移量公式,就可以寻址内存,该公式的形式为[base+index*scale+constant]

是的,这是Intel语法,用来表示x86 CPU的寻址可能性。然而,这只适用于运行时,当芯片进行实际寻址时


您需要的是,汇编程序支持一种类似的语法来定义源文件中的数据,该数据采用另一个定义的值。他们当然可以这样做(或不这样做),但这取决于汇编程序的设计者。这与x86寻址的可能性无关。

这只适用于指令
dd
是一个汇编指令。当然,您的汇编器仍然可以处理该值,但由于它是编译时的,所以您没有寄存器,所以您所能做的最好是一个无意义的常量。为了取消对该值的引用,汇编器必须在运行时从内存中读取该值。它不能也不应该假设该值不会改变。如果您想要相同的值两次,请使用
times 2 dd 17h
。或者为它定义一个在两个位置都使用的宏。不能将
dd
的操作数作为汇编时间常数引用,即使它正好位于标签之后。