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 周围的方括号,它会生成另一种形式的mov
。
请考虑以下说明:
mov edx, memloc
mov edx, [memloc]
mov [memloc], edx
它们都mov
到/来自同一个目标/源寄存器 EDX,但编译器 (NASM( 将为这些指令生成完全不同的操作码。
第 1 个mov
用 5 个字节0xBA编码,?, ?, ?, ?
第 2 个mov
用 6 个字节编码,0x8B、0x15?, ?, ?, ?
第 3 个mov
用 6 个字节编码,0x89、0x15?, ?, ?, ?
4 ?s 表示由 NASM 分配的内存地址。
在您的问题中使用示例地址 (0x1234(,这将变为:
第 1 个mov
用 5 个字节编码,0xBA、0x34、0x12、0x00 0x00
第 2 个mov
用 6 个字节编码,0x8B、0x15、0x34、0x12、0x00 0x00
第 3 个mov
用 6 个字节编码,0x89、0x15、0x34、0x12、0x00 0x00
如果你
mov memloc, 15
,理论上会发生什么?
NASM 不会排除这一点,因为您无法将即时值 (15( 移动到另一个巨大的值 (memloc(。
第 04 行的 mov 指令将值 15 移动到 memloc 的地址:
第 4 行的指令不会更改 memloc 的地址。
就像第 5 行一样,它使用存储在 memloc 的值。
那么,[memloc]是值(15(还是地址(0x1234(?
[memloc]
值为 15
memloc
是地址0x1234(在代码的第 10 行设置后无法更改(