HLR 发表于 2023-5-13 16:01:57

jmp跳转问题????


jmp 向后跳时:
        cs: 20a8        ip: 3
ip = ip + 指令长度(2)
        cs: 20a8        ip: 5
执行 EB06
        ip= 5 + 6
最终跳到
        cs: 20a8        ip: 0bH



jmp 向前跳时
        cs: 20a8        ip: 3
ip = ip + 指令长度(2)
        cs: 20a8        ip: 5
执行 EBFB
        ip = 5 +(-3)
最终跳到
        cs: 20a8        ip: 2
--------------------------------------------
这个向前跳为什么debug最后的结果是 【cs: 20a8        ip: 0】 哪位大佬可以跟我解释一下{:10_278:}

isdkz 发表于 2023-5-13 16:01:58

根据你提供的信息,跳转指令 EBFB 是一个有符号的跳转指令,其中的 FB 是一个带符号的 8 位数值,它代表了当前指令的偏移量,它的值为 -5。因此,当执行这个跳转指令时,IP 的值会减去 5,也就是从 5 变成了 0。因此,最终的结果是 cs: 20a8, ip: 0。

陶远航 发表于 2023-5-13 16:02:54

在执行向前跳的 JMP 指令时,CPU 会将当前 IP 寄存器的值减去指令中给定的偏移量,然后重新赋值给 IP 寄存器。因此,当 IP 寄存器的值为 5 且执行了 JMP -3 的指令时,IP 寄存器的最终值将为 2。而由于你的代码片段中没有展示完整的上下文信息,导致无法对问题进行更进一步的分析。多数情况下在调试阶段出现这种不确定性的情况是因为寄存器或内存中存储的数据被修改,所以建议您在必要时检查相关的寄存器、内存或堆栈变量的值。

sfqxx 发表于 2023-5-13 16:05:33

可以考虑一下内存寻址的方式。

第一次 JMP 指令是要往前跳的,最终跳转到了 cs:20a8 的地址 0x02 处,但是实际上这里所看到的寻址并非像 CPU 内部使用的偏移地址那样正整数增长。在指针溢出(overflow)时要特别注意,否则程序就会崩溃或产生不可预测的结果。常见方法是通过模拟器来仔细跟踪每个内存位置和 CPU 寄存器的值。

CPU 中通常采用各种寄存器以及如果寄存器不够,再结合内存中的数据,进行计算获取最后的跳转地址等信息。而跳转后的对应位置由物理RAM/ROM中的实际地址表示,这个地址是一个非负整数值,按照物理地址的习惯会从0开始。因此,在实际内存中,该程序会直接访问物理地址0000H~FFFFH的位置,其中包含属于cs:20a8段的寄存器值对应的位置。

因此,在向前跳转 EBFB 指令执行之后,首先 IP=5+(-3)=2,并将在 cs:20a8 段的该位置上读取下一条待执行指令,即 IP 指针现在已经指向了 cs:20a8 段的第0x02个字节位置,而这里的 0x02 对应于物理内存中的首地址0000:0002H。

因此调试器上打印的结果 cs:20a8 ip:0 是跳转后所访问的内存地址的真实表示方式。

HLR 发表于 2023-5-13 16:07:53

isdkz 发表于 2023-5-13 16:01
根据你提供的信息,跳转指令 EBFB 是一个有符号的跳转指令,其中的 FB 是一个带符号的 8 位数值,它代表了 ...

确实,是我算错了{:10_278:}
页: [1]
查看完整版本: jmp跳转问题????