एच mmm, पता नहीं क्या हुआ, यह वास्तव में शुरू करने से पहले यह मेरा जवाब प्रस्तुत किया।
पहले मुझे नहीं लगता था कि मैं इसे केवल दो रजिस्टरों के साथ कर सकता हूं लेकिन फिर मैंने फैसला किया कि मैं कर सकता हूं और कर सकता हूं। ये समाधान केवल रजिस्टर हैं, कोई मेमोरी नहीं है (एलडीआर आर 0 के अलावा, = जिसे आप चार निर्देशों के साथ प्रतिस्थापित कर सकते हैं)। यदि आप मेमोरी और हम्म का उपयोग करते हैं, तो दो रजिस्ट्रार आप शायद निर्देशों की संख्या को घटा सकते हैं, str, bic, bic, ldrb, orr lsl, ldrb, orr lsl। ठीक है, मैंने इसे एक निर्देश में कम किया है, लेकिन फिर आपको मेमोरी लोकेशन और स्टोर्स और लागत चक्रों की आवश्यकता होती है ताकि मेमोरी के साथ मेमोरी और मेरे लिए अधिक चक्र हो सकें। किसी और के पास कुछ अच्छी चाल हो सकती है। मुझे लगता है कि कुछ नए कोरों में एंडियन स्वैप निर्देश है जो इसे और भी आसान बना देगा।
.globl midswap
midswap:
mov r2,r0,lsl #8 ;@ r2 = BBCCDDAA
mov r3,r0,lsr #8 ;@ r3 = DDAABBCC (this might drag a sign bit, dont care)
and r2,r2,#0x00FF0000 ;@ r2 = 00CC0000
and r3,r3,#0x0000FF00 ;@ r3 = 0000BB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACC00DD
orr r0,r0,r3 ;@ r0 = AACCBBDD
bx lr ;@ or mov pc,lr for older arm cores
.globl tworegs
tworegs:
mov r2,r0,ror #8 ;@ r2 = DDAABBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00AABBCC
bic r2,r2,#0x00FF0000 ;@ r2 = 0000BBCC
orr r2,r2,ror #16 ;@ r2 = BBCCBBCC
bic r2,r2,#0xFF000000 ;@ r2 = 00CCBBCC
bic r2,r2,#0x000000FF ;@ r2 = 00CCBB00
bic r0,r0,#0x00FF0000 ;@ r0 = AA00CCDD
bic r0,r0,#0x0000FF00 ;@ r0 = AA0000DD
orr r0,r0,r2 ;@ r0 = AACCBBDD
bx lr
testfun:
ldr r0,=0xAABBCCDD
bl midswap
उह कर देगा, है 32-बिट स्थिरांक का उपयोग कर, पहले उदाहरण में है कि नहीं? भ्रामक। – unwind
हां, ये 32 बिट स्थिरांक हैं, लेकिन यदि आप नज़दीक देखते हैं तो उनके पास केवल 8 लगातार बिट्स हैं जो उनके स्थिरांक में उपयोग किए जाते हैं। एआरएम 8 बिट्स कर सकता है, लेकिन इनकी स्थिति आसानी से उस स्थान पर घुमाया जा सकता है जहां आप चाहते हैं। असेंबलर आपके लिए स्थिरांक को एन्कोड करने के लिए पर्याप्त स्मार्ट है। –
किसी भी * यहां तक कि * आप चाहते हैं; 0x1fe उदाहरण के लिए तत्काल तत्काल नहीं है, लेकिन 0x3fc है। –