الذاكرة: تحميل وتخزين
الذاكرة هي صف كبير من خانات التخزين المرقّمة، وكل خانة تحمل بايت واحدًا (8 بتات). رقم الخانة هو عنوانها. السجلات هي المجموعة الصغيرة السريعة لدى المعالج. الذاكرة أكبر بكثير لكنها أبطأ، وهي تحمل كل ما لا يتّسع في السجلات، مثل المصفوفات والسلاسل النصية. للتعامل مع قيمة في الذاكرة، تُحمّلها إلى سجل، وتغيّرها، ثم تخزّنها مرة أخرى.
السجلات قليلة والذاكرة كبيرة. (load word) ينسخ كلمة من الذاكرة إلى سجل، و (store word) ينسخها مرة أخرى. يُكتب العنوان بالصيغة offset(register).
ذاكرة RISC-V معنونة بالبايت، لذا لكل بايت عنوانه الخاص بالتسلسل. الكلمة 32 بت، أي 4 بايتات، لذا تُقدّم مؤشر الذاكرة بمقدار 4 للوصول إلى الكلمة التالية. لهذا تكون إزاحات المصفوفة 0 و4 و8 وهكذا. على العتاد الحقيقي، قد يكون تحميل كلمة من عنوان ليس من مضاعفات 4 بطيئًا أو قد يسبب فخًّا. تسمح هذه المحاكية بذلك، لكن ينبغي أن تكتسب عادة إبقاء الكلمات محاذية لـ 4 بايتات.
lw t0, 0(a1) # t0 = الذاكرة عند العنوان a1sw 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 يعدّ العناصر الأربعة المتبقية، وt0 يحمل المجموع الجاري. في كل دورة، يوقف الحلقة عندما لا تبقى عناصر. يحمّل العنصر الذي يشير إليه t1، و يضيفه إلى المجموع، و يقدّم المؤشر بمقدار كلمة واحدة، و ينقص العدّاد. بعد العناصر الأربعة كلها (10 + 20 + 30 + 40)، يطبع done القيمة 100.
