寄存器PC与IP的区别

PC(程序计数器)是CPU中的一个重要寄存器,指示程序执行的位置。在Intel x86和Itanium处理器中被称为IP(指令指针)。处理器通常顺序执行指令,但分支、子例程调用和返回操作可以改变执行顺序。PC在分支时指向新地址,子例程调用会保存PC值,返回时恢复PC以继续原执行路径。

        PC 是Program Counter的缩写,翻成中文是程序计数器,它是CPU中的寄存器,作用是用于指示计算机在其程序序列中的位置。在Intel x86Itanium微处理器中,它叫做指令指针(Instruction pointer, IP),有时又称为指令地址寄存器(Instruction address pointer, IAR)、指令计数器或只是指令序列器的一部分。由此可知PC就像我们每个家庭里都有儿子(PC),这个儿子在老张(Intel x86Itanium微处理器)家就叫张三(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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值