syntax - NASM - 这是地址、值吗?

标签 syntax nasm dereference

TL;DR

[memloc] 指的是值还是地址?如果它指的是其中任何一个,那么为什么它既可以作为值又可以作为地址呢? (参见下面的代码,第 4 行和第 5 行)

完整问题...

抱歉问了这么长的问题。 我对 NASM 中的标签取消引用感到困惑。举个例子:

01| section .text
02| ; exiting the program with exit code "15"
03|
04| mov     [memloc], 15 ; move 15 into memloc
05| push    [memloc]     ; push memloc on stack
06| mov     eax, 1       ; prepare exit syscall
07| call    kernel       ; invoke syscall
08|
09| section .data
10| memloc: dd 0    ; let's say this is at address 0x1234

当我运行它时,它退出并显示代码 15。它有效!
...但是为什么? memlock 不应该在第 4 行没有大括号的情况下,其中 push 大概需要一个目的地吗?

例如:
04行的mov指令将值15移动到memloc的地址:

mov     [memloc], 15 ; move 15 into mem @memloc

但是第 05 行将存储在 memloc 的 VALUE 压入堆栈:

push    [memloc]     ; push value @memloc on stack

那么,[memloc] 是值 (15) 还是地址 (0x1234)?如果改为mov memloc, 15,理论上会发生什么?

提前谢谢您。

最佳答案

mov 指令有不止 1 个版本。如果编译器 (NASM) 看到 memloc 周围的方括号,它会生成一种形式的 mov,如果您的编译器没有看到 memloc 周围的方括号em> 它生成另一种形式的 mov

考虑以下说明:

mov edx, memloc
mov edx, [memloc]
mov [memloc], edx

它们都是mov到/来自相同的目标/源寄存器EDX,但编译器(NASM)将为这些指令生成完全不同的操作码。

第一个 mov 编码为 5 个字节 0xBA, ?, ?, ?, ?
第二个 mov 用 6 个字节编码 0x8B, 0x15, ?, ?, ?, ?
第三个 mov 用 6 个字节编码 0x89, 0x15, ?, ?, ?, ?

4 个? 代表 NASM 分配的 memloc 地址。
在您的问题中使用示例地址(0x1234),这将变为:

第一个mov用5个字节编码0xBA、0x34、0x12、0x00、0x00
第二个 mov 用 6 个字节编码 0x8B, 0x15, 0x34, 0x12, 0x00, 0x00
第三个mov用6个字节编码0x89、0x15、0x34、0x12、0x00、0x00

关于syntax - NASM - 这是地址、值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32412100/

相关文章:

objective-c - Objective-C "#if"语法

syntax - 使用 Write 命令创建新语法 - 出现不需要的空格问题

assembly - 为纹身编写汇编代码

c++ - 如何正确实现 -> 和 (*)。这样它们的行为就像 -> 和 (*)。在迭代器中

javascript - 有人可以用 JavaScript 解释这种函数包装语法吗?

javascript - Javascript 的 "this"有什么更好的名称?

parsing - NASM 解析 Ascii 字符显示

c - 从 c 链接并调用汇编函数

rust - 意外的自动取消引用行为

c - 字符串复制函数: simple issue