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/