2012-08-02 14 views
21

को बहुत ही सरल एआरएम निर्देश परिवर्तित मैं this page साथ ही विभिन्न अन्य गाइड का उपयोग करने के यह पता लगाने की कैसे द्विआधारी और हेक्स के रूप में बहुत ही सरल एआरएम निर्देश व्यक्त करने के लिए कोशिश कर रहा हूँ। ऐसा लगता है कि यह मेरे लिए एक सीधी प्रक्रिया होनी चाहिए, लेकिन मुझे अभी भी समझ में नहीं आता है। यहां कुछ उदाहरण दिए गए हैं।द्विआधारी/हेक्स

बेसिक एनओपी:

 what goes here?   what goes here? 
      _↓_     _____↓____ 
      | |    |   | 
mov r0, r0 ; ????00?1101????????????????????? 
         |__||__| 
          ↑ ↑ 
       how do I express registers? 

दूसरों के लिए एक ही मूल प्रश्न।

मुकाबले दो रजिस्टरों:

cmp r1, r0 

मूल्य रजिस्टर करने के लिए तत्काल जोड़ना:

add r0, #0x1a 

इन ट्यूटोरियल की सभी ऑनलाइन इस तरह के निर्देशों का उपयोग करने के लिए कैसे का वर्णन करने में उत्कृष्ट रहे हैं, लेकिन कोई भी मैं कर पाए हैं वास्तव में एक एआरएम निर्देश को बाइनरी/हेक्स/मशीन कोड में परिवर्तित करने के तरीके के माध्यम से चलने के लिए, जिसमें इसे इकट्ठा किया जाता है।

आपकी मदद के लिए अग्रिम धन्यवाद।

+2

