#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 в конце нижнего цикла.