call这个指令很神奇,他和别的指令不太一样
对比下,当我们执行
mov eax,1
的时候,他的对应机器码是
66 B8 01 00 00 00
这其中“66 B8”对应的是“mov eax,x”
后面的“01 00 00 00”就是“1”在32位中的Little Endian了
所以说,在对mov指令进行汇编时,里面的常数会被直接汇编成机器码
然而call指令比较有意思
这个是一段很简单的汇编代码
Start:
call @F
@@: pop ebx
call @F
nop
nop
nop
@@: pop ebx
end Start
然后通过反汇编后,他变成了这个样子
仔细观察机器码和反汇编代码的对应关系,在汇编代码中,第一行的
call @F
@F: …
被汇编成了机器码
E8 00 00 00 00
欸?“@F”所在地址明明是00401005,为什么没有被汇编成为
E8 05 10 40 00
呢?
再接着看下一个例子,这是汇编代码
call @F
nop
nop
nop
@@: …
被编译器编译后变成了
E8 03 00 00 00
我好像发现了什么,编译器你好坏哦。。。