2012-01-23 12 views
5

में उद्देश्य सी चयनकर्ताओं के लिए ऑफसेट मैं समझने की कोशिश कर रहा हूं कि आईओएस उद्देश्य-सी संदेश कॉल एआरएम असेंबली भाषा में कैसे लागू की जाती है। आईडीए डिस्सेप्लर आउटपुट को देखते हुए मैं __obj_msgsend को कॉल करने से पहले रजिस्टरों में धक्का दिया गया वर्ग और चयनकर्ता संदर्भ देख सकता हूं। यह सही मायने रखता है लेकिन अजीब बात यह है कि इन मूल्यों के लिए एक अजीब ऑफसेट है।एआरएम असेंबली (आईओएस)

selector ref = (selRef_arrayWithObject_ - 0x29B0) 
class ref = (classRef_NSArray - 0x29BC) 

वर्ग रेफरी में 0x29BC मूल्य __obj_msgsend जो यह करने के लिए एक निश्चित तर्क है के बाद शिक्षा की ओर इशारा करते प्रतीत हो रहा है, लेकिन 0x29B0 चयनकर्ता रेफरी एक यादृच्छिक Movt अनुदेश की ओर इशारा करते है। और मामलों को और भी खराब बनाने के लिए यह चयन प्रत्येक चयनकर्ता आमंत्रण के लिए अलग दिखता है।

क्या किसी को पता है कि ये ऑफसेट कहां से आते हैं? वे सिर्फ निर्देश + 8 के पते पर संदर्भित क्यों नहीं हैं?

__text:00002998 E8 1F 01 E3     MOV    R1, #(selRef_arrayWithObject_ - 0x29B0) ; selRef_arrayWithObject_ 
__text:0000299C 05 20 A0 E1     MOV    R2, R5 
__text:000029A0 00 10 40 E3     MOVT   R1, #0 
__text:000029A4 01 50 A0 E3     MOV    R5, #1 
__text:000029A8 01 10 9F E7     LDR    R1, [PC,R1] ; selRef_arrayWithObject_ ; "arrayWithObject:" 
__text:000029AC 74 00 02 E3     MOV    R0, #(classRef_NSArray - 0x29BC) ; classRef_NSArray 
__text:000029B0 00 00 40 E3     MOVT   R0, #0 
__text:000029B4 00 00 9F E7     LDR    R0, [PC,R0] ;  _OBJC_CLASS_$_NSArray 
__text:000029B8 8C 05 00 EB     BL    _objc_msgSend 

अद्यतन:

__text:00002744 50 12 02 E3     MOV    R1, #(selRef_view - 0x2758) ; selRef_view 
__text:00002748 00 10 40 E3     MOVT   R1, #0 
__text:0000274C 00 50 A0 E1     MOV    R5, R0 
__text:00002750 01 10 9F E7     LDR    R1, [PC,R1] ; selRef_view ; "view" 


__objc_selrefs:000049A8 1A 39 00 00 selRef_view  DCD sel_view   ; DATA XREF:  __text:000025F8o 

इगोर के विवरण के लिए धन्यवाद, मैं समझता हूँ कि जहां 0x2758 से आया है, लेकिन गणित यहाँ से बाहर काम नहीं करता है: यहाँ एक और मामला है selRef_view - 0x2758 = 0x49A8 - 0x2758 = 0x2250। लेकिन पहले निर्देश में डेटा 50 12 है, जो 0x1250, 0x1000 कम अनुवाद करता है जो मैं अपेक्षा करता हूं। कोई विचार???

+0

आपने ऑफसेट कहा, लेकिन डिस्सेप्लर लिस्टिंग पूर्ण पते से है। – arul

उत्तर

8

एआरएम में, पीसी मान दो निर्देश स्लॉट आगे इंगित करता है, यानी। एआरएम मोड में + 8 और। थंब मोड में + 4। यही वह जगह है जहां "यादृच्छिक" मान आते हैं। उदाहरण के लिए:

__text:000029A8 LDR R1, [PC,R1] 

जब से हम एआरएम मोड में हों, पीसी मूल्य 029A8 + 8 = 029B0 है। तो, यह कोड r1 = *(int*)(r1+0x29B0) के बराबर है। आईडीए हमें एक संकेत देता है कि आर 1 को मूल्य (selRef_arrayWithObject_ - 0x29B0) से लोड किया गया है, इसलिए सरलीकरण के बाद हमें r1 = *(int*)(selRef_arrayWithObject_) मिलता है, जो संभावित रूप से स्ट्रिंग (चयनकर्ता) "arrayWithObject:" के पते पर हल हो जाता है।

+0

आईई। एआरएम असेंबली पढ़ना बट में दर्द है। :) – bbum

+0

जब तक आप आईडीए का उपयोग नहीं करते;) –

+0

मैं देखता हूं। मुझे पीसी +8 के बारे में पता था, लेकिन मैं गलत पीसी का उपयोग कर रहा था (: धन्यवाद! – Locksleyu