寄存器PC与IP的区别
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
#include
#include 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 rbpmov rbp, rspmov DWORD PTR [rbp-20], edimov DWORD PTR [rbp-24], esimov eax, DWORD PTR [rbp-20]imul eax, DWORD PTR [rbp-24]mov DWORD PTR [rbp-4], eaxmov eax, DWORD PTR [rbp-4]pop rbpret
main:push rbpmov rbp, rspsub rsp, 16mov DWORD PTR [rbp-8], 1mov DWORD PTR [rbp-4], 2mov edi, 0call timemov edi, eaxcall srandcall randmov edx, eaxmov eax, edxsar eax, 31shr eax, 31add edx, eaxand edx, 1sub edx, eaxmov DWORD PTR [rbp-12], edxcmp DWORD PTR [rbp-12], 0jne .L4mov DWORD PTR [rbp-4], 1
.L4:mov edx, DWORD PTR [rbp-4]mov eax, DWORD PTR [rbp-8]mov esi, edxmov edi, eaxcall func(int, int)mov DWORD PTR [rbp-16], eaxmov eax, 0leaveret
参考:维基百科-程序计数器
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
