NASM - 这是地址,值吗?



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 行设置后无法更改(

相关内容

  • 没有找到相关文章

最新更新