NASM - 这是地址,价值吗?

时间:2015-09-05 10:39:01

标签: 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可能需要一个目的地?

例如:
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改为理论上会发生什么?

提前谢谢。

2 个答案:

答案 0 :(得分:2)

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

请考虑以下说明:

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

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

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

4 代表NASM指定的 memloc 的地址。
在您的问题中使用示例地址(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

答案 1 :(得分:1)

  

如果你mov memloc, 15改为理论会发生什么?

NASM除此之外不会因为您无法将立即值(15)移动到另一个值( memloc )。

  

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

第4行的说明不会改变 memloc 的地址 就像第5行一样,它使用 memloc 中存储的值。

  

那么,[memloc]是值(15)还是地址(0x1234)?

[memloc]是值15
memloc是地址0x1234(在您的代码第10行设置后,您无法更改)