addi

addi

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

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

विवरण

addi एक रजिस्टर में एक स्थिरांक जोड़ता है। यह नाम add immediate का संक्षिप्त रूप है। एक immediate एक स्थिर मान होता है जो रजिस्टर से पढ़े जाने के बजाय निर्देश में ही लिखा जाता है। इसका उपयोग तब करें जब प्रोग्राम लिखते समय संख्याओं में से एक निश्चित हो, जैसे किसी काउंटर में 1 जोड़ना।

addi का रूप नीचे दिखाया गया है। यह स्रोत रजिस्टर rs1 में मान पढ़ता है, स्थिरांक imm जोड़ता है, और परिणाम को गंतव्य रजिस्टर rd में लिखता है।

addi rd, rs1, imm

अगली पंक्ति t0 को पढ़ती है, एक जोड़ती है, और परिणाम वापस लिखती है, इसलिए t0 = t0 + 1।

addi t0, t0, 1

स्थिरांक 12 बिट घेरता है और signed है, जिससे -2048 से 2047 तक की सीमा मिलती है। असेंबलर बड़े मानों को अस्वीकार कर देता है। बड़े स्थिरांक के लिए, पहले इसे li से एक रजिस्टर में लोड करें। एक ऋणात्मक स्थिरांक addi को घटाव भी बना देता है, यही कारण है कि RISC-V में अलग subtract-immediate निर्देश नहीं है। अगली पंक्ति उलटी गिनती करती है।

addi t0, t0, -1

RISC-V मैनुअल स्थिरांक को sign-extended 12-bit immediate कहता है। यह बताता है कि अंकगणितीय overflow को अनदेखा किया जाता है, इसलिए परिणाम केवल अपने निम्न XLEN बिट रखता है, जहाँ XLEN बिट में रजिस्टर की चौड़ाई है, यहाँ 32। जब स्थिरांक का चिह्न ज्ञात हो, तो जोड़ के बाद एक शाखा signed overflow की जाँच करती है। नीचे दी गई दो पंक्तियाँ एक धनात्मक स्थिरांक जोड़ने के सामान्य मामले को संभालती हैं।

addi t0, t1, +imm
blt t0, t1, overflow

प्रोग्राम addi का उपयोग काउंटरों के लिए, किसी पॉइंटर को अगले आइटम पर ले जाने के लिए और स्टैक पर जगह आरक्षित करने के लिए करते हैं। उदाहरण एक काउंटर को आगे बढ़ाने के लिए 1 जोड़ता है और 16 बाइट कार्यशील मेमोरी आरक्षित करने के लिए -16 जोड़ता है, जिस तरह से कार्यशील स्थान की आवश्यकता वाला फ़ंक्शन आमतौर पर शुरू होता है।

उदाहरण

addi t0, t0, 1     # t0++
addi sp, sp, -16   # reserve 16 bytes of stack