我什么时候需要在 Assembly 中指定操作数的大小?

use*_*720 1 x86 assembly nasm

我刚开始在大学学习汇编(x86,NASM),我真的很困惑它是如何工作的。在我对此提出的许多问题中,这一直困扰着我。

我什么时候需要指定操作数的大小?有规律吗?例如:

segment  data use32 class=data
    a  db 10
    b  dw 40
segment  code use32 class=code
start:
    mov  AX, [b]
    div  BYTE [a]
Run Code Online (Sandbox Code Playgroud)

这里我们将操作div码中操作数的大小指定为BYTE。如果我删除那BYTE部分,我会得到一个错误,所以我们需要指定它。

segment  data use32 class=data
    a  db 10
    b  dw 40
segment  code use32 class=code
start:
    mov  AH, 2
    mul  AH
Run Code Online (Sandbox Code Playgroud)

在这里,我们不需要指定操作数的大小2。它只是有效。

那么我什么时候必须指定尺寸?是不是很简单:当我在内存中声明了一个变量时,指定它的大小?考虑到上面给出的例子,我倾向于这么认为,但通过我对 Assembly 的短暂体验,我发现它往往违背我关于事情应该如何运作的逻辑。

另外,在告诉我什么时候需要指定尺寸之后,你能告诉我为什么我们需要这样做吗?当我们需要这样做时,我们为什么需要这样做?我的意思是,我们已经声明了变量,所以变量的类型应该对程序可见,不是吗?为什么我们需要指定大小,否则我们会得到一个错误?

Jos*_*ica 5

如果可以从您指定的其他内容推断出操作数大小,则无需指定操作数大小。例如,mov只作用于两个相同大小的操作数,并且AX是一个字大小的寄存器,所以在 中mov AX, [b],可以推断出[b]必须是字大小的。但是您只指定一个操作数 to div,因此您必须告诉它大小[a]是多少,因为它没有任何信息可以从中推断出来。