考虑一下这个x86汇编代码:
section .data
foo:
mov ebx, [boo]
mov [goo], ebx
goo:
mov eax, 2
mov eax, 3
ret
boo:
mov eax, 4
mov eax, 5
ret
Run Code Online (Sandbox Code Playgroud)
到底发生了什么?当我取消引用时[boo],mov它[goo]到底是什么时候我在那里移动?只有一个命令?的ret呢?
后续问题:
eax的值是3还是5?Bas*_*ard 10
boo是指令mov eax, 3内部的偏移量.data.
mov ebx, [boo]表示"在boo内部指示的偏移量处获取四个字节ebx".同样,mov [goo], ebx将ebx的内容移动到指示的偏移量goo.
但是,代码通常是只读的,因此看到代码崩溃就不足为奇了.
以下是boo编码指令的编码方式:
boo:
b8 03 00 00 00 mov eax,0x3
c3 ret
Run Code Online (Sandbox Code Playgroud)
所以你得到的ebx实际上是mov eax, 3指令的4/5 .