NASM - 这是地址、值吗?
NASM - is this the address, value?
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
大概需要一个目的地?
例如:
mov
行 04
指令将值 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
,理论上会发生什么情况?
提前致谢。
What happens in theory if you mov memloc, 15
instead?
NASM 不会例外,因为您不能将立即值 (15) 移动到另一个立即值 (memloc)。
The mov instruction at line 04 moves the value 15 to the ADDRESS of memloc:
第4行的指令没有改变memloc的地址。
就像第 5 行一样,它使用存储在 memloc.
的值
So, is [memloc] the value (15) or the address (0x1234)?
[memloc]
就是值15
memloc
是地址 0x1234(在您的代码第 10 行设置后无法更改)
mov
指令有 1 个以上的版本。如果编译器 (NASM) 看到 memloc 周围的方括号,它会生成一种形式的 mov
,如果您的编译器没有看到 [=] 周围的方括号33=]memloc 它生成另一种形式的 mov
。
考虑以下说明:
mov edx, memloc
mov edx, [memloc]
mov [memloc], edx
它们都是 mov
to/from 相同的 destination/source 寄存器 EDX 但编译器 (NASM) 将为这些指令生成完全不同的操作码。
第一个mov
用5个字节0xBA,?,?,?,?
编码
第二个 mov
用 6 个字节编码 0x8B, 0x15, ?, ?, ?, ?
第 3 个 mov
用 6 个字节编码 0x89, 0x15, ?, ?, ?, ?
4个?表示memloc的地址,由NASM.
分配
在您的问题中使用示例地址 (0x1234) 这将变为:
第一个mov
编码为5字节0xBA、0x34、0x12、0x00、0x00
第二个 mov
编码为 6 个字节 0x8B, 0x15, 0x34, 0x12, 0x00, 0x00
第 3 个 mov
用 6 个字节编码 0x89, 0x15, 0x34, 0x12, 0x00, 0x00
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
大概需要一个目的地?
例如:
mov
行 04
指令将值 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
,理论上会发生什么情况?
提前致谢。
What happens in theory if you
mov memloc, 15
instead?
NASM 不会例外,因为您不能将立即值 (15) 移动到另一个立即值 (memloc)。
The mov instruction at line 04 moves the value 15 to the ADDRESS of memloc:
第4行的指令没有改变memloc的地址。
就像第 5 行一样,它使用存储在 memloc.
So, is [memloc] the value (15) or the address (0x1234)?
[memloc]
就是值15
memloc
是地址 0x1234(在您的代码第 10 行设置后无法更改)
mov
指令有 1 个以上的版本。如果编译器 (NASM) 看到 memloc 周围的方括号,它会生成一种形式的 mov
,如果您的编译器没有看到 [=] 周围的方括号33=]memloc 它生成另一种形式的 mov
。
考虑以下说明:
mov edx, memloc
mov edx, [memloc]
mov [memloc], edx
它们都是 mov
to/from 相同的 destination/source 寄存器 EDX 但编译器 (NASM) 将为这些指令生成完全不同的操作码。
第一个mov
用5个字节0xBA,?,?,?,?
编码
第二个 mov
用 6 个字节编码 0x8B, 0x15, ?, ?, ?, ?
第 3 个 mov
用 6 个字节编码 0x89, 0x15, ?, ?, ?, ?
4个?表示memloc的地址,由NASM.
分配
在您的问题中使用示例地址 (0x1234) 这将变为:
第一个mov
编码为5字节0xBA、0x34、0x12、0x00、0x00
第二个 mov
编码为 6 个字节 0x8B, 0x15, 0x34, 0x12, 0x00, 0x00
第 3 个 mov
用 6 个字节编码 0x89, 0x15, 0x34, 0x12, 0x00, 0x00