2010-05-06 17 views
7

पर बैंक किए गए रजिस्ट्रारों की स्पष्ट रूप से पहुंच एआरएम मैनुअल के अनुसार, उदाहरण के लिए, "r13_svc" के रूप में, एक विशिष्ट CPU मोड के लिए बैंकर रजिस्टरों तक पहुंचना संभव होना चाहिए। जब मैं करने की कोशिश इस जीसीसी निम्न त्रुटि के साथ मुझे चिल्लाता:एआरएम

तत्काल अभिव्यक्ति एक # उपसर्ग की आवश्यकता है - `mov r2, sp_svc '

क्या गलत है?

अद्यतन। ARMv5 और ARMv6 के लिए एआरएम वास्तुकला संदर्भ मैनुअल से निम्न पाठ मुझे विश्वास है कि यह संभव है, अनुभाग A2.4.2 नेतृत्व:

Registers R13 and R14 have six banked physical registers each. One is used in User and System modes, and each of the remaining five is used in one of the five exception modes. Where it is necessary to be specific about which version is being referred to, you use names of the form: R13_mode R14_mode where mode is the appropriate one of usr, svc (for Supervisor mode), abt, und, irq and fiq.

उत्तर

3

मुझे लगता है कि mov अनुदेश के साथ संभव है नहीं लगता है; कम से कम एआरएम आर्किटेक्चर संदर्भ मैनुअल के अनुसार मैं पढ़ रहा हूँ। आपके पास क्या दस्तावेज़ है? ldm का एक संस्करण है जो उपयोगकर्ता मोड रजिस्टरों को विशेषाधिकृत मोड से लोड कर सकता है (^ का उपयोग करके)। आपका एकमात्र अन्य विकल्प एसवीसी मोड में स्विच करना है, mov r2, sp करें, और उसके बाद आप जिस भी अन्य मोड का उपयोग कर रहे थे उसे वापस स्विच करें।

त्रुटि आपको मिलने वाला है, क्योंकि यह sp_svc समझ में नहीं है, इसलिए इसे लगता है कि एक तत्काल mov है, जो दिखाई देगा करने के लिए कोशिश कर रहे हैं:

mov r2, #0x14 

तो इसलिए यह कहते हैं, " एक # उपसर्ग की आवश्यकता है "।

+0

मैं इसे समझता हूं। कृपया एआरएम आर्किटेक्चर रेफरेंस मैनुअल – Demiurg

+2

@ डेमियर्ग से पाठ के संबंध में ऊपर दिए गए अपडेट को देखें, यह अनुच्छेद केवल दस्तावेज़ के सम्मेलनों के लिए कोड लिखने का जिक्र नहीं कर रहा है। चूंकि बैंक किए गए रजिस्ट्रार अलग हैं, इसलिए उनके पास अद्वितीय नाम होना चाहिए ताकि सभी भ्रमित न हों। यह यह इंगित करने की कोशिश नहीं कर रहा है कि आप उन नामों का उपयोग अपने असेंबली कोड में कर सकते हैं। किताब में बाद में निर्देश संदर्भ और संबोधित मोड अनुभाग स्पष्ट है कि आप क्या कर सकते हैं और क्या नहीं कर सकते हैं। –

+0

आप शायद – Demiurg

2

आप सीपीएसआर में बिट्स को बदलकर मोड बदलने के लिए एमआरएस और एमएसआर का उपयोग करते हैं तो सामान्य रूप से आर 13 का उपयोग करें।

हाथ बांह

 
MRS R0,CPSR 
BIC R0,R0,#0x1F 
ORR R0,R0,#0x13 
MSR CPSR_c,R0 

तब से

 
mov sp,#0x10000000 

या आप तत्काल

 
ldr sp,=0x12345600 

में या यदि आप कोडांतरक अपने डेटा रखने चाहते हैं अधिक बिट की आवश्यकता है, आप इसे स्वयं रख सकते हैं।

 
ldr sp,svc_stack 
b 1f 
svc_stack: .word 0x12345600 
1: 

आप ठेठ हाथ स्टार्टअप कोड दिखाई देगा, जहां आवेदन बीच में आता है समर्थन करने के लिए जा रहा है, रोकता और अन्य अपवाद भी परिवर्तन मोड अपने ढेर संकेत के सभी कि आप की आवश्यकता करने जा रहे हैं, स्थापित करने के लिए, सेट एसपी, परिवर्तन मोड, एसपी सेट करें, बदलें मोड ...

+0

हैं यदि आप किसी मूवी के लिए निर्देश एन्कोडिंग देखते हैं, तो गंतव्य रजिस्टर के लिए चार बिट्स हैं, केवल 0xD (r13 या sp) के लिए पर्याप्त हैं। यदि आप मोड निर्दिष्ट कर सकते हैं तो 6 अलग-अलग स्पैम रजिस्ट्रारों को आपको निर्देश में 3 और बिट्स की आवश्यकता होती है, मैं उन बिट्स को नहीं देखता हूं, इसलिए सीपीएसआर संशोधन का उपयोग करके सीपीएसआर को बदलने के निर्देश में मोड निर्दिष्ट करने का कोई तरीका नहीं है निर्देश (एमएसआर)। ध्यान दें कि विभिन्न असेंबलरों (हाथ, जीसीसी, आदि) एमएसआर/एमआरएस और एमआरसी/एमसीआर निर्देशों के लिए विभिन्न वाक्यविन्यास का उपयोग करते हैं। तो बांह हाथ वाक्यविन्यास हाथ की संभावना जीसीसी नहीं है। –

