2015-04-14 2 views
0

Я ищу код или помощь с AVR для этой функции. Или, если нет кода, я могу понять, как это сделать?Функция AVR Compute

R20 = (4 * R16 + 3 * R17 - R18)/8 

На данный момент у меня есть что-то вроде этого:

.org 0x0000 

start: 
.DEF ANSL = R0 
.DEF ANSH = R1 
.DEF A = R19 
.DEF B = R21 
.DEF C = R22 
.DEF D = R20 

     ldi A, 4 
     ldi B, 3 
     ldi C, 8 

     ldi R16, 5 
     ldi R17, 10 
     ldi R18, 58 

     MUL A,R16 (4 * R16) 
     MUL B,R17 (3 * R17) 
     add A,B  (4 * R16 + 3*R17) 
     sub A, R18 (4 * R16+3*R17 - R18) 

я не уверен, если это код правильно.

+1

Лучший способ узнать, если ваш код является правильным, чтобы проверить его. –

+0

, вы можете захотеть переписать формулу, чтобы сделать деление как можно раньше, чтобы избежать переполнения регистров: 2 * R16 + (3 * R17)/8 - R18/8 (во всяком случае, в коде отсутствует раздел) – tofro

ответ

1

при умножении/делении с полномочиями 2, замещающих инструкции MUL и DIV с помощью операций сдвига:

MOV r20, r17 ; start with r17*3 
LSL r17   ; left shift is multiply by 2 
ADD r20, r17 ; now r20 is 3* r17 (r17 + 2*r17) 

LSL r16   ; each left shift is a multiplication by 2 
LSL r16   ; 
ADD r20, r16 ; now r20 is 3* r17 + 4* r16 

SUB r20, r18 ; now r20 is 3* r17 + 4* r16 - r18 

LSR r20   ; each right shift is a division by 2 
LSR r20 
LSR r20 
Смежные вопросы