الذاكرة: تحميل وتخزين

الذاكرة: تحميل وتخزين

الذاكرة هي صف كبير من خانات التخزين المرقّمة، وكل خانة تحمل بايت واحدًا (8 بتات). رقم الخانة هو عنوانها. السجلات هي المجموعة الصغيرة السريعة لدى المعالج. الذاكرة أكبر بكثير لكنها أبطأ، وهي تحمل كل ما لا يتّسع في السجلات، مثل المصفوفات والسلاسل النصية. للتعامل مع قيمة في الذاكرة، تُحمّلها إلى سجل، وتغيّرها، ثم تخزّنها مرة أخرى.

السجلات قليلة والذاكرة كبيرة. (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 يعدّ العناصر الأربعة المتبقية، وt0 يحمل المجموع الجاري. في كل دورة، يوقف الحلقة عندما لا تبقى عناصر. يحمّل العنصر الذي يشير إليه t1، و يضيفه إلى المجموع، و يقدّم المؤشر بمقدار كلمة واحدة، و ينقص العدّاد. بعد العناصر الأربعة كلها (10 + 20 + 30 + 40)، يطبع done القيمة 100.

💡
استخدم مفتاح HEX/DEC في شريط أدوات المحاكي لتبديل طريقة عرض العناوين والقيم. اختر الأساس الذي يجعل الخطوة الحالية أسهل في المتابعة.