+0

धन्यवाद। आपके द्वारा पोस्ट किया गया कोड शायद चाल करेगा। मुझे विश्वास था कि इन रजिस्टरों तक पहुंचना संभव है, निम्नलिखित पाठ है: रजिस्टर्स आर 13 और आर 14 में छह बैंकर भौतिक रजिस्ट्रार हैं ... जहां विशिष्ट होना चाहिए किस संस्करण को संदर्भित किया जा रहा है , आप फॉर्म के नामों का उपयोग करते हैं: R13_ R14_ जहां यूएसआर, एसवीसी (पर्यवेक्षक मोड के लिए), abt, und, irq और fiq में उपयुक्त है। एआरएम आर्किटेक्चर रेफरेंस मैनुअल से । – Demiurg

+0

हम्म, यह बांह हाथ में एक बहुत ही भ्रमित खंड है, मैं समझ नहीं पा रहा हूं कि वे क्या कह रहे हैं। शायद उनके असेंबलर आपके लिए निर्देश जोड़ते हैं, सिवाय इसके कि शायद केल evals मैं अब हाथ उपकरण तक पहुंच नहीं है। उस अनुभाग में रजिस्टर बैंकिंग से संबंधित armv6 के बारे में कुछ विशेष बात है और यह दिखाता है कि मैंने "armv6 से पहले आर्कटेक्चर संस्करणों" से शुरू होने से ऊपर क्या दिखाया है। यदि r13_svc, r13_sys, आदि किसी भी निर्देश पर उपलब्ध थे क्योंकि इसका तात्पर्य है तो प्रत्येक निर्देश को इसके एनकोडिंग में स्थान की आवश्यकता होगी और अगर armv6 के बारे में एन्कोडिंग में एक नोट की आवश्यकता होगी ... –

5

इसके लिए सही वाक्यविन्यास mrs r2,sp_svc या mrs r3, sp_usr है। यह एक नया armv7 एक्सटेंशन है। कोड एआरएम लिनक्स केवीएम स्रोत फ़ाइल interrupt_head.S में देखा जा सकता है। मैथ्यू ग्रेटटन-डैन द्वारा गैस इस instruction support के लिए binutils पैच। इसके लिए वर्चुअलाइजेशन सीमा की आवश्यकता है जितनी मैं समझता हूं।

जो मैं समझता हूं उसके अनुसार, एलपीएई (बड़ा भौतिक पता विस्तार) वर्चुअलाइजेशन सीमाओं का तात्पर्य है। तो कॉर्टेक्स-ए 7, कॉर्टेक्स-ए 12, कॉर्टेक्स-ए 15, और कॉर्टेक्स-ए 17 इस एक्सटेंशन का उपयोग करने में सक्षम हो सकते हैं। हालांकि, कॉर्टेक्स-ए 5, कॉर्टेक्स-ए 8, और कॉर्टेक्स-ए 9 नहीं कर सकते हैं।शिक्षा पर

प्रलेखन ARMv7a TRM revC में पाया जा सकता, धारा B9.3.9 श्रीमती (बैंकिंग रजिस्टर)

अन्य कॉर्टेक्स-ए (और एआरएमवी 6) सीपीयू के लिए आप मोड स्विच करने के लिए cps निर्देश का उपयोग कर सकते हैं और बैंक किए गए रजिस्टर को एक गैर-बैंक किए गए रजिस्टर (R0-R7) में स्थानांतरित कर सकते हैं और फिर वापस स्विच कर सकते हैं। स्पष्ट कठिनाई उपयोगकर्ता मोड के साथ है। इसे संभालने का सही तरीका ldm rN, {sp,lr}^ के साथ है; उपयोगकर्ता मोड के पास विशेषाधिकार प्राप्त मोड पर कोई आसान तरीका नहीं है।

सभी पुराने CPUs के लिए, ड्वेल द्वारा दी गई जानकारी काम करेगी। मुख्य रूप से, मोड बदलने के लिए mrs/msr का उपयोग करें।

संदर्भ स्विचिंग के लिए यह एक महत्वपूर्ण निर्देश है (जो वीएम बहुत कुछ करता है)।

+0

नए बिनटिल्स त्रुटि देते हैं * त्रुटि: बैंक किए गए रजिस्ट्रार इस आर्किटेक्चर के साथ उपलब्ध नहीं हैं। * जब आप संकलक/असेंबलर सीपीयू झंडे के साथ निर्देश का प्रयास करते हैं जो एलपीएई का समर्थन नहीं करते हैं। –

संबंधित मुद्दे