不确定这个问题是否适合社区,但请耐心等待......
在旧的Zilog Z80 CPU上,可以跳转到内存中所需的任何字节地址。这意味着它也可以在指令的中间向右跳。
考虑机器代码21 00 C9
(LD HL, $C900
),它将HL寄存器设置为0xC900。如果你跳到前面并跳过21(比如在上面的指令之后立即执行JR -2
),指令序列变为00 C9
:NOP
后跟{{1} };一个完全不同的东西。
此外,可以解释为代码的垃圾内存区域或不可执行数据可以使其后面的代码“去同步”。例如,如果数据区的最后一个字节是RET
,那么接下来的两个字节(实际上是代码的开头)可能会被解释为21
指令的立即值,反过来可以完全改变代码块的分解方式,因为前两个字节改变了意义。
所以,我的问题是:反汇编程序如何确定指令边界的位置,考虑到这些极端情况?