[英]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-r3
或r12
被調用過多。
請注意,您提供的代碼至少包含一個錯誤,因為您使用的是r10-r11
,並且沒有通過STMFD
和LDMFD
指令保留其內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.