Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么调用指令操作码表示为FF15?_Assembly_X86_Opcode - Fatal编程技术网

Assembly 为什么调用指令操作码表示为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/

我仍在学习汇编,并试图将指令与其操作码连接起来。阅读pdf

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

当尝试查看生成的exe文件“.text”部分时,最后一次调用用操作码“FF15”表示,请检查此处的“英特尔手册”和操作码列表


您会发现“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]