2016-09-07 90 views
0

對於一類剛剛開始使用ARM彙編語言,我們都需要實現一個簡單的for循環如下所述:介紹ARM - 裝配誤差

h=1; 
for (i=0, i<5, i++) 
    h=(h*3)-i; 

我已經寫在ARM彙編下面的代碼:

 AREA Prog2, CODE, READONLY 
    ENTRY 

    MOV r0, #1;   initialize h=1 
    MOV r1, #0;   initialize i=0 
loop CMP r1, #5;   at start of loop, compare i with 5 
    MULLT r0, r0, #3; if i<5, h=h*3 
    SUBLT r0, r0, r1; if i<5, h=h-i (ties in with previous line) 
    ADDLT r1, r1, #1; increment i if i is less than 5 
    BLT loop ;   repeat loop of i is less than 5 

stop B stop;    stop program 
    END 

的問題是,有一個與線

 MULLT r0, r0, #3; if i<5, h=h*3 

一個錯誤。如果我刪除它˚F rom代碼,一切工作正常。我無法理解這一行的問題。給出的錯誤描述是「錯誤的寄存器名稱符號,預期的整數寄存器」。我已經嘗試將#3加載到寄存器中,然後將這兩個寄存器相乘,但這並沒有幫助。它只是將錯誤信息更改爲「此寄存器組合導致不可預知的行爲。」我是新手,因此請僅提供基本說明以解決此問題。謝謝。

+1

看了你的指令集的引用有什麼說的'mul'指令,特別是需要什麼操作數的形式。 – Notlikethat

回答

1

MUL要求所有的操作數都是寄存器,所以你必須使用MUL r0, rn, r0的形式,其中rn是其他一些合適的寄存器。

如果結果和第一個操作數相同,則結果是不可預知的,如錯誤所述。這是由於處理器的內部操作。這就是爲什麼你必須使用r0, rn, r0而不是r0, r0, rn

+0

快速參考卡沒有提到任何限制,除非你試圖在Thumb-2上使用muls,否則'Rd'和'Rm'需要相同,否則'muls'不可用。所以,他也可以通過使用第三個寄存器來避開不可預知的行爲,但我想這會使程序不必要地複雜化。 – rjp

+0

@rjp Rd和Rm不需要相同;我認爲薩米只是保留了原始代碼的意圖。唯一的限制是,在ARMv6之前,兩個輸入寄存器_不能相同。 – Notlikethat

1

無論如何,乘以3被高估; ARM可以用一個成語可笑除了做到這一點:

add r0, r0, r0 lsl #1 // r0 = r0 + r0 *2 
+0

如果從'0'到'-4'而不是從'0'到'4',可以使用'mla r0,r0,r2,r1'和'r2 = 3'。我想我有這個數學的權利。 – rjp