2016-03-28 21 views
0

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 49

END

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.

+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

+0

'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). –

+0

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

cevap

1

Eksik olan şey, parametreler nasıl iletilip bir değer döndürmektir. Kol üzerine ABI eşdeğeri:

int less(int a, int b) 

olacaktır:

r0
  • b (İkinci parametre) geçirilir
    • a (ilk parametre) r1 geçirilir
    • Dönüş Değer,
    • işlevinden dönmek için r0
    • Mov lr için yazılmalıdır.

    Yani less işlevi çağırmak için aşağıdakileri yapmanız gerekir: - r0 için a Taşı - r1 için b Taşı - fonksiyonunu (bllt) Çağrı - bl (Şube ve bağlantı) aramak için emin olun yerine basit bir b (Şube). bl sonra komutun adres dönüş izin vermek şube ve bağlantı formu kopyalarını - Ayrıca bir işlev çağırdığınızda, r0-r3 bozuk olacağını carreful olmak gerekir r0

    sonucunu alın. Ve diğer kayıtları değiştirmeye ihtiyaç duyarsanız, bunları yığına itmeniz ve geri dönmeden önce geri yüklemeniz gerekir.