Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.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 在调试器中观察到ASM跳转指令的不精确性_Assembly_X86_Reverse Engineering_Machine Code_Ollydbg - Fatal编程技术网

Assembly 在调试器中观察到ASM跳转指令的不精确性

Assembly 在调试器中观察到ASM跳转指令的不精确性,assembly,x86,reverse-engineering,machine-code,ollydbg,Assembly,X86,Reverse Engineering,Machine Code,Ollydbg,我正在对OllyDbg中的一个应用程序进行一些内联修改,并注意到一些奇怪的行为 以下是我编写的指令,直接从调试器复制: 2005FE35 4C DEC ESP 2005FE36 77 21 JA SHORT 2005FE59 ; 23 byte difference 为了清楚起见,我只修改了操作码(4C 77 21);其他一切都由OllyDbg自动解释,这就是我的困惑所在。指令应该减少ESP寄存器,然后执行21个十六进制字节的条件前跳。

我正在对OllyDbg中的一个应用程序进行一些内联修改,并注意到一些奇怪的行为

以下是我编写的指令,直接从调试器复制:

2005FE35   4C               DEC ESP
2005FE36   77 21            JA SHORT 2005FE59 ; 23 byte difference
为了清楚起见,我只修改了操作码(4C 77 21);其他一切都由OllyDbg自动解释,这就是我的困惑所在。指令应该减少ESP寄存器,然后执行21个十六进制字节的条件前跳。然而,地址0x2005FE59和0x2005FE36之间的差异不是21,而是23

在使用21个十六进制字节的值时,我观察到了看似不稳定的结果

2005FE36   77 20            JA SHORT 2005FE58 ; 22 byte difference
2005FE36   77 19            JA SHORT 2005FE51 ; 1B byte difference
2005FE36   77 17            JA SHORT 2005FE4F ; 19 byte difference
我指示向前跳转的十六进制字节数与地址偏移量不匹配;它似乎总是以2为准


这里发生了什么?

跳转(或任何指令)是在读取指令后执行的,IP是按指令大小(2字节)递增的,因此跳转是相对于
2005FE38

跳转(或任何指令)而言的,跳转是在读取指令后执行的,IP是按指令大小(2字节)递增的所以跳跃是相对于2005FE38的,这可以解释事情。非常感谢@AK-33标准的基本CPU取数/执行周期是(1)从IP取数指令(n字节),(2)将IP增加n字节,(3)执行指令。这可以解释问题。非常感谢@AK-33标准的基本CPU获取/执行周期是(1)从IP获取指令(n字节),(2)将IP增加n字节,(3)执行指令。