मेमोरी: लोड और स्टोर
मेमोरी क्रमांकित भंडारण स्लॉट की एक बड़ी पंक्ति है, और प्रत्येक स्लॉट में एक बाइट (8 बिट) होता है। किसी स्लॉट की संख्या उसका पता होती है। रजिस्टर CPU के तेज़ स्लॉट का छोटा समूह हैं। मेमोरी बहुत बड़ी लेकिन धीमी होती है, और यह वह सब कुछ रखती है जो रजिस्टर में नहीं समाता, जैसे ऐरे और स्ट्रिंग। मेमोरी में किसी मान के साथ काम करने के लिए, आप उसे रजिस्टर में लोड करते हैं, बदलते हैं, और वापस स्टोर करते हैं।
रजिस्टर कम होते हैं और मेमोरी बड़ी होती है। (load word) एक शब्द को मेमोरी से रजिस्टर में कॉपी करता है, और (store word) उसे वापस कॉपी करता है। पता offset(register) के रूप में लिखा जाता है।
RISC-V मेमोरी बाइट-एड्रेस्ड है, इसलिए प्रत्येक बाइट का क्रम में अपना पता होता है। एक शब्द 32 बिट, या 4 बाइट का होता है, इसलिए अगले शब्द तक पहुँचने के लिए आप मेमोरी पॉइंटर को 4 से बढ़ाते हैं। यही कारण है कि ऐरे ऑफ़सेट 0, 4, 8, और इसी तरह होते हैं। वास्तविक हार्डवेयर पर, ऐसे पते से शब्द लोड करना जो 4 का गुणज नहीं है, धीमा हो सकता है या ट्रैप का कारण बन सकता है। यह सिम्युलेटर इसकी अनुमति देता है, लेकिन आपको शब्दों को 4 बाइट्स पर संरेखित रखने की आदत डालनी चाहिए।
lw t0, 0(a1) # t0 = पते a1 पर मेमोरीsw t0, 4(a1) # पते a1+4 पर मेमोरी = t0
offset(register) में, रजिस्टर में रखे पते में छोटी ऑफ़सेट संख्या जोड़ दी जाती है। 0(a1) a1 में ही मौजूद पता है, और 4(a1) उससे 4 बाइट आगे है। यह आपको बेस रजिस्टर बदले बिना आस-पास के मानों तक पहुँचने देता है।
| Address | Value |
|---|---|
| 0x100C | 0x00000000 |
| 0x1008 | 0x00000000 |
| 0x1004 | 0x00000000 |
| 0x1000 | 0x00000000 |
| 0x0FFC | 0x00000000 |
रजिस्टर और मेमोरी शून्य से शुरू होते हैं।
a0 वही रहता है। केवल निर्देश में लिखी गई शाब्दिक ऑफ़सेट बढ़ती है, जो अगले लक्ष्य मेमोरी पते की ओर बढ़ती है।
इस पैटर्न से मेल खाती मेमोरी बनाने के लिए, डेटा सेक्शन में .word (एक या अधिक 32-बिट मान) या .space N (N खाली बाइट) के साथ नामित मेमोरी आरक्षित करें। प्रत्येक शब्द 4 बाइट का होता है, इसलिए क्रमागत आइटम ऑफ़सेट 0, 4, 8 पर स्थित होते हैं, जो आपके स्टोर निर्देशों में उपयोग किए गए समान संख्याएँ हैं।डेटा सेक्शन में नामित मेमोरी आरक्षित करने के लिए .word (एक या अधिक 32-बिट मान) या .space N (N खाली बाइट) का उपयोग करें। प्रत्येक शब्द 4 बाइट लेता है, इसलिए क्रमागत आइटम ऑफ़सेट 0, 4, 8 और इसी तरह पर होते हैं।
.datanums: .word 10, 20, 30, 40 # चार वर्ड.textla t1, nums # t1 = ऐरे का पताli t2, 4 # गिनतीli t0, 0 # चालू योगloop:beq t2, zero, donelw t3, 0(t1) # मौजूदा तत्व लोड करता हैadd t0, t0, t3 # योग में जोड़ता हैaddi t1, t1, 4 # अगले वर्ड पर आगे बढ़ता है (4 बाइट्स)addi t2, t2, -1 # एक कम बचाj loopdone:mv a0, t0 # कुल योग प्रिंट करता है (100)li a7, 1ecallli a7, 10ecall
ऐरे का पता t1 में रखता है, t2 शेष 4 तत्वों की गिनती करता है, और t0 चालू योग रखता है। प्रत्येक चक्र में, लूप को रोक देता है जब कोई तत्व शेष नहीं रहता। उस तत्व को लोड करता है जिसकी ओर t1 इंगित करता है, उसे योग में जोड़ता है, पॉइंटर को एक शब्द आगे बढ़ाता है, और गिनती घटाता है। सभी चार तत्वों (10 + 20 + 30 + 40) के बाद, done 100 प्रिंट करता है।
