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

Why call instruction opcode is represented as FF15?

我仍在学习汇编并尝试将指令与其操作码联系起来。阅读 pdf 于 https://code.google.com/p/corkami/wiki/PE101?show=content

只是剖析了一个在windows中显示消息框的简单程序的PE文件,代码是"removing all unrelated entries"

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”指代或来自什么?

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

说明整组指令以FF开头:INCDECCALLNCALLFJMPNJMPF, PUSH.

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

0x15 在二进制中是 0001 0101 并且第 5-3 位是: 010 (最左边的位是第 7 位,最右边的位是第 5 位0,把它想象成一个数组)。

010 在二进制中是 2,这意味着您必须从列表中选择第三个元素(INC 是第 0 个元素)[INC、DEC、CALLN、CALLF、JMPN、JMPF、PUSH]。

这给你 "CALLN".

所以你知道你的 FF 15 是一个 CALLN 指令。 N代表近(相对于F/FAR)