2012-06-21 9 views
5

मैं PowerPC विधानसभा के लिए नया हूँ। मैं एक एमपीसी 8245 (हाँ, पुराना स्कूल) के साथ काम कर रहा हूं। यह एक 603e परिवार प्रोसेसर है।PowerPC विधानसभा लोड तत्काल

मैं चाहते हैं पता करने के लिए एक लोड तत्काल अनुदेश जहां तत्काल 16-बिट मान 'अहस्ताक्षरित' है कैसे बनाते हैं।

उदाहरण: ली r3,0xFC10

जीसीसी पार संकलक, 4.4.5, मैं उपयोग कर रहा हूँ इस निर्देश की अनुमति नहीं है के रूप में मूल्य स्थिर हस्ताक्षरित नहीं है।

हाँ, मैं इस्तेमाल कर सकते हैं शून्य से 2-एस पूरक है, लेकिन इस पढ़ने और अधिक कठिन कोड का दस्तावेजीकरण बनाता है। डिवाइस रजिस्टरों के लिए बिट फ़ील्ड लोड करते समय, निर्देश में सटीक बिट फ़ील्ड पढ़ने के लिए बहुत आसान है।

+0

-1008 0xFC10 के समान 2 का पूरक प्रतिनिधित्व है।शायद आप लिख सकते हैं (0xfc10-0x10000)? –

+0

या मैन्युअल रूप से 0xFFFFFC10 पर साइन-इन करें? –

+0

@ टीसी - दिलचस्प। भले ही ली निर्देश केवल 16-बिट मान स्वीकार करता है, li r3,0xFFFFFC10 एक कानूनी निर्देश है। – KeithSmith

उत्तर

10

li एक छद्म-ऑपोड है जो वास्तव में addi निर्देश के रूप में अनुवाद करता है।

addi rD, rA, SIMMSIMMrA के लिए तत्काल हस्ताक्षर किए जोड़ता छोड़कर rD, में परिणाम रखने, जब rA क्षेत्र 0 है, जिस स्थिति में यह एक शाब्दिक 0 r0 के बजाय निर्दिष्ट करता है। li rD, SIMM वास्तव में addi rD, 0, SIMM है।

इस से 0 लोड हो रहा है मानों के लिए अच्छा है - 0x7fff और 0xffff8000 - एक रजिस्टर में 0xffffffff, लेकिन नहीं अन्य मूल्यों।

तत्काल बिटवाइज़ आपरेशन opcodes (ori आदि) एक अहस्ताक्षरित मूल्य के रूप में 16-बिट तत्काल क्षेत्र की व्याख्या करते हैं। हालांकि वे "r0 का मतलब है एक शाब्दिक 0" addi के व्यवहार नहीं है।

आप एक रजिस्टर में 0xfc10 की एक निरंतर लोड करने के लिए दो निर्देशों का उपयोग करने की आवश्यकता होगी: (, या lis के रूप में यदि आप एक मनमाना 32-बिट निरंतर के ऊपरी आधे लोड हो रहा है कर रहे थे) li का उपयोग कर 0 के साथ रजिस्टर लोड और फिर या ori के साथ हस्ताक्षरित 16-बिट मान में।

$ cat test.c 
unsigned int test(void) 
{ 
    return 0xfc10; 
} 
$ gcc -O2 -c test.c 
$ objdump -d test.o 

test.o:  file format elf32-powerpc 

Disassembly of section .text: 

00000000 <test>: 
    0: 38 60 00 00  li  r3,0 
    4: 60 63 fc 10  ori  r3,r3,64528 
    8: 4e 80 00 20  blr 
    c: 60 00 00 00  nop 
$ 

मैं नहीं लगता जीएनयू कोडांतरक स्वचालित रूप से दो निर्देश पैदा करने की किसी भी तरह से एक भी से इस तरह के एक मूल्य लोड करने के लिए है है:

यह वही है gcc परिस्थितियों में करता है ठीक है पावरपीसी के लिए इकट्ठा करते समय स्रोत निर्देश। आप (अहस्ताक्षरित) उच्च और निम्न 16-बिट एक निरंतर है, जैसे की हिस्सों को निकालने के लिए @h और @l प्रत्यय उपयोग कर सकते हैं हालांकि:

lis r3, [email protected]   /* => li r3, 0x1234  */ 
ori r3, r3, [email protected]  /* => ori r3, r3, 0x5678 */ 

आप इसका उपयोग एकपक्षीय निरंतर लोड करने के लिए अपने स्वयं के मैक्रो लिखने के लिए कर सकता है .. ।

$ cat test2.s 
     .macro load_const rD, const 
     .if (\const >= -0x8000) && (\const <= 0x7fff) 
     li  \rD, \const 
     .else 
     lis  \rD, \[email protected] 
     ori  \rD, \rD, \[email protected] 
     .endif 
     .endm 

     load_const r3, 0 
     load_const r4, 1 
     load_const r5, -1 
     load_const r6, 0x7fff 
     load_const r7, 0x8000 
     load_const r8, -32767 
     load_const r9, -32768 
     load_const r10, -32769 
     load_const r11, 0xfc10 

$ as -mregnames -o test2.o test2.s 
$ objdump -d test2.o 

test2.o:  file format elf32-powerpc 

Disassembly of section .text: 

00000000 <.text>: 
    0: 38 60 00 00  li  r3,0 
    4: 38 80 00 01  li  r4,1 
    8: 38 a0 ff ff  li  r5,-1 
    c: 38 c0 7f ff  li  r6,32767 
    10: 3c e0 00 00  lis  r7,0 
    14: 60 e7 80 00  ori  r7,r7,32768 
    18: 39 00 80 01  li  r8,-32767 
    1c: 39 20 80 00  li  r9,-32768 
    20: 3d 40 ff ff  lis  r10,-1 
    24: 61 4a 7f ff  ori  r10,r10,32767 
    28: 3d 60 00 00  lis  r11,0 
    2c: 61 6b fc 10  ori  r11,r11,64528 
$ 
+0

मैट - पूरी तरह से उत्तर के लिए धन्यवाद। मेरे द्वारा उपयोग किए जाने वाले निर्माण वातावरण में 'lwi' मैक्रो है। जीएसी द्वारा रिपोर्ट की गई त्रुटि 'li' के साथ एक हस्ताक्षरित मान का उपयोग करते समय त्रुटि "त्रुटि है: उपरोक्त वर्णित अनुसार सीमा के बाहर ऑपरेटिंग (0x00008000 0xffff8000 और 0x00007fff के बीच नहीं है)। – KeithSmith

0

तुम भी ऑपरेटर ori का उपयोग करके एक अहस्ताक्षरित 16-बिट तत्काल लोड सकता है, लेकिन पहले अपने रजिस्टर स्पष्ट करने के लिए सुनिश्चित हो:

xor r3, r3, r3 
ori r3, r3, 0xFC10 
संबंधित मुद्दे