beq

beq

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

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

विवरण

beq किसी प्रोग्राम को निर्णय लेने देता है। प्रोसेसर सामान्यतः निर्देशों को उसी क्रम में निष्पादित करता है जिस क्रम में वे सूची में दिखाई देते हैं। वह क्रम अपने आप कुछ भी चुन या दोहरा नहीं सकता। एक ब्रांच क्रम बदल देती है। यह किसी शर्त की जाँच करती है, और यदि शर्त सत्य होती है, तो प्रोसेसर अगली पंक्ति के बजाय किसी दूसरी जगह से आगे बढ़ता है। सभी if कथन और लूप ब्रांचों से बनते हैं।

उस दूसरी जगह का नाम एक लेबल से होता है, जो कोड में किसी स्थान को चिह्नित करने वाला कोलन के बाद लिखा नाम होता है, जैसे उदाहरण में लेबल done। beq (branch if equal) दो रजिस्टरों की तुलना करता है। जब उनमें समान मान होता है, तो यह लेबल वाले स्थान पर कूद जाता है; जब वे भिन्न होते हैं, तो निष्पादन अगले निर्देश के साथ जारी रहता है। इसका रूप नीचे दिया गया है।

beq rs1, rs2, label

beq केवल यह बदलता है कि आगे कौन-सा निर्देश चलेगा। किसी तुलना के हाँ या नहीं परिणाम को संख्या के रूप में संग्रहीत करने के लिए एक अलग निर्देश चाहिए, जिसका वर्णन slt पृष्ठ पर है।

प्रोसेसर अपनी स्थिति को program counter नामक रजिस्टर से ट्रैक करता है, जिसमें चल रहे निर्देश का पता होता है। ली गई ब्रांच उस पते को बदल देती है, इसलिए अगला निर्देश लेबल से आता है।

RISC-V मैनुअल कहता है कि एक सशर्त ब्रांच अपने ऑफ़सेट को 2 बाइट के गुणजों में गिना गया 12-बिट मान के रूप में संग्रहीत करती है। ऑफ़सेट को sign-extend किया जाता है और ब्रांच निर्देश के पते में जोड़ा जाता है, जिससे धन या ऋण 4 KiB की सीमा मिलती है, जहाँ एक KiB 1024 बाइट होता है। ब्रांच निर्देश सीधे दो रजिस्टरों की तुलना करते हैं और कोई condition code उपयोग नहीं करते। मैनुअल कारण बताता है कि संयुक्त compare-and-branch निर्देश एक नियमित pipeline में फिट हो जाता है और उसे कोई अतिरिक्त state या अस्थायी रजिस्टर नहीं चाहिए। यह सलाह भी देता है कि सॉफ़्टवेयर सबसे सामान्य पथ को सीधे कोड के रूप में रखे और अपेक्षा करे कि पीछे की ओर जाने वाली ब्रांचें taken के रूप में और आगे की ओर जाने वाली ब्रांचें not taken के रूप में predict की जाएँगी, कम से कम पहली बार मिलने पर।

एक ब्रांच दो रजिस्टरों की तुलना करती है और निर्देश में लिखे स्थिरांक को नहीं ले सकती, इसलिए beq t0, 5, label जैसा रूप मौजूद नहीं है। किसी रजिस्टर की तुलना स्थिरांक से करने के लिए, पहले स्थिरांक को li से एक रजिस्टर में लोड करें, फिर दोनों रजिस्टरों की तुलना करें।

li t1, 5
beq t0, t1, done

मान 0 को किसी लोड की आवश्यकता नहीं होती, क्योंकि रजिस्टर zero हमेशा उसे धारण करता है।

एक सामान्य उपयोग किसी रजिस्टर की तुलना zero से करता है, वह रजिस्टर जो हमेशा 0 धारण करता है, यह पूछने के लिए कि कोई मान शून्य तक पहुँच गया है या नहीं। यह उलटी गिनती वाले लूप समाप्त करता है और परिणामों की जाँच करता है। उदाहरण तब done पर ब्रांच करता है जब a0 शून्य तक उलटी गिनती कर चुका होता है। beq और लेबल किसी प्रोग्राम में हर निर्णय और लूप बनाने के लिए पर्याप्त हैं।

उदाहरण

beq a0, zero, done   # if a0 == 0, jump to 'done'