【问题标题】:Program Counter?程序计数器?
【发布时间】:2012-04-23 17:36:51
【问题描述】:

如果我理解正确,程序计数器指向要执行的指令的地址,并且在大多数情况下,您将程序计数器加四以前进到下一条指令地址。但是假设您有一个程序计数器指向内存中的一个单词(例如单词 15),并且您想前进到下一条指令,您是否应该将 4 直接添加到 15 以获得下一条指令?任何解释将不胜感激

【问题讨论】:

    标签: assembly cpu mips cpu-registers cpu-architecture


    【解决方案1】:

    你永远不会直接推进程序计数器 - CPU 通过执行你的程序来为你做这件事。作为程序员,您通过执行各种跳转指令(有条件的、无条件的、跳转到子程序等)来操作程序计数器。当您需要向程序计数器添加偏移量时,一种特定情况是在与位置无关的代码中进行分支时。但是,即使在这种情况下,您也不会将指令的大小添加到程序计数器中:而是通过执行“分支到相对地址”来提供要跳转到的位置的偏移量。

    【讨论】:

    • 当我们编写一个引导加载程序,它会跳转到位于绝对地址 0x4000 的应用程序代码时怎么样?在这种情况下,我们将直接将程序计数器更改为绝对地址。
    • @eepty 这就是第二句话的意思:你是用跳转指令做的,而不是用寄存器设置指令。
    【解决方案2】:

    那个东西叫做指令指针。一旦处理器解码了当前指令,它就会发现它占用了多少字节,并知道要向当前指令指针值添加多少字节以前进到下一条指令,这样当当前指令被执行时,处理器就知道下一步该做什么。

    因此,例如,处理器从存储值 15 的指令指针开始,如您的示例中一样 - 它看起来在该地址发生了什么,恰好有一条指令占用 5 个字节,没问题 - 它向当前添加 5值,这会产生 20,因此指令指针现在存储值 20,然后处理器执行当前指令。

    【讨论】:

    • 你的例子是有道理的,但是如果你添加的内容取决于那个地址的内容,那么 PC+4 来自哪里??
    • @user28694:这取决于处理器。一些处理器具有所有指令长度相同的指令集,因此它们可以无条件地 +4。一些处理器将具有可变长度的指令,它们将使用指令本身的第一个字节来决定它们处理哪条指令。
    • @Alex:也许吧,我不确定。
    猜你喜欢
    • 2020-03-08
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多