auipc

auipc

RISC-V असेंबली संदर्भ

lyszt.net auipc और अन्य RISC-V निर्देशों को अधिक विस्तार से कवर करता है।

एन्कोडिंग प्रारूप

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

विवरण

auipc का अर्थ है add upper immediate to PC। यह lui की तरह काम करता है, किसी मान के ऊपरी भाग के रूप में 20-बिट स्थिरांक लेता है। auipc उस मान को प्रोग्राम काउंटर में जोड़ता है, जिसमें वर्तमान में चल रहे निर्देश का पता होता है (beq पृष्ठ देखें)। परिणाम एक पता होता है जो स्मृति में इस निर्देश के स्थान के सापेक्ष मापा जाता है।

सापेक्ष पते एक वास्तविक समस्या का समाधान करते हैं। किसी प्रोग्राम को हमेशा यह नहीं पता होता कि उसे स्मृति में कहाँ लोड किया जाएगा। जो कोड अपने डेटा को निश्चित निरपेक्ष पतों से संदर्भित करता है, वह कहीं और लोड होने पर विफल हो जाता है। जो कोड वर्तमान निर्देश के सापेक्ष पते की गणना करता है, वह जहाँ भी रखा जाए वहाँ काम करता है। इस गुण को स्थिति स्वतंत्रता कहा जाता है।

auipc ऐसे पते का मोटा भाग प्रदान करता है, और उसके बाद का निर्देश बारीक 12-बिट शेष जोड़ता है। la निर्देश, जो किसी लेबल का पता लोड करता है, इस जोड़ी से बनता है, और दूर के फ़ंक्शनों के कॉल भी।

RISC-V मैनुअल कहता है कि वर्तमान pc auipc के स्थिरांक को 0 पर सेट करके प्राप्त किया जा सकता है। auipc के बाद jalr किसी भी 32-बिट pc-सापेक्ष पते पर नियंत्रण स्थानांतरित कर सकता है, और auipc के बाद 12-बिट ऑफ़सेट वाला लोड या स्टोर किसी भी 32-बिट pc-सापेक्ष डेटा पते तक पहुँच सकता है।

la और call इसलिए मौजूद हैं ताकि आपको auipc हाथ से न लिखना पड़े, और यह सिम्युलेटर के ट्रेस और डिसअसेंबल किए गए कोड में अक्सर दिखाई देता है। auipc के बाद छोटे ऑफ़सेट वाला निर्देश, जो मिलकर एक पता बनाते हैं, पहचानने योग्य उपयोगी पैटर्न है।

उदाहरण

auipc t0, 1      # t0 = pc + 0x1000