Я не уверен, будет ли это полезно для вас сейчас, но я все равно публикую это.
Давайте рассмотрим в очень очень общем смысле массив инструкций на C ++, то есть A [0], A [1], A [2] .....
«Переносное» расстояние между любыми двумя инструкциями составляет 1 ЕДИНИЦА.
Давайте возьмем эту аналогию с MIPS. В MIPS, например, каждая инструкция отделена "1 UNIT", однако, 1 UNIT = 4 байта в MIPS. Каждая инструкция имеет длину 4 байта, и поэтому при переходе от инструкции к инструкции ПК увеличивается на 4, то есть ПК + 4. Таким образом, разрыв между инструкцией i и инструкцией i + 2 составляет «образно» 2, но на самом деле 2 * 4 = 8, т.е. PC + 4 + 4
Возвращаясь к смещениям, указанным в инструкциях Ветви, смещение представляет собой «переносное» расстояние от следующей инструкции (инструкции, следующей за Ветвью). Таким образом, чтобы получить «реальное» расстояние, смещение должно быть умножено на 4. Это причина, по которой мы проинструктированы «расширить знак» смещения на 2 бита до «ВЛЕВО», потому что сдвиг влево любого двоичного значения на n битов приводит к умножению этого значения на 2 ^ n. В нашем случае 2 ^ 2 = 4
Таким образом, фактический целевой адрес инструкции перехода - PC + 4 + 4 * Offset.
Надеюсь, это поможет.