在risc中,beq指令有12位的imm[12:1]
。
而PC相对寻址是Target address = PC + immediate x 2
。
它说,与2
乘的原因是因为半个字的指令。
因此,我认为即时值可以表示[-2^12 ~ 2^12-2]
的范围,
因为imm[0] == 0
中隐藏的位。
与2相乘,则范围为[-2^13 ~ 2^13-2]
。
因此,当我们认为在2字节增量指令时,分支可以达到
-2^12 ~ 2^12-2
并且在4字节增量指令中,分支可以在以下范围内到达
-2^11 ~ 2^11-2
。
但在risc-v第29页https://riscv.org/wp-content/uploads/2017/05/riscv-spec-v2.2.pdf中,
它说条件分支范围是-4KiB ~ 4KiB
,
这意味着32位指令中的-2^10 ~ 2^10
。
Q1。在PC的相对寻址中,我们使用13位的结果(隐藏0位)来计算正确吗?
Q2。如果是正确的,如何计算分支指令的范围?
发布于 2022-10-10 18:11:25
Q1.在PC的相对寻址中,我们使用13位的结果(隐藏0位)来计算正确吗?
是的,正如您注意到的,处理器使用的公式是
Target address = PC of the branch instruction + immediate x 2
x2重新引入已知为零的第13位,因此在编码过程中被删除。
Q2.如果是正确的,如何计算分支指令的范围?
你有正确的想法。
编码的即时值是12位宽,所以添加到PC的值是13位宽(立即x2). 立即是一个有符号的字段。
最大立即为正,0位后为1的11位,为2047 (又名0x7FF或2^11-1),最小立即为负值,为1位(符号),后面为11位的0's,即-2048 (又名0x800或-2^11)。
因此,最大前向范围是0位,后面是11位1's,1位后面是0,这是4094 (又名0xFFE或2^12-2)。
而最大后向范围是1位,后面是0's的12位,即-4096 (又名0x1000 ( 13位)或-2^12)。
让我们注意,用字节可寻址的机器上的字节来表示范围是很常见的。指令地址是字节地址(甚至,如果所有指令都是32位大小的话). ,所以(字节)范围是-4096。+4094 -这些是可以到达的指令地址。
但是,如果您想考虑可以到达多少个16位指令,我们会将这个字节范围除以一半,所以-2048。+2047,如果考虑到可以达到多少32位指令,我们就会将字节范围除以四分之一,所以-1024。1023.5。
https://stackoverflow.com/questions/74013648
复制相似问题