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(如
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
来处理这些分支。谢谢,第二个问题困扰了我很长时间