0

即使我已经指定了变量的大小,我也不明白为什么在使用操作时我应该再次这样做。

segment .bss
_n resd 1
_m resd 1

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

你能帮我一把吗?

4

2 回答 2

1

在许多其他汇编程序中,您不必再次指定大小。这是 NASM 的设计选择。请参阅手册的第 2.2.3 节

NASM 在设计上选择不记住您声明的变量类型。MASM 会记住,在看到var dw 0时,您将 var 声明为字长变量,然后能够填充指令大小中的歧义,而mov var,2NASM 将故意不记住符号 var 的任何内容,除非它开始的位置,所以你必须明确编码mov word [var],2

这样做的原因是,他们的设计目标之一是您应该能够查看一行 NASM 代码,并且仍然准确地知道它将生成什么机器代码(如果可能)。如果您只是在没有类型说明符的情况下执行此操作,那么如果不回溯最初定义mov [_n],10的位置,您将不知道会生成什么。_n

于 2013-05-17T15:26:17.737 回答
0
mov **dword**[_n], 10

汇编器需要知道为操作保留的内存量,并且使用左手操作数

mov al,[_n] should be ok even if [_n] is a dword

mov [_n], 10

除非使用dword ,否则不会告诉汇编器大小

一段时间后,在 asm 程序中指定大小成为第二天性

也可用于将 dword 分割成单词和字节,al 将加载 dword [_n] 中的最低字节

你也可以做 mov word [_n],500000 得到一个奇怪的数字,因为它太大了

但是 mov word [_n],eax 会失败,因为 eax 被视为 dword

asm 可能有点古怪

于 2013-05-17T01:31:54.737 回答