最近我一直在使用 Altair 8800 模拟器来了解计算的基础知识,我想知道处理器如何“知道”一个字节是指令还是数据?
2 回答
处理器不知道一个字节是否是一条指令。它只是执行程序计数器指向的任何代码。
如果程序计数器位于数据区(由于编程错误、堆栈损坏或其他原因),CPU 会尝试解释指令,直到遇到一些无效的操作码,在这种情况下,它会调用特殊的“非法指令”(或其他)处理程序和程序崩溃/操作系统重新启动/定义的任何行为以从错误中恢复。
编辑:正如罗斯提到的那样,Altair 并没有真正的非法指令,“程序”会在混乱中无休止地运行,在随机位置读取和写入,直到有人拔掉插头。
另一方面,您可以使用包含代码的区域加载地址寄存器,CPU 将只看到数据。
也就是说,反汇编/逆向工程的艰巨挑战之一是找到原始程序员组装为代码的区域以及仅定义数据的区域,例如错误消息、图形……它们有时非常接近/交织在一起,特别是在使用组装时。
跳转表、动态计算的入口点、动态解密、自修改代码会使任务变得更加困难,即使对于像 IDAPro 这样的优秀反汇编程序也是如此。您通常必须帮助反汇编程序根据数据看起来很像代码(可识别的操作码,例如:for 68k:0x4E75
表示 RTS,不太可能是数据)或代码看起来很像数据的事实来做出决定因为它没有加起来(不连贯、不相关的 asm 代码行)
处理器所看到的指令是程序计数器给出的地址处的字节。根据指令,后续字节可以是当前指令的下一条指令或数据(“立即指令”)。在这种情况下,程序计数器会增加以跳过数据。
一些指令使用寄存器的内容(8080 的情况下为 HL 或 DE)来确定内存访问。获取的内容被处理器视为数据。