2015-04-14 129 views
0

我正在寻找代码或帮助AVR这个功能。或者如果没有代码,我可以得到一些线索如何做到这一点?AVR函数计算

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