lhu

lhu

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

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

विवरण

lhu मेमोरी से एक हाफवर्ड (16 बिट, या 2 बाइट) पढ़ता है और उसे अनसाइन्ड मानता है। यह lh के साथ जोड़ी बनाता है, और दोनों में अंतर इस बात में है कि वे डेस्टिनेशन रजिस्टर के ऊपरी आधे हिस्से को कैसे भरते हैं। दोनों समान एड्रेसिंग के साथ 16 बिट पढ़ते हैं। हाफवर्ड और एड्रेसिंग फ़ॉर्म lh पेज पर शामिल हैं। lhu का फ़ॉर्म नीचे दिखाया गया है।

lhu rd, offset(rs1)

एक रजिस्टर 32 बिट रखता है, इसलिए 16-बिट लोड को ऊपरी 16 बिट भरने होते हैं। lh साइन बिट को उन पर कॉपी करता है, जिससे ऋणात्मक संख्याएँ ऋणात्मक बनी रहती हैं। lhu उन्हें 0s से भरता है, जिसे ज़ीरो एक्सटेंशन कहा जाता है, इसलिए परिणाम हमेशा गैर-ऋणात्मक होता है, 0 से 65535 तक। नाम में u अनसाइन्ड रीडिंग को दर्शाता है।

डेटा तय करता है कि किसका उपयोग करना है। ऐसे मानों के लिए lh चुनें जो ऋणात्मक हो सकते हैं और ऐसे मानों के लिए lhu जो कभी ऋणात्मक नहीं होते। बिट पैटर्न 0xFFFF lhu से लोड करने पर 65535 होता है, और वही बिट्स lh से लोड करने पर -1 होते हैं।

RISC-V मैनुअल lhu को मेमोरी से 16-बिट मान लोड करने और उसे rd में संग्रहीत करने से पहले 32 बिट तक ज़ीरो-एक्सटेंड करने के रूप में परिभाषित करता है। प्रभावी एड्रेस रजिस्टर rs1 plus साइन-एक्सटेंडेड 12-बिट ऑफ़सेट है।

अधिकांश 16-बिट डेटा अनसाइन्ड होता है। कुछ टेक्स्ट एन्कोडिंग में कैरेक्टर कोड, नेटवर्क डेटा में पोर्ट नंबर और चेकसम, 16-बिट पिक्सेल फ़ॉर्मेट और फ़ाइल फ़ॉर्मेट में लंबाई फ़ील्ड उदाहरण हैं। साइन एक्सटेंशन उनमें से किसी के लिए भी गलत मान देगा जब ऊपरी बिट सेट हो, इसलिए lhu सही लोड है। हाफवर्ड 2 बाइट की दूरी पर होते हैं, इसलिए उन पर लूप करते समय एड्रेस 2 से बढ़ता है।

उदाहरण

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)