【问题标题】:Why call instruction opcode is represented as FF15?为什么调用指令操作码表示为FF15?
【发布时间】:2015-04-24 01:51:25
【问题描述】:

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

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

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”指的是什么或来自哪里?

【问题讨论】:

  • 我认为您没有正确阅读图表。 Call 与其他几个指令共享 FF。第二个字节选择指令和寻址方式。
  • 实际上是FF /2/2,加上寻址模式,给你15

标签: assembly x86 opcode


【解决方案1】:

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

说明一整组指令以FF开头:INCDECCALLNCALLFJMPNJMPFPUSH

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

0x15 是二进制的0001 0101,第 5-3 位是:010(最左边的位是第 7 位,最右边的位是第 0 位,可以将其视为一个数组)。

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

这会给你“CALLN”。

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

【讨论】:

  • 感谢您的澄清,也感谢您从我在引用的问题中学到的内容中添加您的答案。这里 R/M = 101 二进制表示“disp32”,即:由 32 位位移组成的内存操作数。来自英特尔指令集参考手册中的表 2-2。
猜你喜欢
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多