में उद्देश्य सी चयनकर्ताओं के लिए ऑफसेट मैं समझने की कोशिश कर रहा हूं कि आईओएस उद्देश्य-सी संदेश कॉल एआरएम असेंबली भाषा में कैसे लागू की जाती है। आईडीए डिस्सेप्लर आउटपुट को देखते हुए मैं __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 कम अनुवाद करता है जो मैं अपेक्षा करता हूं। कोई विचार???
आपने ऑफसेट कहा, लेकिन डिस्सेप्लर लिस्टिंग पूर्ण पते से है। – arul