Нужен совет по программе на ассемблере (AVR ATMega169). Мне нужно создать код для вычисления этого выражения.
R20 = (4 * R16 + 3 * R17 - R18) / 8
Я пытаюсь вычислить арифметическое выражение в коде и всегда проверяю инструкцию переполнения, но она не работает должным образом.
.org 0
start:
ldi r16, 10
ldi r17, 20
ldi r18, 10
lsl r16
brvs OVERFLOW
lsl r16
brvs OVERFLOW
mov r20,r17
brvs OVERFLOW
lsl r20
brvs OVERFLOW
add r20,r17
brvs OVERFLOW
add r20, r16
brvs OVERFLOW
sub r20,r18
brvs OVERFLOW
asr r20
brvs OVERFLOW
asr r20
brvs OVERFLOW
asr r20
brvs OVERFLOW
brvc OK
OVERFLOW:
ldi r30, 0x11
OK:
ldi r30, 0x11
konec:
rjmp konec
-127
и+127
для 8-битных входных данных со знаком, поэтому выбор метода вычисления, который может привести к переполнению промежуточного значения, зависит от вас. Вы можете просто использовать дополнительную точность (2 регистра) для промежуточных значений, где это необходимо, вместо проверки переполнения после каждой инструкции lsl / add / sub. - person Peter Cordes   schedule 21.04.2021