Assembly 为什么调用指令操作码表示为FF15?
我仍在学习汇编,并试图将指令与其操作码连接起来。阅读pdf 它只是剖析一个简单程序的PE文件,在windows中显示消息框,代码是“删除所有不相关的条目” 当尝试查看生成的exe文件“.text”部分时,最后一次调用用操作码“FF15”表示,请检查此处的“英特尔手册”和操作码列表Assembly 为什么调用指令操作码表示为FF15?,assembly,x86,opcode,Assembly,X86,Opcode,我仍在学习汇编,并试图将指令与其操作码连接起来。阅读pdf 它只是剖析一个简单程序的PE文件,在windows中显示消息框,代码是“删除所有不相关的条目” 当尝试查看生成的exe文件“.text”部分时,最后一次调用用操作码“FF15”表示,请检查此处的“英特尔手册”和操作码列表 您会发现“call”指令操作码仅为“FF”,那么“15”指的是什么或来自什么?看看这个问题: 它解释了整个指令组以FF开头:INC,DEC,CALLN,CALLF,JMPN,JMPF,PUSH 指令通过查看ModR/
您会发现“call”指令操作码仅为“FF”,那么“15”指的是什么或来自什么?看看这个问题: 它解释了整个指令组以FF开头:
INC
,DEC
,CALLN
,CALLF
,JMPN
,JMPF
,PUSH
指令通过查看ModR/M字节的第5位到第3位来确定(例如,如果您想避免使用英特尔官方手册),即在您的情况下,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相反)我认为您没有正确阅读图表。Call与其他几个指令共享FF。第二个字节选择指令和寻址模式。它实际上是FF/2
,/2
,再加上寻址模式,为您提供了15
。感谢您的澄清,并根据我在参考问题中学到的知识补充您的答案。这里R/M=101,二进制表示“disp32”,即:由32位位移组成的内存操作数。这来自《英特尔指令集参考手册》中的表2-2。
push 0
push Title + DATADELTA
push Caption + DATADELTA
push 0
call [__imp__MessageBoxA]