2016-12-07 53 views
0

另一個程序集問題!如何計算包含8位值的兩個數組的16位點積?

使用Arduino,我必須在我的計算機科學類的Atmel AVR Assembly中編寫一個函數,用於計算兩個數組的點積,並將其作爲16位整數返回。這些數組長度相等,每個數組都包含一組8位值。該函數應該將這兩個字節數組和一個表示數組長度的字節作爲參數。我被允許使用分支指令等。

這是我到目前爲止有:

.global dot 
dot: 
    mov r18,r22 
    mov r19,r23 
    movw r26,r18 
    mov r30,r24 
    mov r31,r25 
    ldi r18,lo8(0) 
    ldi r19,hi8(0) 
    jmp exit_if 
    compute: 
    ld r25,Z+ 
    ld r22,X+ 
    muls r22,r25 
    movw r22,r0 
    clr r1 
    add r18,r22 
    adc r19,r23 
    exit_if: 
    mov r25,r30 
    sub r25,r24 
    cp r25,r20 
    brlt compute 
    movw r24,r18 
    ret 

這是一個有點我知道怪物的......

出於某種原因,當我有數組字節[] = {7, 20,19,11,4}和字節b [] = {132,51,0,84,30},長度參數等於5(顯然),它不會像它應該返回的那樣返回2988。有誰知道發生了什麼問題?任何幫助將真誠感謝!

+3

你可能想用註釋註釋你的代碼。即使假設我們知道指令集和ABI,但這並不表明你的子程序的預期參數是什麼。 –

+0

爲什麼不使用C編譯器? AVR被設計成一個好的編譯器目標,所以編寫一個函數,該函數接受參數並返回結果,並查看gcc的輸出。 –

+1

'b [0] = 132'與組件不匹配。乘法是有符號的,所以這是-124。 –

回答

0

我想通了每個人。

對於線

muls r22, r25 

我應該做它

mul r22, r25 

所以,這只是一個小信。抱歉!

1

試圖將您的代碼轉換爲略高的抽象級別。

.global dot 
dot: 
    mov r18,r22 
    mov r19,r23 
/* r18r19 = r22r23; */ 
    movw r26,r18 
/* X = r26r27 = r18r19; */ 
    mov r30,r24 
    mov r31,r25 
/* Z = r30r31 = r24r25; */ 
    ldi r18,lo8(0) 
    ldi r19,hi8(0) 
/* r18r19 = 0; */ 
/* jmp - innerlabel - testlabel pattern: while() loop */ 
    jmp exit_if 
    compute: 
    ld r25,Z+   // r25 = *(Z++) 
    ld r22,X+   // r22 = *(X++) 
    muls r22,r25  // multiplies vector elements, result in r0:r1 
    movw r22,r0  // r22r23 = a[i]*b[i], signed 
    clr r1   // r1=0 
    add r18,r22 
    adc r19,r23  // r18r19 += r22r23 
    exit_if: 
    mov r25,r30  // r25 = r30; 
    sub r25,r24  // r25 -= r24; 8-bit count of how many bytes have been read 
    cp r25,r20  // compare to r20 
    brlt compute // if r25<r20 loop 
    movw r24,r18 // r24r25 = r18r19 
    ret 

在條目處找到了註冊的含義:r20是向量長度。 r24r25是一個矢量位置。 r22r23是另一個向量位置。由於某些不可理解的原因,r18r19用於跟蹤循環中的和,暫時保存其中一個指針的副本。結果最終放置在r24:r25中。

這似乎可以合理執行任務。所以接下來的問題確實是ABI和爭論的真正內容。

+0

是的,謝謝你對我的代碼進行註釋,對不起以前沒有自己做過。我還編輯了我的原始問題,以補充差異來自哪些論點。 – stealthbomber10

相關問題