2

My text book doesn't seem to answer this question, just that it has to 'decode' the instruction, so it doesn't answer how it knows it has an instruction in the first place.

My research into this gives me possibly two answers:

1) It can't because both data and instructions look the same in memory, so it has to use the Program Counter to load the next instruction which may or may not fetch the next data it needs through addressing.

2) Something something opcodes something....

I'm trying to figure out a clearly understandable way of explaining this so I know I can understand it.

4

1 回答 1

0

处理器获取并解码程序计数器指向的任何内存。

如果解码器不理解指令,它可能会抛出“无效指令”异常。然后它将跳转到异常处理程序(即操作系统),它将尝试理解无效指令。通常,它可能只是可以在软件中处理的不受支持的指令(例如,浮点除法),然后可以从中断的地方继续执行。

但是,如果它是一条真正的无效指令,那么程序将因某种异常/崩溃而出错(我相信 x86 上的“非法指令”)。

帮助将代码与数据分离的一种技术是将它们放在虚拟内存中的不同“页面”上。然后操作系统可以将代码所在的页面标记为“只读”。以这种方式,试图覆盖代码的程序将抛出异​​常。一些系统允许更多保护,例如“执行错误” - 如果您尝试在此页面上执行代码,则会引发异常(更多信息:http://www.tldp.org/LDP/tlk/mm/memory. html ).

事情可能会变得有点奇怪,因为某些代码实际上确实需要由程序“修改”(又名“自我修改代码”)。这很困难,因为您通常有单独的指令缓存和数据缓存。通常,指令缓存对其周围的世界是无知的——它不知道有人将新数据写入它包含的地址。对于某些平台,在修改指令数据后刷新i-cache 是程序员的工作,以便 i-cache 可以重新获取更新的指令。

最后,程序员/编译器的工作是确保 PC 永远不会跳转到任何不是代码的地址。

(当然,恶意用户当然会尝试让 PC 跳转到他们的错误代码,但我会将堆栈缓冲区溢出攻击留到另一篇文章中。)

于 2013-11-05T07:39:09.177 回答