jal

jal

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

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

विवरण

jal एक फ़ंक्शन को कॉल करता है। एक फ़ंक्शन निर्देशों का एक नामित ब्लॉक होता है जो कई स्थानों से चल सकता है और फिर वापस लौट सकता है, इसलिए तर्क एक बार लिखा जाता है और कहीं भी उपयोग किया जाता है। किसी फ़ंक्शन को कॉल करने के लिए दो चीज़ें चाहिए। प्रोग्राम वहाँ कूदता है जहाँ फ़ंक्शन है, और यह याद रखता है कि यह कहाँ से आया है ताकि बाद में वापस जा सके। jal दोनों करता है, और इसका नाम jump and link है।

जंप एक लेबल पर जाता है जो फ़ंक्शन को चिह्नित करता है। लिंक भाग जंप से पहले होता है। jal अगले निर्देश का पता, जो कॉल के ठीक बाद वाला है, एक रजिस्टर में सहेजता है। फ़ंक्शन उस सहेजे गए पते का उपयोग वापस लौटने के लिए करता है।

परंपरा के अनुसार सहेजा गया पता ra नामक रजिस्टर में जाता है, जो return address के लिए है। नीचे दी गई पंक्ति square फ़ंक्शन पर कूदती है और ra में वापस लौटने का पता छोड़ देती है।

jal ra, square

जब फ़ंक्शन समाप्त होता है, तो यह ra में मौजूद पते पर कूदकर वापस लौटता है, जो ret निर्देश करता है। उसी कॉल के लिए सामान्य संक्षिप्त रूप नीचे दिखाया गया है।

call square

RISC-V मैनुअल कहता है कि जंप ऑफ़सेट 2 बाइट्स के गुणजों में गिना जाता है, साइन-एक्सटेंड किया जाता है और जंप निर्देश के पते में जोड़ा जाता है। यह प्लस या माइनस 1 MiB की सीमा देता है, जहाँ एक MiB 1,048,576 बाइट्स है। jal अगले निर्देश का पता, जो pc प्लस 4 है, rd में संग्रहीत करता है। मानक सॉफ़्टवेयर कॉलिंग कन्वेंशन x1 को रिटर्न एड्रेस रजिस्टर और x5 को वैकल्पिक लिंक रजिस्टर के रूप में उपयोग करता है। बिना शर्त जंप निर्देश pc-सापेक्ष एड्रेसिंग का उपयोग करते हैं, जो पोज़िशन-इंडिपेंडेंट कोड का समर्थन करता है, यानी ऐसा कोड जो मेमोरी में जहाँ भी लोड हो वहाँ काम करता है।

एक jal ra को नए रिटर्न एड्रेस से अधिलेखित कर देता है। यदि कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है, तो आंतरिक कॉल बाहरी कॉल के सहेजे गए पते को बदल देती है। जो फ़ंक्शन स्वयं कॉल करता है उसे पहले ra सहेजना होगा और वापस लौटने से पहले उसे पुनर्स्थापित करना होगा। उदाहरण square को कॉल करता है और रिटर्न एड्रेस ra में छोड़ देता है।

उदाहरण

jal ra, square   # call square; ra holds the return address