Ben C/Objective-C, bu arada Apple does it üzerinde hafif bir bükülme içinde üst düzey görüşme ile kullanmak için bazı trambolin fonksiyonları ile çalışıyorum.Çıkarma argümanlar, ARM montaj
sen hiç yolu Objective-C IMP
eserlerine aşina iseniz, temelde void(*)(id obj, SEL sel, ...)
gibi ilk iki argüman Bir mesajın alıcısı ve mesaj seçicinin adı verilebilir bir işlev işaretçisi, bu. çalışma zamanı daha yeni sürümleri yöntem uygulamaları void(^)(id obj, ...)
gibi, C blokları kullanarak çalışma zamanında sentezlenmiş izin verir. Bu bloklar seçiciye sahip değil; Çalışma zamanı alıcı ile seçici, blok işaretçi ile alıcı üzerine yazar bir trambolini oluşturur ve çalıştırmadan hareket eder.
bu bloğa argümanlar geleneksel yöntem send argümanlar tamamen aynı olacak şekilde, ilk iki bağımsız değişken ya olmamasından içerir belli belirsiz benzer bir şey yapmak istiyorum, artı yürütülmesi için blok işaretçisi amaçları, yani void(*)(Block *, ...)
. Bu sadece blok göstericide kopyalama gerektirir ve sanırım bir argümandan kurtulmayı düşünüyorum. İşte
__a1a2_tramphead_argonly:
popl %eax
andl $0xFFFFFFF8, %eax
subl $0x1000, %eax
movl 4(%esp), %ecx // self -> ecx
movl %ecx, 8(%esp) // ecx -> _cmd
movl (%eax), %ecx // blockPtr -> ecx
movl %ecx, 4(%esp) // ecx -> self
jmp *12(%ecx) // tail to block->invoke
Ben ARM üzerindeki montaj var:
__a1a2_tramphead_argonly:
// calculate the trampoline's index (512 entries, 8 bytes each)
#ifdef _ARM_ARCH_7
// PC bias is only 4, no need to correct with 8-byte trampolines
ubfx r1, r1, #3, #9
#else
sub r1, r1, #8 // correct PC bias
lsl r1, r1, #20
lsr r1, r1, #23
#endif
// load block pointer from trampoline's data
adr r12, __a1a2_tramphead_argonly // text page
sub r12, r12, #4096 // data page precedes text page
ldr r12, [r12, r1, LSL #3] // load block pointer from data + index*8
// shuffle parameters
mov r1, r0 // _cmd = self
mov r0, r12 // self = block pointer
// tail call block->invoke
ldr pc, [r12, #12]
Benzer kod x86_64 için var; Yukarıdaki kod bu yüzden doğrudan Apple’dan. (Reciever olarak kullanılan) İlk argüman bloğu değişmezi olacak şekilde kişisel bilgi için, ben ikinci ilk gerçek argüman olduğunu ve benzerleri, nerede bir tartışma excising ile başlamak merak ediyorum.
Ben ASM de inanılmaz noobish değilim, bu yüzden herhangi bir yardım büyük beğeni topluyor. Denediğim her şey gittikçe ilginç şekillerde patladı. Şimdiden teşekkürler.
Dikkat edin, birçok Linux dağıtımı şu anda ARM Sert Şamandıra ABI'ye geçme aşamasındadır. Bu yine sizin için her şeyi kırmayacak. – ams
Bu ilginç, gelecek için aklımda tutacağım. Bununla birlikte, bu çoğunlukla Darwin'i hedeflemektedir. Teşekkür ederim! Düzenleme: Bu, en azından şimdilik, ARMV6 ve ARMV7 anlamına gelir. – zwaldowski