为什么调用指令操作码表示为FF15?

时间:2015-04-24 01:51:25

标签: assembly x86 opcode

我还在学习汇编并试图用它的操作码连接指令。阅读pdf at https://code.google.com/p/corkami/wiki/PE101?show=content

它只是剖析一个简单程序的PE文件,在windows中显示消息框,代码是“删除所有不相关的条目”

push 0
push Title + DATADELTA
push Caption + DATADELTA
push 0
call [__imp__MessageBoxA]

当试图查看生成的exe文件“.text”部分时,最后一次调用表示操作码为“FF15”,同时检查英特尔手册中的操作码列表http://ref.x86asm.net/coder32.html

你会发现“call”指令操作码只是“FF”,那么“15”是指或来自哪个?

1 个答案:

答案 0 :(得分:6)

看一下这个问题:what does opcode FF350E204000 do?

它解释了整组说明以FF开头:INCDECCALLNCALLFJMPNJMPFPUSH

通过查看ModR / M字节的第5位到第3位来确定指令(例如,如果您要避免使用官方英特尔手册,请参阅here),在您的情况下,0x15FF后面的字节。)

0x15是二进制0001 0101,第5-3位是:010(最左边的位是7号,最右边的位是0号,把它想象成一个阵列。)

二进制中的

010为2,这意味着你必须从列表中选择第三个元素(INC是elem no 0)[INC,DEC,CALLN,CALLF,JMPN,JMPF,PUSH]。

这会给你“CALLN”。

因此,您知道FF 15CALLN指令。 N代表近(而不是F / FAR)