PC 是Program Counter的缩写,翻成中文是程序计数器,它是CPU中的寄存器,作用是用于指示计算机在其程序序列中的位置。在Intel x86和Itanium微处理器中,它叫做指令指针(Instruction pointer, IP),有时又称为指令地址寄存器(Instruction address pointer, IAR)、指令计数器或只是指令序列器的一部分。由此可知PC就像我们每个家庭里都有儿子(PC),这个儿子在老张(Intel x86和Itanium微处理器)家就叫张三(IP)。
在大部分的处理器中,指令指针都是在提取程序指令后就被立即增加;也就是说跳跃指令的目的地址,是由跳跃指令的操作数加上跳跃指令之后下一个指令的地址(单位为比特或字节,视电脑形态而定)来获得目的地。
处理器通常从存储器中顺序获取指令,但控制传输指令通过在PC中添加一个新值来改变顺序。这些包括
- 分支(有时称为“跳转”)
- 子例程调用
- 返回
“分支”规定下一条指令从内存中的其他地方获取。如示例代码中的:
cmp DWORD PTR [rbp-12], 0
jne .L4
“子程序”不仅调用分支,而且还保存PC的先前内容。如在代码执行中,调用其他子函数。如示例代码中的:
call func(int, int)
“返回”检索PC的保存内容并将其放回去,然后按照子程序调用的指令继续顺序执行。如调用完子函数ret返回到原代码执行。
如示例代码中的:
func(int, int):
...
ret
代码示例:
C++代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int func(int a, int b)
{
int i = a * b;
return i;
}
int main()
{
int a = 1;
int b = 2;
srand(time(NULL));
int x = rand() % 2;
if(x==0) {
b = 1;
}
int result = func(a, b);
return 0;
}
汇编代码:
func(int, int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov DWORD PTR [rbp-24], esi
mov eax, DWORD PTR [rbp-20]
imul eax, DWORD PTR [rbp-24]
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
main:
push rbp
mov rbp, rsp
sub rsp, 16
mov DWORD PTR [rbp-8], 1
mov DWORD PTR [rbp-4], 2
mov edi, 0
call time
mov edi, eax
call srand
call rand
mov edx, eax
mov eax, edx
sar eax, 31
shr eax, 31
add edx, eax
and edx, 1
sub edx, eax
mov DWORD PTR [rbp-12], edx
cmp DWORD PTR [rbp-12], 0
jne .L4
mov DWORD PTR [rbp-4], 1
.L4:
mov edx, DWORD PTR [rbp-4]
mov eax, DWORD PTR [rbp-8]
mov esi, edx
mov edi, eax
call func(int, int)
mov DWORD PTR [rbp-16], eax
mov eax, 0
leave
ret
参考:维基百科-程序计数器
PC(程序计数器)是CPU中的一个重要寄存器,指示程序执行的位置。在Intel x86和Itanium处理器中被称为IP(指令指针)。处理器通常顺序执行指令,但分支、子例程调用和返回操作可以改变执行顺序。PC在分支时指向新地址,子例程调用会保存PC值,返回时恢复PC以继续原执行路径。

5226

被折叠的 条评论
为什么被折叠?



