jalr

jalr

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

lyszt.net jalr और अन्य 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

विवरण

jalr jal के समान परिवार का है, जिसमें r का अर्थ रजिस्टर है। दोनों निर्देश जंप करते हैं और रिटर्न एड्रेस संग्रहीत करते हैं, जैसा कि jal पृष्ठ पर वर्णित है। अंतर जंप लक्ष्य का है। jal प्रोग्राम लिखे जाते समय निर्धारित लेबल पर जंप करता है, जबकि jalr रजिस्टर में रखे एड्रेस पर जंप करता है, जिससे गंतव्य को रन टाइम पर गणना किया जा सकता है।

यही कारण है कि एक फ़ंक्शन वापस लौट सकता है। कॉलर ra रजिस्टर में रिटर्न एड्रेस डालता है, और फ़ंक्शन ra में एड्रेस तक पहुँचने के लिए jalr का उपयोग करके वापस जंप करता है। ret निर्देश ra पर एक jalr है।

यही क्षमता तब लागू होती है जब गंतव्य पहले से अज्ञात हो। यह उस फ़ंक्शन को कॉल करने को कवर करता है जिसका एड्रेस पास किया गया था, और एड्रेस की तालिका में सूचीबद्ध रूटीनों के बीच चयन को, जिस तरह एक बड़ा switch स्टेटमेंट या इंटरप्रेटर डिस्पैच करता है।

RISC-V मैनुअल के अनुसार, jalr साइन-एक्सटेंडेड 12-बिट इमीडिएट को रजिस्टर rs1 में जोड़ता है, फिर परिणाम के सबसे कम महत्वपूर्ण बिट को साफ़ करता है। यह अगले निर्देश का एड्रेस, pc प्लस 4, rd में संग्रहीत करता है, और जब रिटर्न एड्रेस की आवश्यकता न हो तो x0 गंतव्य के रूप में काम कर सकता है। lui के बाद jalr किसी भी 32-बिट एब्सोल्यूट एड्रेस तक पहुँचता है, और auipc के बाद jalr किसी भी 32-बिट pc-रिलेटिव एड्रेस तक पहुँचता है। यदि लक्ष्य एड्रेस चार-बाइट सीमा पर संरेखित नहीं है तो दोनों जंप निर्देश अपवाद उत्पन्न करते हैं।

jalr का प्रारूप नीचे दिखाया गया है। यह रजिस्टर rs में एड्रेस पर एक वैकल्पिक छोटे ऑफ़सेट के साथ जंप करता है, और रिटर्न एड्रेस को rd में संग्रहीत करता है।

jalr rd, rs, offset

jal की तरह, यह जिस रजिस्टर को लिखता है वह अधिलेखित हो जाता है, इसलिए ra को संरक्षित करने की वही सावधानी लागू होती है।

उदाहरण

la t0, target
jalr ra, t0, 0   # jump to target; ra holds the return address