[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
改为理论上会发生什么?
提前谢谢。
答案 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行设置后,您无法更改)