2015-09-05 60 views
2

TL; DR

[memloc]是指值还是地址?如果它是指任何一个,那么为什么它的值都是的地址? (见下面的代码,行4和5)NASM - 这是地址,价值?

全部问题...

对不起,长的问题。 我很困惑在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的ADDRESS:

mov  [memloc], 15 ; move 15 into mem @memloc 

但线05推储存在memloc到堆栈的值:

push [memloc]  ; push value @memloc on stack 

那么,是[memloc]的值(15)还是地址(0x1234)?理论上如果你mov memloc, 15取而代之会发生什么?

预先感谢您。

+0

如果操作对待它的操作数不同根据您是否把括号围绕它,然后我猜测我的问题是'机器代码如何区分地址和值?' –

+0

它没有,这是你必须在它周围加上括号的原因。 – Siguza

回答

2

有超过1版mov(这之后,它已经被你的代码的第10行设置你不能改变)指令。如果编译器(NASM)看到周围memloc方括号它产生的mov一种形式,如果你的编译器不看到周围memloc方括号它产生的mov另一种形式。

考虑以下说明:

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

他们都mov /从同一目的地/源寄存器EDX但是编译器(NASM)会产生这些指令完全不同的操作码。

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

The 4 代表由NASM分配的memloc的地址。
使用在你的问题的示例地址(0×1234),这将成为:

的第一mov编码有5个字节0xBA,0x34,0×12,0x00时,0×00
的第二mov编码有6个字节0x8B,为0x15 ,0x34,0×12,0×00,0×00
第三mov编有6个字节0x89上,为0x15,0x34,0×12,0×00,0×00

+0

这绝对是导致我困惑的原因。当他们真正改变操作时,我认为括号表示参考文献中的变化。谢谢您的回答! –

1

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

NASM不会除此之外,因为你不能移动立即值(15)到另一个immendiate值(memloc)。

在线04移动时的值15至memloc的地址mov指令:

指令在管线4不改变memloc的地址。
就像第5行,它使用存储在memloc的值。

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

[memloc]是价值15
memloc是地址为0x1234

+0

好的,但是'mov'指令必须知道它在哪里放置信息的_address_。就像我告诉你将邮件放入邮箱中一样,您需要知道邮寄地址。我无法向您发送包装箱中的邮件,希望您能够神奇地发现它,对吗? (假设没有邮件上有地址,lol) –

+1

@ JamesM.Lay有超过1个版本的'mov'指令。如果编译器(NASM)在* memloc *的周围看到方括号,它会生成一种形式的“mov”,如果编译器在* memloc *周围没有看到方括号,则会生成另一种形式的“mov”。 –

+0

@ user3144770所以,当你'mov [mem],eax'时,地址仍然被传递,但是对于需要偏移的操作码?因此,不应将'mem'视为“查找并替换”目标,我应该将它看作更像C指针,其中'mov [mem],eax'就像'* mem = eax'和'push [mem] '就像'push(* mem)'? –