Assembly 何时需要在汇编中指定操作数的大小?

Assembly 何时需要在汇编中指定操作数的大小?,assembly,x86,nasm,Assembly,X86,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] 在这里,我们将div操作码中的操作数大小指定为BYTE。如果我删除了字节部分,我会

我刚开始在大学学习汇编(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]
在这里,我们将
div
操作码中的操作数大小指定为
BYTE
。如果我删除了
字节
部分,我会得到一个错误,所以我们需要指定它

segment  data use32 class=data
    a  db 10
    b  dw 40
segment  code use32 class=code
start:
    mov  AH, 2
    mul  AH
在这里,我们不需要指定操作数
2
的大小。它只是工作

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


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

如果可以从您指定的其他内容推断操作数大小,则不需要指定操作数大小。例如,
mov
只对两个大小相同的操作数起作用,而
AX
是一个字大小的寄存器,因此在
mov AX中,[b]
可以推断
[b]
必须是字大小的。但是您只为
div
指定了一个操作数,因此您必须告诉它
[a]
的大小,因为它没有任何信息可供推断。

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

对于没有实际声明变量的汇编器,您定义了一个符号。汇编程序不知道也不关心您是否正在使用此符号访问符号所指位置的变量。NASM符号没有类型,这是一个有意的设计决定,将其与MASM区分开来,MASM提供符号类型。几乎是重复的:这意味着在没有寄存器操作数、只有寻址模式和/或立即数的情况下需要它。@RossRidge您能解释一下具体的区别吗(至少向汇编程序解释一下)在符号和变量之间?这两件事做什么?内存变量是在程序的数据部分保留的一个、两个或更多字节。Symbol是您分配给此变量的名称,它表示此内存变量的第一个字节的地址。对于汇编程序,您实际上没有声明变量,而是定义了一个符号。汇编程序不知道也不关心您是否正在使用此符号访问符号所指位置的变量。NASM符号没有类型,这是一个有意的设计决定,将其与MASM区分开来,MASM提供符号类型。几乎是重复的:这意味着在没有寄存器操作数、只有寻址模式和/或立即数的情况下需要它。@RossRidge您能解释一下具体的区别吗(至少向汇编程序解释一下)在符号和变量之间?这两件事做什么?内存变量是在程序的数据部分保留的一个、两个或更多字节。Symbol是您分配给此变量的名称,它表示此内存变量的第一个字节的地址。使用常量进行加法如何?为什么我可以在不指定任何内容的情况下向寄存器添加2这样的值?@user010517720您可以这样向寄存器添加2,因为寄存器总是有固定的大小(例如,
eax
始终是一个双字)。那么它会自动将2视为双字吗?既然
eax
是一个dword?@user010517720对。用常量加法怎么样?为什么我可以在不指定任何内容的情况下向寄存器添加2这样的值?@user010517720您可以这样向寄存器添加2,因为寄存器总是有固定的大小(例如,
eax
始终是一个双字)。那么它会自动将2视为双字吗?因为
eax
是一个dword?@user010517720对。