在x86程序集中取消引用标签

Yuv*_*dam 5 x86 assembly

考虑一下这个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呢?


后续问题:

  1. 解除引用标签会给我一个地址吗?或者标签中第一个命令的机器代码?
  2. 如果它是机器代码 - 它怎么可能不止一个命令?并非所有命令都是32位(即使不是所有位都使用)?
  3. 底线 - 最后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 .