У меня есть этот ассемблерный код, который я должен перевести в машинный код в двоичной форме:
.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?)