【发布时间】:2015-09-05 10:39:00
【问题描述】:
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 的 ADDRESS:
mov [memloc], 15 ; move 15 into mem @memloc
但05 行将存储在 memloc 中的 VALUE 推入堆栈:
push [memloc] ; push value @memloc on stack
那么,[memloc] 是值 (15) 还是地址 (0x1234)?如果你改为mov memloc, 15,理论上会发生什么?
提前谢谢你。
【问题讨论】:
-
如果操作根据您是否在其周围放置大括号来区别对待其操作数,那么我想我的问题是“机器代码如何区分地址和值?”
-
它没有,这就是你必须在它周围放大括号的原因。
标签: syntax nasm dereference