शानदार प्रश्न; दुर्भाग्य से लिंक मर चुका है। लोगों द्वारा गुजरने के लिए, यहां एक त्वरित [वेब संग्रह लिंक] है (https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu

उत्तर

29

यहाँ कैसे डाटा प्रोसेसिंग निर्देश कोडित रहे हैं:

ARM data processing instructions

आप तुम्हारा उस पृष्ठ में हालत कोड तालिका है। 00001111 के माध्यम से रजिस्टरों को कोड किया गया है।

आपके सभी उदाहरण एक ही श्रेणी के अंतर्गत आते हैं। तस्वीर को मेरे एचडीडी पर कुछ दस्तावेज़ों से निकाला गया है, लेकिन मैं इसे google तक ढूंढने में भी कामयाब रहा। उन निर्देशों को कोड करना एक कठिन काम है।

तो, mov r0, r0 इस तरह जाना चाहिए:

1110 00 0 0 1101 0000 0000 00000000 

मैं 0 आर एन डाल दिया, क्योंकि यह वास्तव में MOV पर लागू नहीं है। CMP के मामले में, मेरा मानना ​​है कि, S हमेशा 1.

5

आपको एआरएम एआरएम की प्रति प्राप्त करनी चाहिए, यह सभी निर्देशों के लिए एन्कोडिंग का वर्णन करती है।

अधिकांश एआरएम-निर्देश एक सशर्त कोड के लिए ऊपरी 4 बिट्स का उपयोग करते हैं। यदि आप सशर्त रूप से निर्देश नहीं चलाना चाहते हैं तो बस छद्म-स्थिति AL (1110) का उपयोग करें।

एन्कोडिंग में पहला रजिस्टर (आरएन) एमओवी-निर्देश के लिए उपयोग नहीं किया जाता है और इसे एआरएम एआरएम द्वारा परिभाषित 0000 पर सेट किया जाना चाहिए।

दूसरा रजिस्टर गंतव्य, यहाँ आप सिर्फ रजिस्टर नंबर सांकेतिक शब्दों में बदलना है, तो आपके मामले में यह भी 0000 हो क्योंकि आप एक destinal रूप r0 उपयोग कर रहे हैं, r4 के लिए यह होगा 0100.

होता है शेष तथाकथित शिफ्ट ऑपरेंड है जो बहुत लचीला है। यह आपके मामले में एक साधारण रजिस्टर हो सकता है (आर 0) तो यह केवल 0000 0000 0000 है जहां अंतिम 4 बिट्स फिर से रजिस्टर को एन्कोड करते हैं। यह विभिन्न प्रकार की बदलावों को भी एन्कोड कर सकता है और डेटा प्रोसेसिंग के लिए रजिस्टर या तत्काल मूल्यों के साथ घूमता है।

मगर यह भी एक तत्काल जहां 8 बिट नीचे बिट और पहले 4 बिट्स में इनकोड किया जा सकता है एक सही 2 बिट चरणों में बारी बारी से परिभाषित करते हैं। इस मामले में bit25 भी 1 होगा, अन्य सभी मामलों में यह 0

+5

एआरएम एआरएम एक है मजेदार संक्षिप्त नाम, लेकिन इसके लिए Google खोज करना बहुत मुश्किल है। विस्तार 'एआरएम आर्किटेक्चर रेफरेंस मैनुअल' है, और वे उपलब्ध हैं [यहां] (http://infocenter.arm.com/help/topic/com.arm.doc.subset.architecture.reference/index.html#reference) एक मुफ्त पंजीकरण के बाद। –

+0

@ केविन नहीं, विस्तार वास्तव में ** उन्नत है (निर्देश सेट कंप्यूटिंग कम करें) मशीन आर्किटेक्चर संदर्भ मैनुअल **। लेकिन यह एक अच्छी गूगल खोज नहीं है :) –

9

सबसे पहले, आपको infocenter.arm.com पर संदर्भ एआरएम आर्किटेक्चरल रेफरेंस मैनुअल (एआरएम एआरएम) की आवश्यकता है, संदर्भ मैनुअल, सबसे पुराना प्राप्त करें (armv5 जो कुछ भी)। निर्देश सेट अच्छी तरह से परिभाषित किया गया है।

दूसरा, आप कुछ निर्देश क्यों इकट्ठा नहीं करते हैं और देखते हैं कि क्या होता है?

;@test.s 
cmp r1, r0 
add r0, #0x1a 

जो कुछ भी पार कोडांतरक आप (एक स्क्रिप्ट के लिए निर्माण जीसीसी निर्देशिका में http://github.com/dwelch67/raspberrypi देखते हैं, सिर्फ इतना है कि स्क्रिप्ट में binutils के माध्यम से चल)

arm-none-linux-gnueabi-as test.s -o test.o 
arm-none-linux-gnueabi-objdump -D test.o 

हाथ-नन-linux-gnueabi arm- बनाम कोई-योगिनी, बनाम हाथ-योगिनी आदि इस बात के लिए कोई फर्क न, सभी एक ही

Disassembly of section .text: 

00000000 <.text>: 
    0: e1510000 cmp r1, r0 
    4: e280001a add r0, r0, #26 

शीर्ष चार एक पूर्ण 32 बिट हाथ अनुदेश (अंगूठे नहीं) हालत कोड हैं के टुकड़े करना, क्षेत्र हालत देख एआरएम एआरएम में खंड। एक 0xE हमेशा मतलब है, हमेशा इस निर्देश को निष्पादित करें। 0b0000 eq केवल तभी निष्पादित होता है जब ज़ेड ध्वज सेट किया गया हो, 0b0001 ne केवल निष्पादित करता है यदि ज़ेड स्पष्ट है, आदि

एआरएम एआरएम में हाथ निर्देश सेट में धक्का, फिर हाथ निर्देशों की वर्णमाला सूची, फिर cmp खोजें cond 00I10101 आरएन sbz shifter

ऊपर हमारे सीएमपी निर्देश से हम 1110 000101010001 देखते हैं ... तो मैं शून्य बिट्स 15:12 शून्य बिट्स 27:26 शून्य हैं और 24:21 1010 हैं इसलिए यह एक सीएमपी है निर्देश

ऊपर 1 9 से 16 बिट्स 0 बी 001 हैं जो एआरएम एआरएम में शिफ्ट ऑपरेंड के लिए आरएन = आर (1) आरएन = आर (1) है, यह आपको एड्रेसिंग मोड 1 डाटा प्रोसेसिंग ऑपरेटरों को देखने के लिए कहता है और पीडीएफ में एक लिंक है पृष्ठ

हम जानते हैं कि हम दूसरे संकार्य बस एक रजिस्टर होना चाहता हूँ, कि डाटा प्रोसेसिंग ऑपरेंड कहा जाता है - रजिस्टर, और एक पृष्ठ संख्या, उस पृष्ठ 15:12 rd है पर कि पृष्ठ पर जाने के 11: 4 शून्य और 3 हैं : 0 आरएम है। हम सीएमपी निर्देश से जानते हैं कि यह कहता है कि 15:12 शून्य होना चाहिए, मुझे आश्चर्य है कि यह परवाह करता है, एक सीएमपी एक रजिस्टर के परिणाम को संग्रहित नहीं करता है, इसलिए इसका उपयोग नहीं किया जाता है। rm प्रयोग किया जाता है और इस मामले में हम r0 चाहते हैं, तो 3 में 0b0000 चला जाता है: 0 यह भी ध्यान रखें कि यह बिट्स 27:25 से पता चलता के रूप में शून्य, सीएमपी अनुदेश 25 मैं है में, अब हम जानते हैं कि हम एक शून्य वहाँ बहुत

चाहते

सीएमपी पेज और इस डाटा प्रोसेसिंग के बीच - रजिस्टर पेज हम पूरी तस्वीर

1110 condition 
000 
1010 opcode 
1 S (store flags, that is a 1 for a cmp to be useful) 
0001 rn 
0000 rd/dont care/sbz 
00000 
000 
0000 rm 

cmp rn,rm 
cmp r1,r0 

ऐड समान है, लेकिन एक तत्काल का उपयोग करता है, इसलिए निर्देश के अल्फा सूची में जोड़ने के निर्देश पर जाएं। अब हम सीएमपी से जानते हैं कि निर्देश के इस वर्ग के लिए 24:21 ओपोड है, हम वहां से

पर जारी रखने के लिए सीधे शिफ्टर ऑपरेंड सामान पर जा सकते हैं, इस बार हम rd, rn, # तत्काल जोड़ रहे हैं

तो #immediate

के लिए पेज के लिए देखो और एन्कोडिंग

1110 condition, always 
001 (note the immediate bit is set) 
0100 (opcode for add for this type of instruction) 
0 (S not saving the flags, it would be adds r0,r0,#26 for that) 
0000 (rn = r0) 
0000 (rd = r0) 

अब आता है दिलचस्प हिस्सा है, हम 26 अलग अलग तरीकों से सांकेतिक शब्दों में बदलना कर सकते हैं।बिट 7: 0 तत्काल हैं और बिट्स 11: 8 तत्काल घुमाए जाने की अनुमति देते हैं, 26 0x1A है, हम केवल 0x1A को निचले 8 बिट्स में डाल सकते हैं और घुमाव को 0 पर सेट कर सकते हैं, और यही वह है जो gnu assembler ने किया था। शायद निचले 8 बिट्स में 0x68 डाल सकता है और rotate_imm फ़ील्ड में एक 1 1101000 घुमाए गए दाएं 1 * 2 बिट्स 11010 = 0x1A = 26.