2012-04-21 10 views
18

किसी कारण के लिए, जब मैं कोड के इस बिट संकलित करने के लिए प्रयास करते हैं, संकलक syscall.s:72:invalid constant (0x172) after fixup का कहना है:फिक्सअप के बाद अमान्य स्थिर?

.globl _mach_msg_trap$MACH 
_mach_msg_trap$MACH: 
    stmfd sp!, {r4,r7} 
    mov r7, #370 /* this is line 72 */ 
    svc 0 
    ldmfd sp!, {r4, r7} 
    bx lr 

मैं क्यों यह यह कर रहा है पता नहीं है। जब मैं r7 में एक छोटा स्थिर रखता हूं, तो यह ठीक काम करता है। लेकिन उच्च संख्या के साथ, यह इस त्रुटि को थूकता है। मैंने इसे mov r7, #300 और add r7, #70 करके अस्थायी रूप से ठीक कर दिया है, जो वांछित प्रभाव प्राप्त करता है। अभी भी सुनिश्चित नहीं है कि त्रुटि के कारण क्या हुआ।

उत्तर

35

एआरएम निर्देश केवल mov के साथ तत्काल मूल्यों की सीमित सीमा लोड करने में सक्षम है। समस्या यह है कि मूल्य को mov निर्देश में ही एन्कोड किया जाना चाहिए। चूंकि सभी एआरएम निर्देश 32-बिट चौड़े हैं, मूल निर्देश-एआरएमवी 5 तक स्थापित केवल तत्काल एन्कोड करने के लिए कुल 8 + 4 बिट्स थे। पहले 8-बिट 0-255 की सीमा में किसी भी 8-बिट मान int को लोड करने में सक्षम होने के साथ और 4 बिट 0 और 30 के बीच 2 के चरणों में दाएं घुमाए जा रहे हैं।

तो आप मूल्यों को लोड कर सकते हैं :

#0 
#122 
#121 ror #24 = 30976 
#230 ror #12 = 241172480 

लेकिन, # 370 इस योजना के साथ लोड करने योग्य नहीं है, यह #185 ror #31 जो संभव नहीं है की तरह कुछ की आवश्यकता होगी।

आपके तत्काल मूल्य को लोड करने के दो तरीके हैं।

  1. आप कई चरणों में मूल्य का निर्माण करके इसे कैसे हल कर चुके हैं।
  2. एलडीआर के साथ स्मृति से मूल्य लोड करके: ldr r7,=#370 तब असेंबलर स्थिर-पूल बनाएगा और पीसी-रिश्तेदार पते के माध्यम से वहां से मूल्य लोड करेगा।

आमतौर पर आपको 2 निर्देशों के साथ स्थिरांक बनाना पसंद करना चाहिए, यदि यह संभव नहीं है (या मूल्य को स्थानांतरित करने योग्य है) ldr का उपयोग करें।

ARMv7 के साथ शुरू आप भी निचले आधे बिना छुए movwmovt उपयोग कर सकते हैं जबकि शीर्ष साढ़े शून्यीकरण को एक रजिस्टर के निचले हिस्से में किसी भी 16 बिट मूल्य लोड करने के लिए और ऊपरी हिस्से के लिए एक और 16 बिट मूल्य लोड करने के लिए।

+0

मुझे एक ही समस्या है, लेकिन armv4 का उपयोग कर। मैं एक रजिस्टर में 0x0000ffff लोड करना चाहता हूँ। movw और movt इस बांह मोड में समर्थित नहीं हैं। और मैं या तो ldr r3 का उपयोग नहीं कर सकता, = # 0000ffff –

+1

आपको ldr r3, = # 0x0000ffff not = # 0000ffff लोड करना होगा। फिक्सअप असेंबलर द्वारा नीचे है। आप बस r3, # 255 - orr r3, r3, # 65280 –

+0

भी चला सकते हैं, मैं उस मान को रजिस्टर में नहीं डाल सकता। यह एक दिशा नहीं है, यह निरंतर है कि मैं v1 चर द्वारा दी गई स्थिति में स्मृति में स्टोर करना चाहता हूं (सी में निर्देश है: iowrite32 (v1, 0x0000FFFF)। संदेश है: वर्चुअल एड्रेस 0000ffff पर कर्नेल पेजिंग अनुरोध को संभालने में असमर्थ –