程序计数器如何知道下一条指令在内存中的位置?
How does the program counter know where the next instruction is in memory?
我总是被告知它会递增 4 来获取下一条指令(当没有跳转或类似的东西时),但这是否意味着指令仅限于具有 3 个参数?
我认为程序在内存中看起来像这样是否正确:
0: LOAD
1: eax
2: 0x30
3: <zeroed out because the next instruction has to be at 4>
4: LOAD
5: ebx
6: 0x34
7: <zeroed out because the next instruction has to be at 8>
8: ADD
9: ecx
10: eax
11: ebx
12: <Next instruction>
等等
这可能不是完全有效的程序集,但你明白我的意思(我也知道它是二进制的)。如果程序在内存中不是这样加载的,那么程序计数器怎么知道下一条指令在哪里?
您问题的答案取决于系统。一般有两种答案:
首先,在大多数 RISC 系统中,简化的事情之一是包括操作数在内的所有指令都占用一个静态大小。这使得程序计数器或指令指针按静态数量递增变得非常简单。这听起来像你在问题中所指的。
在不使用静态大小的CISC系统和RISC系统中,指令解码器所做的部分工作是确定指令有多大,有多少参数以及它们有多大。有了这些信息,指令指针可以适当增加。
我总是被告知它会递增 4 来获取下一条指令(当没有跳转或类似的东西时),但这是否意味着指令仅限于具有 3 个参数?
我认为程序在内存中看起来像这样是否正确:
0: LOAD
1: eax
2: 0x30
3: <zeroed out because the next instruction has to be at 4>
4: LOAD
5: ebx
6: 0x34
7: <zeroed out because the next instruction has to be at 8>
8: ADD
9: ecx
10: eax
11: ebx
12: <Next instruction>
等等
这可能不是完全有效的程序集,但你明白我的意思(我也知道它是二进制的)。如果程序在内存中不是这样加载的,那么程序计数器怎么知道下一条指令在哪里?
您问题的答案取决于系统。一般有两种答案:
首先,在大多数 RISC 系统中,简化的事情之一是包括操作数在内的所有指令都占用一个静态大小。这使得程序计数器或指令指针按静态数量递增变得非常简单。这听起来像你在问题中所指的。
在不使用静态大小的CISC系统和RISC系统中,指令解码器所做的部分工作是确定指令有多大,有多少参数以及它们有多大。有了这些信息,指令指针可以适当增加。