मेमोरी: लोड और स्टोर

मेमोरी: लोड और स्टोर

मेमोरी क्रमांकित भंडारण स्लॉट की एक बड़ी पंक्ति है, और प्रत्येक स्लॉट में एक बाइट (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 बाइट आगे है। यह आपको बेस रजिस्टर बदले बिना आस-पास के मानों तक पहुँचने देता है।

मेमोरी में संग्रहीत करना
CPU
li t0, 0x11111111
li t1, 0x22222222
li a0, 0x1000
sw t0, 0(a0)
sw t1, 8(a0)
Registers
t00x00000000
t10x00000000
a00x00000000
Random Access Memory (RAM)
AddressValue
0x100C0x00000000
0x10080x00000000
0x10040x00000000
0x1000
0x00000000
0x0FFC0x00000000

रजिस्टर और मेमोरी शून्य से शुरू होते हैं।

एनिमेशन में, बेस रजिस्टर a0 वही रहता है। केवल निर्देश में लिखी गई शाब्दिक ऑफ़सेट बढ़ती है, जो अगले लक्ष्य मेमोरी पते की ओर बढ़ती है। इस पैटर्न से मेल खाती मेमोरी बनाने के लिए, डेटा सेक्शन में .word (एक या अधिक 32-बिट मान) या .space N (N खाली बाइट) के साथ नामित मेमोरी आरक्षित करें। प्रत्येक शब्द 4 बाइट का होता है, इसलिए क्रमागत आइटम ऑफ़सेट 0, 4, 8 पर स्थित होते हैं, जो आपके स्टोर निर्देशों में उपयोग किए गए समान संख्याएँ हैं।

डेटा सेक्शन में नामित मेमोरी आरक्षित करने के लिए .word (एक या अधिक 32-बिट मान) या .space N (N खाली बाइट) का उपयोग करें। प्रत्येक शब्द 4 बाइट लेता है, इसलिए क्रमागत आइटम ऑफ़सेट 0, 4, 8 और इसी तरह पर होते हैं।

मेमोरी में एक ऐरे का योग करें
.data
nums: .word 10, 20, 30, 40 # चार वर्ड
.text
la t1, nums # t1 = ऐरे का पता
li t2, 4 # गिनती
li t0, 0 # चालू योग
loop:
beq t2, zero, done
lw t3, 0(t1) # मौजूदा तत्व लोड करता है
add t0, t0, t3 # योग में जोड़ता है
addi t1, t1, 4 # अगले वर्ड पर आगे बढ़ता है (4 बाइट्स)
addi t2, t2, -1 # एक कम बचा
j loop
done:
mv a0, t0 # कुल योग प्रिंट करता है (100)
li a7, 1
ecall
li a7, 10
ecall

ऐरे का पता t1 में रखता है, t2 शेष 4 तत्वों की गिनती करता है, और t0 चालू योग रखता है। प्रत्येक चक्र में, लूप को रोक देता है जब कोई तत्व शेष नहीं रहता। उस तत्व को लोड करता है जिसकी ओर t1 इंगित करता है, उसे योग में जोड़ता है, पॉइंटर को एक शब्द आगे बढ़ाता है, और गिनती घटाता है। सभी चार तत्वों (10 + 20 + 30 + 40) के बाद, done 100 प्रिंट करता है।

💡
पते और मान कैसे प्रदर्शित होते हैं, यह बदलने के लिए सिम्युलेटर टूलबार में HEX/DEC टॉगल का उपयोग करें। जो भी आधार वर्तमान चरण को समझना आसान बनाए, उसे चुनें।