2015-04-14 286 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