簡體   English   中英

ARM Assembly問題(注冊不足!)

[英]ARM Assembly question (there is not enough register!)

嗨,我正在嘗試編寫代碼,進行模式搜索,並對排名前三的最流行模式進行排名,以及計算模式的次數。 我可以編寫排名前2位的代碼。 但我不能做等級3。

(我以這種方式分配了寄存器)
R7:top1模式的計數
R8:top1模式
R10:top2模式的計數
R11:top2模式

這是我實際的代碼

void ex3(){
int result[4];

example3(0x00,0x100, 0x0, result);
sendstr("Top 1 pattern : ");
printDecimal(result[0]);
sendstr("\n");

sendstr("Top 1 pattern count : ");
printDecimal(result[1]);
sendstr("\n");

sendstr("Top 2 pattern : ");
    printDecimal(result[2]);
sendstr("\n");

    sendstr("Top 2 pattern count : ");
printDecimal(result[3]);
sendstr("\n");

}


PRESERVE8
AREA Ex3, CODE, READONLY

EXPORT  example3

example3
    STMFD       sp!,{r4-r9,lr}              
    MOV         R4, r2                          
    MOV         R6, R3
    MOV         R7, #0
    MOV         R8, #0

Loop2   
    MOV         r3, #0                          
    MOV         r9, r0

Loop
    LDRB        r5, [r9], #1                        
    CMP         r4, r5                          
    ADDEQ       r3, r3, #1                      
    CMP         r9, r1                          
    BLS         Loop
    CMP         R3, R7
    BLT         Com2




Com1

    MOVGT   R10,R7
    MOVGT   R11,R8
    MOVGT   R7, R3                          
    MOVGT   R8, R4
    B               Here

Com2
    CMP         R3,R10
    BLT         Here
    MOVGT   R10,R3
    MOVGT   R11,R4


    CMP         R4, #0XFF
    ADDLT       R4, R4, #1
    BLT         Loop2

    STR         r8, [r6]
    STR         r7, [r6,#4]

    STR         r11, [r6,#8]
    STR         r10, [r6,#12]


    LDMFD       sp!,{r4-r9,lr}

    MOV         PC, lr

    END

但是當我嘗試使用相同邏輯的rank3代碼時,只是以這種方式更改了寄存器分配

r7 count of top1 pattern  
r8 top1 pattern    

r9 top2 count  
r10 TOP2    

r11 top3 count  
r12 top3    

由於(我認為)寄存器分配錯誤(我需要更多的empy寄存器...),它顯示出奇怪的結果。 解決注冊不足的簡單方法或正確方法是什么?

PRESERVE8
AREA Ex3, CODE, READONLY

EXPORT  example3

example3
    STMFD       sp!,{r4-r9,lr}              
    MOV         R4, r2                          
    MOV         R6, R3
    MOV         R7, #0
    MOV         R8, #0

Loop2   
    MOV         r3, #0                          
    MOV         r9, r0

Loop
    LDRB        r5, [r9], #1                        
    CMP         r4, r5                          
    ADDEQ       r3, r3, #1                      
    CMP         r9, r1                          
    BLS         Loop
    CMP         R3, R7
    BLT         Com2




Com1
    MOVGT   R11,R9
    MOVGT   R12,R10
    MOVGT   R9,R7
    MOVGT   R10,R8
    MOVGT   R7, R3                          
    MOVGT   R8, R4
    B               Here

Com2
    CMP         R3,R9
    BLT         Com3
    MOVGT   R11,R9
    MOVGT   R12,R10
    MOVGT   R9,R3
    MOVGT   R10,R4
    B               Here


Com3
    CMP         R3,R11
    MOVGT   R11,R3
    MOVGT   R12,R4


Here
    CMP         R4, #0XFF
    ADDLT       R4, R4, #1
    BLT         Loop2

    STR         r8, [r6]
    STR         r7, [r6,#4]

    STR         r10, [r6,#8]
    STR         r9, [r6,#12]
    STR         r12, [r6,#16]
    STR         r11, [r6,#20]


    LDMFD       sp!,{r4-r9,lr}

    MOV         PC, lr

    END

編譯器將如何做? 嘗試編寫一些C來做同樣的事情,並讓編譯器生成匯編語言(如果您使用的是GCC,則為gcc -S )。 這是學習有效的匯編語言的好方法。 並不是編譯器曾經做過的所有事情都可能是最高效的,但是它始終可以工作並且合乎邏輯,並且如果禁用了優化,應該相當容易遵循。

如果寄存器用完了,唯一的選擇是使用堆棧進行本地存儲,並根據需要推送和彈出寄存器,或者根據需要從該區域分配一些堆棧空間和LDR / STR值。 但是,在您的情況下,您沒有從函數中調用任何其他函數,因此沒有理由避免r0-r3r12被調用過多。

請注意,您提供的代碼至少包含一個錯誤,因為您使用的是r10-r11 ,並且沒有通過STMFDLDMFD指令保留其內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM