Assembly MIPS跳转指令编码:为什么左移,为什么保持PC的高4位?

Assembly MIPS跳转指令编码:为什么左移,为什么保持PC的高4位?,assembly,mips,cpu-architecture,machine-code,Assembly,Mips,Cpu Architecture,Machine Code,在跳转指令中, 为什么我们要把26位地址换成28位 为什么要将PC中最左边的4位添加到28位 为什么我们要把26位地址换成28位 当我们将地址移位2位时,跳转指令的参数(地址)可以在0…2^28-1范围内 如果我们不移动地址,它只能在0…2^26-1范围内 这意味着我们只能使用地址空间的1/4 另一方面,不改变地址的表面好处并非真正的好处: 不移动地址将允许使用不能被4整除的地址。然而,由于指令总是位于可被4整除的地址上,因此将指令跳转到不可被4整除的地址是没有意义的 顺便说一下:其他CPU(如

在跳转指令中,

  • 为什么我们要把26位地址换成28位
  • 为什么要将PC中最左边的4位添加到28位
  • 为什么我们要把26位地址换成28位

    当我们将地址移位2位时,跳转指令的参数(地址)可以在0…2^28-1范围内

    如果我们不移动地址,它只能在0…2^26-1范围内

    这意味着我们只能使用地址空间的1/4

    另一方面,不改变地址的表面好处并非真正的好处:

    不移动地址将允许使用不能被4整除的地址。然而,由于指令总是位于可被4整除的地址上,因此将指令跳转到不可被4整除的地址是没有意义的

    顺便说一下:其他CPU(如MC68000)确实使用16位“分支”(跳转)指令,其中低位始终必须为零,因此,如果CPU将地址移位1,则可以寻址更多内存

    为什么要将PC中最左边的4位添加到28位

    PC寄存器为32位宽,跳转指令仅包含26位。因此,我们必须从其他地方获取6位:

    PC寄存器的低位2位始终为零,因此我们仍然需要考虑“左”4位

    如果我们总是将左4位设置为零,我们只能跳转到位于前256 MB内存中的一些代码

    如果我们不修改PC的左4位,我们可以跳转到与跳转指令本身位于相同256兆字节范围内的代码

    让我们考虑一个
    for()
    while()
    循环:

    在这样一个循环的末尾,有一条跳转指令指向循环的开始

    让我们假设程序不一定位于前256 MB内存中

    更有可能的是:


    循环的开始与循环的结束(跳转指令)在相同的256 MB范围内,或者循环的开始在前256 MB内存内?

    1。因为MIPS指令必须对齐,所以我们得到更长的跳转位移,而不是浪费低2位2.因为他们决定这样设计,而不是作为一个相对分支。@PeterCordes你能解释更多关于相对分支的信息吗?显示MIPS
    b
    指令,如
    beq
    是如何工作的。在这样一个循环的末尾有一条跳转指令,指向循环的开始。通常,您会使用条件分支作为循环分支,如
    bne
    something。MIPS条件分支是相对的,为PC添加了一个偏移量。或者,如果您将C循环转换为asm,并且底部有一个无条件分支,您仍然可以通过使用始终为真的条件(如
    bgez$zero,loop\u top
    )来执行短期无条件相对分支。当然,作为一个例子,它是有效的,很多手写的MIPS代码确实使用了
    j
    来处理这些分支。谢谢,第二个问题困扰了我很长时间