gpt4 book ai didi

assembly - YASM/NASM x86 汇编中立即数与方括号的基本使用

转载 作者:行者123 更新时间:2023-12-02 10:10:48 25 4
gpt4 key购买 nike

假设我声明了以下内容:

section .bss
buffer resb 1

这些说明位于.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, buffermov cl, [buffer]
<小时/>

更新:阅读回复后,我认为以下摘要是准确的:

  • mov edi, array 将第 0 个数组索引的内存地址放入 edi 中。即标签地址。
  • mov byte [edi], 3 将 VALUE 3 放入数组的第 0 个索引
  • add edi, 3之后,edi现在包含数组第三个索引的内存地址
  • mov al, [array] 将第 0 个索引处的 DATA 加载到 al 中。
  • mov al, [array+3] 将第三个索引处的 DATA 加载到 al 中。
  • mov [al], [array] 无效,因为 x86 can't encode 2 explicit memory operands ,并且因为 al 只有 8 位,即使在 16 位寻址模式下也无法使用。 Referencing the contents of a memory location. (x86 addressing modes)
  • mov array, 3 无效,因为你不能说“嘿,我不喜欢 array 存储的偏移量,所以我会称之为 3”。立即数只能是源操作数。
  • mov byte [array], 3 将值 3 放入数组的第 0 个索引(第一个字节)。 The byte specifier is needed避免带有内存、立即操作数的指令的字节/字/双字之间的歧义。否则,这将是一个汇编时错误(操作数大小不明确)。

如有不实之处,敬请指出。 (编者注:我修复了语法错误/歧义,因此有效的实际上是有效的 NASM 语法。并链接了其他问答以了解详细信息)

最佳答案

方括号本质上就像解引用运算符一样工作(例如,如 C 中的 *)。

所以,类似

mov REG, x

x的值移至REG,而

mov REG, [x]

x指向的内存位置的值移动到REG中。请注意,如果 x 是标签,则其值是该标签的地址。

至于你的问题:

Am I correct in understanding that bl will contain the value 5, and cl will contain the memory address of the variable buffer?

是的,你是对的。但请注意,由于CL只有8位宽,因此它只会包含buffer地址的最低有效字节。

关于assembly - YASM/NASM x86 汇编中立即数与方括号的基本使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10362511/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com