寄存器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

参考:维基百科-程序计数器


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部