假设我声明了以下内容:
section .bss
buffer resb 1
这些说明如下section .text
:
mov al, 5 ; mov-immediate
mov [buffer], al ; store
mov bl, [buffer] ; load
mov cl, buffer ; mov-immediate?
我是否正确理解 bl 将包含值 5,而 cl 将包含变量的内存地址buffer
?
我对两者之间的区别感到困惑
- 将立即数移入寄存器,
- 将寄存器移动到立即数(什么进入,数据或地址?)和
- 将立即数移入不带括号的寄存器
- 例如,
mov cl, buffer
vsmov cl, [buffer]
- 例如,
更新:阅读回复后,我认为以下摘要是准确的:
mov edi, array
将第零个数组索引的内存地址放入edi
. 即标签地址。mov byte [edi], 3
将 VALUE 3 放入数组的第零个索引中- 之后
add edi, 3
,edi
现在包含数组的第三个索引的内存地址 mov al, [array]
将第零索引处的 DATA 加载到al
.mov al, [array+3]
将第三个索引处的 DATA 加载到al
.mov [al], [array]
无效,因为x86 不能对 2 个显式内存操作数进行编码,并且因为al
只有 8 位,即使在 16 位寻址模式下也不能使用。 引用内存位置的内容。(x86 寻址模式)mov array, 3
是无效的,因为你不能说“嘿,我不喜欢array
存储的偏移量,所以我称之为 3”。立即数只能是源操作数。mov byte [array], 3
将值 3 放入数组的第零个索引(第一个字节)。 需要说明byte
符来避免带有内存、立即操作数的指令的字节/字/双字之间的歧义。否则,这将是一个汇编时错误(操作数大小不明确)。
请说明其中任何一个是否是错误的。(编者注:我修复了语法错误/歧义,因此有效的实际上是有效的 NASM 语法。并链接了其他问答以获取详细信息)