sh

sh

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

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

विवरण

sh मेमोरी में एक हाफवर्ड, 16 बिट या 2 बाइट, लिखता है। यह lh और lhu लोड्स से मेल खाता है और उस संकरे आकार को संग्रहीत करता है जहाँ sw पूरा वर्ड संग्रहीत करता है। इसका रूप नीचे दिखाया गया है। यह स्रोत रजिस्टर rs2 में मान लेता है और उसके निम्नतम 16 बिट को आधार रजिस्टर rs1 के पते प्लस ऑफ़सेट पर लिखता है। लेआउट sw से मेल खाता है, जिसमें स्रोत रजिस्टर पहले नामित होता है।

sh rs2, offset(rs1)

एक रजिस्टर 32 बिट रखता है और केवल 16 संग्रहीत होते हैं, इसलिए sh निम्नतम 16 रखता है और ऊपरी 16 गिरा देता है। स्टोर्स में साइन्ड या अनसाइन्ड का कोई विकल्प नहीं होता। वह विकल्प लोड्स का है, जहाँ एक संकरे मान को रजिस्टर भरने के लिए चौड़ा करना पड़ता है और गुम बिट्स के लिए एक नियम चाहिए। एक स्टोर मान को संकरा करता है, और निम्न बिट्स रखना ही एकमात्र व्यवहार है जो तर्कसंगत है। यदि रजिस्टर में 16 बिट के लिए बहुत बड़ा मान है, तो अतिरिक्त बिट्स बिना किसी चेतावनी के खो जाते हैं, इसलिए संग्रहीत करने से पहले रेंज जाँचें।

RISC-V मैनुअल कहता है कि sh रजिस्टर rs2 के निम्न 16 बिट को rs1 के पते प्लस साइन-एक्सटेंडेड 12-बिट ऑफ़सेट पर मेमोरी में संग्रहीत करता है। सम पतों पर हाफवर्ड स्टोर्स प्राकृतिक रूप से अलाइन्ड होते हैं और कभी अलाइनमेंट त्रुटि नहीं उठाते। ऐसे पते पर स्टोर जो प्राकृतिक रूप से अलाइन्ड नहीं है, वैसा व्यवहार करता है जैसा निष्पादन वातावरण परिभाषित करता है, और मैनुअल कहता है कि यह अत्यंत धीमी गति से चल सकता है।

sh हर 16-बिट प्रारूप लिखता है जिसे lh और lhu वापस पढ़ते हैं, जैसे ऑडियो सैंपल, 16-बिट पिक्सेल डेटा और हाफवर्ड एरे। एक सामान्य पैटर्न है पढ़ना, संशोधित करना और लिखना। lhu से एक हाफवर्ड लोड करें, रजिस्टर में उसे समायोजित करें और sh से वापस संग्रहीत करें। केवल लक्षित 2 बाइट्स बदलते हैं और उनके आसपास के बाइट्स वैसे ही रहते हैं। हाफवर्ड्स 2 बाइट की दूरी पर होते हैं, इसलिए लूप्स पते को 2 से बढ़ाते हैं।

उदाहरण

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5