【问题标题】:Why do you have to dereference the label of data to store something in there: Assembly 8086 FASM为什么必须取消引用数据标签才能在其中存储一些东西:Assembly 8086 FASM
【发布时间】:2020-04-08 16:31:51
【问题描述】:

考虑以下示例:

mov al, [variable1]

这是有道理的,因为您将变量 1 的内容(从而解除对它的引用)保存在寄存器中。

现在考虑这个例子:

mov dword L6, 1

这是不正确的;正确的形式是

mov dword [L6], 1

如果我们将 1 移动到内存中,我应该告诉它存储在该地址而不是内容中。假设您要告诉某人去某个地方参加聚会,您会告诉他们聚会的地址,而不是那里的人。

那么,这是为什么呢?

【问题讨论】:

  • 取消引用意味着您正在访问内容。那要么是读取它,要么是写入它。你不想写(改)地址,这是不可能的,你想写(改)内容。
  • x86 没有内存间接数据寻址。这是 0 和 1 级间接与符号地址之间的区别,而不是 1 与 2
  • 如果我认为 mov 是 write 它更有意义。我可以将 mov 视为 write 而不是“moving”吗?
  • 是的。 mov 只是从源操作数复制到目标操作数。这就是为什么目的地必须指向内存或寄存器的原因。

标签: assembly x86 x86-16 fasm


【解决方案1】:

x86 没有内存间接数据寻址。这是 0 和 1 级间接与符号地址之间的区别,而不是 1 与 2。

与 C 不同,在 FASM(和 NASM)语法中,提及裸符号名称是将地址 作为值

例如mov eax, symbol 设置 EAX = 您放置该标签的地址,使用 mov eax, imm32 指令,而不是从内存中加载。

当然mov symbol, eax 不能工作,因为直接常量不能作为目标,只有[disp32] 寻址模式。

如果我将 mov 视为 write 则更有意义。我可以将mov 视为写而不是“移动”吗?

是的。 mov 只是从源操作数复制到目标操作数。 这就是为什么目标必须指向内存或寄存器的原因。但源操作数可以是立即数、寄存器或内存。

(当然,对于单个mov 指令,您不能同时将src 和dst 作为内存;对于不同类型的操作数,有different forms。)


FASM 和 NASM 中的 asm 符号有点像 C char arr[]

您不能这样做 arr = x; - asm 等效项是 mov arr, al,这也不合法(在 FASM 和 NASM 语法中)。

但你可以做 *arr = x; 在 asm 中是 mov [arr], al


仅供参考:MASM 语法不同mov sym, almov [sym], al 相同,而不是在所有上下文中用作数字占位符的符号,并且括号是可选且无意义的没有注册。

如果您看到任何 MASM 示例或 GCC/clang .intel_syntax noprefix 输出;就是这样。

【讨论】:

    猜你喜欢
    • 2019-08-26
    • 1970-01-01
    • 2014-09-11
    • 2013-06-27
    • 1970-01-01
    • 2011-09-07
    • 2012-11-22
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多