2013-05-17 138 views
0

即使我已经指定了一个变量的大小,我不明白为什么我应该再次使用一个操作时。规格尺寸的规则是什么?

segment .bss 
_n resd 1 
_m resd 1 

segment .text 
mov **dword**[_n], 10 

你能帮我一下吗?

回答

1

在许多其他组装商你不必再次指定大小。这是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的位置时会生成什么内容。

+0

非常感谢。我不知道Nasm不记得变量的大小。 – isbae93

0
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可以是一个有点古怪

+0

我很困惑。你的意思是告诉我左手操作数用于尺寸规格?但是,由于'mov [_n],10'中'[_n]'的大小已经在段.bss中定义了,所以没有意义。 – isbae93

+0

IMO如果没有指定尺寸,assmebler应该采用默认的declard尺寸。我不明白你为什么必须手动指定它。毕竟,用变量声明变量的意义是什么? – Devolus

+0

Nasm有失忆症。不喜欢它?使用Masm。 –