इस से 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
$
-1008 0xFC10 के समान 2 का पूरक प्रतिनिधित्व है।शायद आप लिख सकते हैं (0xfc10-0x10000)? –
या मैन्युअल रूप से 0xFFFFFC10 पर साइन-इन करें? –
@ टीसी - दिलचस्प। भले ही ली निर्देश केवल 16-बिट मान स्वीकार करता है, li r3,0xFFFFFC10 एक कानूनी निर्देश है। – KeithSmith