即使我已经指定了一个变量的大小,我不明白为什么我应该再次使用一个操作时。规格尺寸的规则是什么?
segment .bss
_n resd 1
_m resd 1
segment .text
mov **dword**[_n], 10
你能帮我一下吗?
即使我已经指定了一个变量的大小,我不明白为什么我应该再次使用一个操作时。规格尺寸的规则是什么?
segment .bss
_n resd 1
_m resd 1
segment .text
mov **dword**[_n], 10
你能帮我一下吗?
在许多其他组装商你不必再次指定大小。这是NASM的设计选择。见section 2.2.3 of the manual:
NASM,在设计上,选择不记得你声明的变量的类型。鉴于MASM会记住,在看到
var dw 0
时,你声明var是一个字大小的变量,然后将能够填充指令大小的模糊性mov var,2
,NASM将刻意记住关于符号var的任何内容,除了它在哪里开始,所以你必须明确地编码mov word [var],2
。
其原因之一是他们的设计目标之一是您应该能够查看一行NASM代码,并且仍然能够确切地说明它将生成哪些机器代码(在可能的情况下)。如果您只是在没有类型说明符的情况下执行了mov [_n],10
,那么您将不会知道在不返回最初定义的_n
的位置时会生成什么内容。
mov **dword**[_n], 10
汇编程序需要知道的内存量预留的操作和左手操作使用
mov al,[_n] should be ok even if [_n] is a dword
但
mov [_n], 10
讲述大小,除非汇编什么dword被使用
一段时间之后,它变为第二性质在一个汇编程序来指定尺寸
也可用于切碎了双字成字和字节是有用的,人将在双字加载具有最低字节[_n]
您还可以做MOV字[_n],500000,得到一个奇怪的数字,因为它太大
但MOV字[_n],EAX会因为EAX被视为一个DWORD失败
ASM可以是一个有点古怪
非常感谢。我不知道Nasm不记得变量的大小。 – isbae93