Инструкции ассемблера bne и br (NIOS II). Как рассчитывается их смещение?

У меня есть этот ассемблерный код, который я должен перевести в машинный код в двоичной форме:

        .text
        .align 2
        .global main
        .equ val,0x4712         

main:                           
        movi r16,val
        movi r17,0
loop:   addi r17,r17,1
        subi r16,r16,1 
        bne  r16,r0,loop
stop:   br   stop
.end 

и я не уверен, как интерпретируются "bne r16, r0, loop" и "br stop".

В моей справке по набору инструкций сказано, что инструкция bne делает следующее:

if(rA != rB)
then PC ← PC + 4 + σ(IMM16)
else PC ← PC +4

что, насколько я понимаю, это счетчик программы, увеличивающийся на 4 + смещение или просто на 4.

Но каково в моем случае значение смещения / IMM16? В справочнике по набору инструкций сказано:

«При кодировании инструкций смещение, заданное IMM16, обрабатывается как количество байтов со знаком относительно инструкции, следующей сразу за bne».

Моя интерпретация заключается в том, что значение IMM16 - это «расстояние» до следующего адреса инструкции, но я понятия не имею, правильно ли это. Шестнадцатеричный адрес для bne - 0x40010 и 0x40014 для br, поэтому это будет означать, что значение IMM16 равно 4? (что может привести к тому, что ПК перейдет за адрес 0x40014, если rA! = rB?)


person keyser    schedule 03.10.2011    source источник
comment
Ваши шестнадцатеричные значения для bne и br не кажутся правильными. По крайней мере, они не имеют смысла, если я сравниваю их с руководством по набору инструкций NIOS-II. Не могли бы вы добавить дизассемблер вашей программы к вашему вопросу, чтобы мы увидели правильные значения?   -  person Nils Pipenbrinck    schedule 03.10.2011
comment
@NilsPipenbrinck Я не скомпилировал эту программу. Я только интерпретирую данную текстовую версию. Я получил в назначении шестнадцатеричные адреса. Я не учел, что начальный адрес - 0x40000. Может быть, вы просто неверно истолковываете меня, когда я говорю, что шестнадцатеричный адрес для bne - это ..., потому что я просто утверждаю, что этот адрес указан в столбце справа от инструкции. Не то чтобы это крайние правые значения битов, указанные в наборе команд.   -  person keyser    schedule 03.10.2011


Ответы (1)


Отказ от ответственности: я не совсем уверен, что это за набор инструкций, поэтому я постараюсь придерживаться того, что обычно имеет место для языков ассемблера.

если (rA! = rB), то PC ← PC + 4 + σ (IMM16) иначе PC ← PC +4

что, насколько я понимаю, это счетчик программы, увеличивающийся на 4 + смещение или просто на 4.

Это правильно. Было бы полезно иметь в виду, что ЦП в основном всегда будет делать PC ← PC + 4 после выборки инструкции для перемещения счетчика программы на следующую инструкцию для следующего цикла. Таким образом, даже NOP будет иметь эффективный результат PC +=4 (когда длина инструкций составляет 4 байта). В Википедии есть больше.

Кроме того, поскольку IMM16 может быть отрицательным, вы можете прыгать назад.

Но каково значение смещения / IMM16 в моем случае? В справочнике по набору инструкций сказано:

При кодировании инструкций смещение, заданное IMM16, обрабатывается как количество байтов со знаком относительно инструкции, следующей сразу за bne.

Я интерпретирую это так, что значение IMM16 - это расстояние до следующего адреса инструкции, но я понятия не имею, правильно ли это. Шестнадцатеричный адрес для bne - 0x40010 и 0x40014 для br, поэтому это будет означать, что значение IMM16 равно 4? (что может привести к тому, что ПК перейдет за адрес 0x40014, если rA! = rB?)

Значение IMM16 - это расстояние, но это расстояние (в байтах) до инструкции, к которой вы хотите перейти в случае rA != rB! Итак, в этом случае вы хотите, чтобы непосредственным было расстояние от инструкции, следующей за bne (потому что расстояние относительно следующей инструкции), до места, куда вы хотите перейти (loop). В этом случае (если мои расчеты верны) address(jump-target) - (address(bne-instruction) + 4) = 0x40008 - (0x40010 + 4) = -12 = ~12 + 1 = 0xfff4 (16-bit).

Поскольку вы беспокоитесь о кодировании инструкций, обратите внимание на сигма-функцию, применяемую к немедленному. Я возьму обоснованное предположение и предположу, что он умножает непосредственное на 4, и тогда кодировка инструкций будет содержать количество инструкций для перехода минус один. То есть -12 байтов, вероятно, будет закодировано как 16-битное значение со знаком 0xfffc = -3, так как мы хотим перескочить на две инструкции назад с помощью bne и, таким образом, вернуться на 3 инструкции из инструкции , следующей за bne.

Если это правда, то я до сих пор не понимаю, какое значение IMM16 имеет br, поскольку следующих инструкций нет. Может ноль, когда метка стоп? (или к чему приведет bne, если rA! = rB и PC ← PC + 4 + σ (IMM16)).

Имейте в виду, что br может иметь другую кодировку (например, это может быть абсолютное смещение или другой размер). Я недостаточно знаком с набором инструкций, чтобы знать, но я могу дать общую идею: вы на самом деле не используете адрес следующей инструкции, скорее вы используете адрес текущей инструкции + 4 ( который, если следует инструкция, будет адресом этой инструкции).

person user786653    schedule 03.10.2011
comment
Спасибо за Ваш ответ. Это было очень полезно. Я полностью решил эту проблему, и вы были правы во всех отношениях. И моя сигма-функция, кажется, умножается на 1, потому что мое значение IMM16 должно быть выровнено по словам. Ваше здоровье! - person keyser; 05.10.2011