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