Bu ödev. Şimdi bir süredir neyi yanlış yaptığımı anlamaya çalışıyorum. atama geçerli:ARM döngü hatası sorunu
C aşağıdaki kodu düşünün:
int foo(int a, int b)
{
if (a > b) return 0;
if (a == b) return b;
return a + foo(a+1, b);
}
montaj bu işlevi uygulamak. işlevinden geri dönüş yaptığında, çıktı aşağıdaki gibi olmalıdır. Kullanıcı daha sonra 4 girerse 10: 4 10 49END
kullanıcı 10 sonra 4 girerse:
END
Kodum yüzden Uzaklık:
@main program
_start:
mov sp,#0x100000 @ set up stack
ldr r4,=0x101f1000
@ ASCII codes stored
@ at [r4] get printed
@ get input
bl get_int
mov r5, r0
bl get_int
mov r6, r0
@ mov a to r0 b to r1
mov r0, r5
mov r1, r6
@ branch to the function you write
bl foo
@ print the number in r0 after branching back from your function
bl print10
@ branch to exit
b my_exit
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Your code starts here @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
foo:
cmp r0,r1
blt Less
bge More
mov r0,r1
b Exit
Less:
mov r3,r0
add r0,r0,#1
add r3,r3,r0
cmp r0,r1
blt More
mov r0,r3
More:
mov r0,#0
Exit:
bx lr
Karşılaştığım sorun, ne zaman girdiğim önemli değil, her zaman bir çıktı alıyorum 0.
'Less: 'de yapmaya çalıştığınızdan emin değilim, ama doğru değil. Yaptığınız şey, 'a + 1, b' argümanlarıyla' foo' olarak adlandırılır ve bunun sonucu artı 'a' nın geçerli değerini döndürür. – Michael
'bge', [doğru koşul] değil (https://community.arm.com/groups/processors/blog/2010/07/16/condition-codes-1-condition-flags-and-codes) Daha fazla, sadece farklı bir değer (a == b veya R0 == R1) döndürmek istediğiniz gibi sadece "bgt" dir. Yinelemeyi veya * satır içi * geri kalanını 'foo' kullanabilir ve yinelemeyi kullanamazsınız. [Derleyici] 'nin ne olduğunu kontrol ederdim (https://godbolt.org/g/ivsdCn). –
Teşekkür ederim artless. Onu bgt olarak değiştirdim ve yanlış yaptığım şeyi daha fazla saptamayı başardım. Sonunda L2'yi değiştirdim ve L2'de bne yaptık. İhtiyacım olan sonuçlar için işe aldım. Tekrar teşekkürler – Fireurza