Вложенные циклы в сборке Arm

#assembly #arm

#сборка #arm

Вопрос:

Я работаю над проектом по переводу следующего кода C в сборку ARM.

 int i = 1;
int j = 0;
int x = 0;

int main(){
        for( ; i < 10; i  = 2){
                for( j = i; j < 10; j  ){
                x  = i   j;
                }
        }
        return x;
}
 

У меня все еще возникают небольшие проблемы с пониманием вложенных циклов. Это то, что у меня есть до сих пор:

                                                                                                               
// DATA Section
.DATA
.balign 4
i:
        .word 1
.balign 4
j:
        .word 0
.balign 4
x:
        .word 0
.text
.balign 4

.global main
main:
        ldr r0, addressofI
        ldr r1, addressofJ
        ldr r2, addressofX
        b toptest
loop:
        ldr r4, [r0]            //load i to r4
        add r4, r4, r1          //add i   j
        add r4, r4, r2          //add x   (i j)
        str r4, [r2]            //store new x in R2 address
        ldr r5, [r2]
        add r3, r2, #1          //add 1 to i
        str r1, [r0]            //store value of i in j
toptest:
        cmp r0, #10             //compare i to 10
        blt bottomtest          //jump to bottomtest if pass
        ldr r3, [r0]            //load i to r3
        add r3, r3, #2          //i 2
        str r3, [r0]            //store i 2 in r0
bottomtest:
        ldr r4, [r0]            //load i to r4 (equal to j)
        cmp r4, #10             //compare i to 10
        blt toptest             //less than = loop
branch:
        ldr r4, [r0]
        add r4, r4, #2
        str r4, [r0]
        b toptest
end:
        mov r0, r2
        bx lr

addressofI: .word i
addressofJ: .word j
addressofX: .word x
 

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

Комментарии:

1. Сразу скажу, ваша жизнь (и код) будут намного проще и эффективнее, если вы будете постоянно хранить i,j,x регистры, а не загружать и сохранять их каждый раз заново.

2. Вы пробовали выполнять одношаговую работу с отладчиком? Это почти наверняка покажет вам, что именно не так. Попытка угадать из выходных данных — бесполезное упражнение.

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

4. add r4, r4, r2 добавляет i j к адресу x , а не к x самому себе. Вам нужно будет загрузить x , добавить к нему значение, а затем сохранить его обратно. Это еще одна причина, по которой хранение всего в регистрах значительно упростит жизнь.

5. Спасибо за ваши предложения. Я решил проблему, установив j =i в конце нижнего цикла.