什么时候需要在汇编中指定操作数的大小?
When do I need to specify the size of the operand in Assembly?
我刚开始在大学学习 Assembly (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
。如果我删除那个 BYTE
部分,我会得到一个错误,所以我们需要指定它。
segment data use32 class=data
a db 10
b dw 40
segment code use32 class=code
start:
mov AH, 2
mul AH
在这里,我们不需要指定操作数的大小2
。它只是工作。
那么我什么时候必须指定尺寸?是否简单到:当我在内存中声明一个变量时,指定它的大小?考虑到上面给出的示例,我倾向于这样认为,但是通过我对 Assembly 的短暂体验,我发现它往往违背我关于事情应该如何工作的逻辑。
此外,在说明了我们何时需要指定尺寸之后,您能否也告诉我为什么我们需要这样做?当我们需要做的时候,我们为什么需要做?我的意思是,我们已经声明了变量,所以变量的类型应该对程序可见,不是吗?为什么我们需要指定大小,否则会出错?
如果可以从您指定的其他内容推断出操作数大小,则无需指定操作数大小。例如mov
只作用于两个相同大小的操作数,而AX
是一个word-sized寄存器,所以在mov AX, [b]
中可以推导出[b]
必须是 word-sized。但是你只为 div
指定了一个操作数,所以你必须告诉它 [a]
的大小是多少,因为它没有任何信息可以从中推断出来。
我刚开始在大学学习 Assembly (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
。如果我删除那个 BYTE
部分,我会得到一个错误,所以我们需要指定它。
segment data use32 class=data
a db 10
b dw 40
segment code use32 class=code
start:
mov AH, 2
mul AH
在这里,我们不需要指定操作数的大小2
。它只是工作。
那么我什么时候必须指定尺寸?是否简单到:当我在内存中声明一个变量时,指定它的大小?考虑到上面给出的示例,我倾向于这样认为,但是通过我对 Assembly 的短暂体验,我发现它往往违背我关于事情应该如何工作的逻辑。
此外,在说明了我们何时需要指定尺寸之后,您能否也告诉我为什么我们需要这样做?当我们需要做的时候,我们为什么需要做?我的意思是,我们已经声明了变量,所以变量的类型应该对程序可见,不是吗?为什么我们需要指定大小,否则会出错?
如果可以从您指定的其他内容推断出操作数大小,则无需指定操作数大小。例如mov
只作用于两个相同大小的操作数,而AX
是一个word-sized寄存器,所以在mov AX, [b]
中可以推导出[b]
必须是 word-sized。但是你只为 div
指定了一个操作数,所以你必须告诉它 [a]
的大小是多少,因为它没有任何信息可以从中推断出来。