Вопрос сборки ARM (недостаточно регистрации!) - PullRequest
0 голосов
/ 06 ноября 2018

Привет! Я пытаюсь написать код, который выполняет поиск по шаблону и ранжирует топ-3 самых популярных шаблонов, и сколько раз он считает шаблоны. Я могу сделать код, который оценивает топ-2 моделей. но я не могу сделать ранг 3 один.

(я выделил регистры таким образом)
R7: количество паттернов top1
R8: топ1 шаблон
R10: количество образцов топ2
R11: топ2 шаблон

это мой настоящий код, который работает

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

но когда я попробовал коды ранга 3 с той же логикой, я просто изменил распределение регистров таким образом

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

1 Ответ

0 голосов
/ 06 ноября 2018

Как бы это сделал компилятор? Попробуйте написать несколько C, чтобы сделать то же самое, и заставить компилятор генерировать ассемблер (если вы используете GCC, это gcc -S). Это хороший способ узнать об эффективном языке ассемблера; не все, что делает когда-либо компилятор, является наиболее эффективным, каким оно может быть, но оно всегда будет работать и быть логичным и должно быть достаточно простым, если оптимизация отключена.

Если у вас закончились регистры, единственным вариантом является использование стека для локального хранилища, а также при необходимости сдвигайте и извлекайте регистры или выделяйте немного места в стеке и значения LDR / STR из этой области. как требуется. Однако в вашем случае вы не вызываете какие-либо другие функции из своей функции, поэтому нет причин избегать r0-r3 или r12, которые являются замкнутыми при вызове.

Обратите внимание, что представленный код содержит как минимум одну ошибку, поскольку вы используете r10-r11 и не сохраняете их содержимое с помощью инструкций STMFD и LDMFD.

...