2016-06-17 3 views
0

Я новичок в AVR. У меня есть ошибка «Относительная ветвь вне досягаемости» для строки «brne round_loop» во время отладки. Кто-нибудь может мне помочь? Большое вам спасибо за помощь.Ошибка «Относительная ветвь вне досягаемости» в avr

; Test if round counter has reached 14 
mov  t4, rc 
subi t4, 14 
brne round_loop 

round_loop:

round_loop: 
; XOR state and key 
eor  s0, k0 
eor  s1, k1 
eor  s2, k2 
eor  s3, k3 
+0

Вы действительно мужчины «во время отладки», или, скорее, при построении для отладки? Ассемблер не может генерировать код операции BRNE с недопустимым смещением. – Clifford

ответ

2

Инструкция AVR BRNE является 16-битным операционным кодом, 7 бит которого является смещением ответвления. Этот 7-разрядный подписанный операнд может иметь значение k в диапазоне -64 ≤ k ≤ +63. ПК изменен на k +1 (то есть от -63 до +64). Если прыжок далее, то относительная ветвь непригодна.

Вам нужно либо найти цель ближе к ветке, либо использовать безусловную ветвь для безусловного перехода (JMP) с 22-битным диапазоном или относительный скачок (RJMP) с 12-битным диапазоном.

mov  t4, rc 
    subi t4, 14 

    brne round_loop_longjmp 
    rjmp no_round_jmp 
round_loop_longjmp: 
    rjmp round_loop 

no_round_jmp: 
    ... 
2

Относительный ветвь означает, что скачок происходит за счет изменения положения счетчика команд (что команда быть выполнена прямо сейчас) либо путем добавления или вычитания значения из него , Это означает, что round_loop в brne не переводится в абсолютный адрес, а на расстояние от текущей инструкции. Предел для brne - 7 бит, поэтому я считаю, что он должен быть в пределах +64 слова (каждая инструкция составляет 1 слово и 64 инструкции). Таким образом, ярлык round_loop должен находиться в пределах 64 инструкций команды brne, либо до, либо после нее.

Если вы не можете перемещать round_loop в этом диапазоне, вам нужно будет сделать ветку на метке, которая будет делать JMP для round_loop.

+0

Возможно, отладчик ввел дополнительный код для своих целей, перемещая ранее находящуюся вне диапазона ветвь. –

+0

Хороший ответ, но обратите внимание, что количество слов не обязательно равно количеству инструкций, команды с 16 или 22 битными адресными операндами (например, JMP) - это * два слова *. Также незначительная точка; диапазон 7-разрядного подписанного операнда - от -64 до +63, а не +/- 64, а операция BRNE выполняет PC = PC + k + 1, когда условие истинно, диапазон переходов от -63 до +64. – Clifford

Смежные вопросы