假设我有以下内容声明:section .bssbuffer resb 1 并且这些指令在section .text中遵循:mov al,5; mov-immediatemov [buffer],al ...
假设我有以下声明:
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
?
我对以下两者之间的区别感到困惑
-
将立即数移入寄存器,
-
将寄存器移至立即数(输入的是数据还是地址?)
-
将立即数移动到不带括号的寄存器中
- For example,
mov cl, buffer
vs mov cl, [buffer]
更新:阅读回复后,我认为以下总结是准确的:
-
mov edi, array
将数组第零索引的内存地址放入 edi
。即标签地址。
-
mov byte [edi], 3
将值 3 放入数组的第零索引中
-
现在之后
add edi, 3
, edi
包含数组第三个索引的内存地址
-
mov al, [array]
将第零索引处的数据加载到 al
.
-
mov al, [array+3]
将第三个索引处的数据加载到 al
.
-
mov [al], [array]
无效,因为 x86 无法编码 2 个显式内存操作数 ,并且因为 al
只有 8 位,即使在 16 位寻址模式下也无法使用。 引用内存位置的内容。(x86 寻址模式)
-
mov array, 3
是无效的,因为您不能说“嘿,我不喜欢 array
存储的偏移量,所以我将其称为 3”。立即数只能是源操作数。
-
mov byte [array], 3
将值 3 放入数组的第零索引(第一个字节)。 The byte
specifier is needed 符来避免带有内存、立即操作数的指令的字节/字/双字之间的歧义。否则,这将是一个汇编时错误(操作数大小不明确)。
如果其中任何一个是错误的,请指出。(编者注:我修复了语法错误/歧义,因此有效的语法实际上 是 有效的 NASM 语法。并链接了其他问答以获取详细信息)
YASM/NASM x86 汇编中立即数与方括号的基本用法
下载声明:
本站所有软件和资料均为软件作者提供或网友推荐发布而来,仅供学习和研究使用,不得用于任何商业用途。如本站不慎侵犯你的版权请联系我,我将及时处理,并撤下相关内容!