C de sabit bir adresteki fonksiyon nasıl çağrılır

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
25,192
Boot loader ile uğraşırken karşılaşılan durumlardan birisi, boot loader'in asıl programa kontrolü devretmesidir. Asıl programın giriş noktası da sabit bir adresin içerisinde saklıdır. Gerçek bir sistemden örnek verelim:

Boot loader, hardware resetten sonra 0x00000004 adresinde bulunan reset vektörüne bakıyor ve o adresten 0x0000061D değerini okuyor. Sonra da 0x0000061D deki fonksiyonu çağırıyor ve oradan boot loader artık çalışmaya başlamış oluyor. Boot loader işini bitirdikten sonra, asıl çalışacak programın reset vektörü olan 0x00030004 adresine bakıyor ve oradan 0x000310B5 değerini okuyor. Sonra da 0x000310B5 adresindeki fonksiyonu çağırıyor ve böylece asıl program çalışmaya başlıyor. Peki C de bu işlem nasıl yapılabilir? Önce bir fonksiyon pointer tanımlarız. Sonra bu pointere fonksiyonun adresini atarız ve pointer ile de fonksiyonu çağırırız

Kod:
#define APP_RUNTIME_OFFSET 0x00030000

void boot_application(void)
{
    void (*entry)(void) = (void (*)(void))(*(uint32_t*)APP_RUNTIME_OFFSET);
    entry();
}

Veya işlemi tek hamlede yapmak için

Kod:
#define APP_RUNTIME_OFFSET 0x00030000

void boot_application(void)
{
    ((void (*)(void))(*(uint32_t*)APP_RUNTIME_OFFSET))();
}
 
Görüldüğü gibi bu işlemi C de yapınca anlaşılması kolay olmayan arap saçı gibi bir kod ortaya çıkıyor. O yüzden bu işlemi assembly'de yapmak okunabilirlik açısından daha mantıklı

Kod:
void boot_application(void)
{
    __asm volatile
    (
        "mov.w   r3, #196608\n"
        "ldr     r3, [r3]\n"
        "blx     r3\n"
        );
    }
}

Buradaki işlem çok daha anlaşılır ve programlama dilinin kurallarının getirdiği ilave karmaşıklık yok. R3 registerine 0x30000 değerini yüklüyoruz, sonra o adreste bulunan 32 bit değeri gene R3 registerine okuyoruz. Sonra da R3 registerindeki adrese alt rutin çağrısı yapıyoruz.
 
Aslında bu işi assembly'de yapmanın birçok farklı yolu var. Benim kullandığım yol, C derleyicisinin üretmiş olduğu kodun aynısı:

Screenshot_20220814_185932.png
 

Forum istatistikleri

Konular
7,722
Mesajlar
128,512
Üyeler
3,118
Son üye
konce

Son kaynaklar

Son profil mesajları

Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Freemont2.0 herbokolog Freemont2.0 wrote on herbokolog's profile.
nick iniz yakıyor
:D
az bilgili çok meraklı
Back
Top