处理器在 OpCodes 和 Data 之间有何不同?
How does the processor differ between OpCodes and Data?
我正在尝试编写一个反汇编程序,我想知道处理器如何区分 OpCodes 和 Data-Bytes。
例如,这是 "Hello World" 的字节表示:
0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x00
但是处理器 "know" 是如何说的 "Hello World" 而实际上不是这样的:_ _ INS INS OUTS AND _ OUTS JB INS _ ADD
非常欢迎解释。
不能。
在哈沃德架构中,数据和代码的明确分离将防止这个问题,在冯诺依曼架构中,代码就是数据。
这取决于程序员 而不是 使 CPU 执行不需要的 code/data。
处理器知道,因为入口点是已知的。处理器按执行顺序解码,这也是您应该如何反汇编可变长度指令集的方式。固定长度你可以从入口点线性地遍历内存,但是可变长度你需要按执行顺序去。这当然不是万无一失的,很容易绊倒反汇编程序,所以请注意这是可能的,我建议您保持跟踪。我通常对指令的入口点(某些 ISA 中的操作码)和非入口字节做一个 table,这样如果我分支到指令的中间,我可以在那里停止反汇编程序的路径(当然你必须覆盖所有可能的路径)。
关于操作码与数据,只要工具链和程序员做了正确的工作,一条指令就会根据需要移交给另一条跳过数据区域的指令。
处理器非常愚蠢,它们没有很多真正的功能,一些 alu 的东西,从地址读取和写入,将数据移入和移出寄存器。一半的工作是为他们提供遵守规则的程序。
我正在尝试编写一个反汇编程序,我想知道处理器如何区分 OpCodes 和 Data-Bytes。
例如,这是 "Hello World" 的字节表示:
0x48 0x65 0x6c 0x6c 0x6f 0x20 0x57 0x6f 0x72 0x6c 0x64 0x00
但是处理器 "know" 是如何说的 "Hello World" 而实际上不是这样的:_ _ INS INS OUTS AND _ OUTS JB INS _ ADD
非常欢迎解释。
不能。 在哈沃德架构中,数据和代码的明确分离将防止这个问题,在冯诺依曼架构中,代码就是数据。
这取决于程序员 而不是 使 CPU 执行不需要的 code/data。
处理器知道,因为入口点是已知的。处理器按执行顺序解码,这也是您应该如何反汇编可变长度指令集的方式。固定长度你可以从入口点线性地遍历内存,但是可变长度你需要按执行顺序去。这当然不是万无一失的,很容易绊倒反汇编程序,所以请注意这是可能的,我建议您保持跟踪。我通常对指令的入口点(某些 ISA 中的操作码)和非入口字节做一个 table,这样如果我分支到指令的中间,我可以在那里停止反汇编程序的路径(当然你必须覆盖所有可能的路径)。
关于操作码与数据,只要工具链和程序员做了正确的工作,一条指令就会根据需要移交给另一条跳过数据区域的指令。
处理器非常愚蠢,它们没有很多真正的功能,一些 alu 的东西,从地址读取和写入,将数据移入和移出寄存器。一半的工作是为他们提供遵守规则的程序。