如何计算分支指令偏移量?

时间:2017-12-13 05:18:05

标签: offset

计算分支指令的偏移量:

Picture with the answers

嘿伙计们,

我的教授给我们发了一份答案的学习指南。他从未真正了解过他如何得到答案。我在网上搜索过,但我没有找到解释的运气,所以此时我有点绝望。

是否有人知道作者是如何得出这些答案的?

1 个答案:

答案 0 :(得分:0)

0xfffb是-5位的16位有符号二进制补码表示。因此,在这台机器中,偏移量由(可能是固定的)指令长度缩放以获得字节地址。 (它可能有字节大小的指令,但这是不可能的,因为偏移本身是16位。)架构是这样的,当执行分支时,PC已经递增,因此0偏移是NOP,a - 1个偏移分支到分支本身,-2分支到分支之前的指令,等等。向后计数直到到达loop:。 (要么有更多信息附加到问题或已知的上下文,给出我在回答中使用的架构的详细信息,或者这是一个写得很糟糕的问题。)

对于缓存问题,您通常只需要知道用于描述缓存架构的名称(或“缓存几何”,“缓存形状”等)。 “双向组关联”意味着缓存中有两个位置可以放置任何给定的地址。有128个集合,每个集合可以容纳两个块,因为它是双向关联的,每个块是32个字节。 (我通常将32字节结构称为“缓存行”,虽然此处出现的“块”一词专指存储在那里的数据,“line”也包括有效位和标记等。)然后从缓存几何中向外的最低位开始分解地址。

看起来这是一个指令缓存,所以我们要坚持底部两位为0,并在32位项目中组织缓存。该块是32字节或5位。 2是“字节偏移”,它可能应该只是0,然后是3位来完成5位部分,它被称为“块偏移”(在块内真正偏移)。 (这5个低位的细分并没有真正改变任何东西。)集合中的128个条目给出了7位“索引”。地址的其余部分(20位)必须用于标记块以确保它保存正在查找的地址。 (即确定缓存命中或未命中。)另外,我们还需要再说一下是否存在块中的实际数据。

然后我们将它全部添加 - 数据为32字节或256位,加上20位标记和1个有效位,乘以128组和2种方式。