2014-10-29 63 views
2

我正在計算16個64位數的加在一起的平均值,我認爲我已經正確地完成了所有的加法,但現在我需要弄清楚如何將64位數除以16我被卡住了!任何幫助將非常感謝你。這是我的代碼到目前爲止。在ARM程序集64位SOS

tableSize  EQU  16 
sum    EQU  0x40000000 
average   EQU  0x40000008 
       MOV r8, #14 

       ADR r0, table 
       LDR r9, =sum 
       LDR r10,=average 

       LDR r1, [r0], #1 ;hi #1 
       LDR r2, [r0], #1 ;lo #1 
SUM 
       SUB r8, r8, #1 
       LDR r3, [r0], #1 ;hi #2 
       LDR r4, [r0], #1 ;lo #2 
       ADDS r5, r2, r4 ;lo 1 + lo 2 set flags 
       ADC r6, r1, r3 ;hi 1 + hi 2 + carry 
       MOV r1, r6 
       MOV r2, r5 
       CMP r8, 0 
       BNE SUM 

       STR r1, [r9], #8 
       STR r2, [r9] 
average 
       ;stuck here 


table   DCQ  0x0200200AD00236DD 
       DCQ  0x00003401AAC4D097 
       DCQ  0x000001102ACFF200 
       DCQ  0x00010AA0AD3C66DF 
       DCQ  0x0000FC3D76400CCB 
       DCQ  0x000090045ACDD097 
       DCQ  0x00000FF000004551 
       DCQ  0x00000000003C66DF 
       DCQ  0x1000200AD00236DD 
       DCQ  0x00003401AAC4D097 
       DCQ  0x000001102ACFF200 
       DCQ  0x00010AA0AD3C66DF 
       DCQ  0x1000FC3D76400CCB 
       DCQ  0x000090045ACDD097 
       DCQ  0x00000FF000004551 
       DCQ  0x00000000003C66DF 
+0

我知道我需要轉移hi 32位,然後保存那個lo位並使用邏輯指令將該數字移動到最後32位的hi位中......我只是不知道如何去做這件事...不知道這是否有助於任何人 – user2789830 2014-10-29 15:24:23

+0

你如何處理64位加法溢出?如果我添加八位值「128 + 129」,會發生什麼? 64位是簽名還是未簽名? 'C'操作(i >> 4)'做什麼?這些東西是否相同? '(a/2 + b/2)==(a + b)/ 2'?我們必須做些什麼來使他們平等?好消息,你的ARM代碼很好。你需要首先考慮數學。 – 2014-10-29 15:56:21

+0

我改變了我的代碼,因爲數學實際上是不正確的,因爲我如何構建循環。我假設在這種情況下64位是無符號的。我也改變了i >> 4我>> 1,因爲我想要去內存中的下一個位置......是否正確或我不需要發佈索引?我也相信當進位標誌被設置並加到高位時,溢出被處理...如果最終結果大於64位,我忽略溢出@artlessnoise – user2789830 2014-10-29 16:04:29

回答

2

由於有在r0r1一個64位有符號整數,可以通過16以下指示將其劃分:

lsl  r2, r0, #28 
    asr  r0, r0, #4 
    orr  r1, r2, r1, lsr #4 

簡而言之,我們需要做的是轉移兩者均減四,並將r0的低四位分成r1的四個高位。

要得到無符號的除法,應該使用lsr而不是asr

在這兩種情況下,結果都會向負無窮大變化。要將結果向最近的整數四捨五入,可以在分割前將整數加8。另外,可以加15來加正無窮。