2016-09-20 59 views
0

最近我一直在玩弄一点与牵牛星8800模拟器,了解计算机的基础知识,我想知道怎样的处理器“知道”如果一个字节指令或数据?牛郎星8800的数据和指令

+1

它不知道。 –

+1

这就是为什么我用'知道'而不知道 –

+2

那么你的问题是什么? –

回答

5

处理器不知道一个字节是否是一条指令。它只是执行程序计数器指向的任何代码。

如果程序计数器落在数据区(由于编程错误,堆栈损坏或其他原因),CPU会尝试解释指令,直到它在某个无效的操作码上绊倒,在这种情况下,它会调用特殊的“非法指令“(或其他)处理程序,并且程序崩溃/操作系统重新启动/定义了哪些行为以从错误中恢复。

编辑:罗斯mentionned的牛郎星并没有真正有非法指令,“方案”将在不休运行混乱,读,任意位置写入,直到有人拉插头。

在另一方面,可以装载一个地址寄存器用含有代码的区域,并且CPU将只能看到数据。

也就是说,这是拆解/逆向工程的难题之一,以寻找原始程序员组装为代码的区域以及仅仅定义数据的区域,例如错误消息,图形...... 它们是有时非常接近/缠绕,特别是使用组装时。

跳表,动态计算的入口点,在即时解密,自修改代码可以使任务更加努力,甚至有一个良好的反汇编像IDAPro。您经常需要帮助反汇编人员根据数据看起来很像代码(可识别的操作码,例如:对于68k:0x4E75表示RTS,不可能是数据)或者代码看起来很像数据,因为它不加起来(非相干的,无关的汇编代码行)

+3

非常好,但仍然...“*实际*代码和*实际*数据..”使John von Neumann像硬盘一样在他的坟墓中旋转。 ([相关解决方案](http://stackoverflow.com/a/26826328/2564301)) – usr2564301

+0

:)好的,我编辑过那部分。现在好多了 ? –

+0

对不起 - 我已经提出了一些建议,并且花费了一些时间:P答案核心关键的关键在于,你甚至可以编译一些汇编代码(使其成为二进制代码),或者,如果你愿意,“真正的”代码)并且*仍将其打印为错误字符串*。一个CPU不知道也不在意。 – usr2564301

4

处理器看到什么作为指令是在由程序计数器给出的地址的字节。根据指令,后续字节可以是当前指令的下一条指令或数据(“立即指令”)。在这种情况下,程序计数器会增加以跳过数据。

有些指令使用的寄存器(HL或DE在8080的情况下)的内容,以确定所述存储器的访问。处理器将数据视为数据。

+0

我不确定这是问题的精神,但你在这里有一个要点。 –