المصفوفات: مؤشران، عنوان واحد
المصفوفة هي شبكة من الأرقام مرتبة في صفوف وأعمدة. الصف هو سطر أفقي واحد في الشبكة، يُقرأ من اليسار إلى اليمين. العمود هو سطر رأسي واحد في الشبكة، يُقرأ من الأعلى إلى الأسفل. لا يوجد في الذاكرة مفهوم للصفوف أو الأعمدة. إنها سلسلة طويلة واحدة من البايتات، من النوع نفسه من المتجهات الذي تناولناه في الدرس السابق. لتخزين مصفوفة، يجب وضع صفوفها وأعمدتها واحدًا تلو الآخر في تلك السلسلة الواحدة. والخيار المعتاد هو ترتيب الصف أولًا: خزّن كل رقم في الصف الأول، ثم كل رقم في الصف الثاني، واستمر حتى يتم وضع كل صف.
فهرسان، عنوان واحد
يُعطى موضع العنصر في المصفوفة بفهرسين: فهرس الصف، الذي يحدد الصف الذي ينتمي إليه، وفهرس العمود، الذي يحدد العمود الذي ينتمي إليه. يبدأ العد لكل منهما من 0، بالطريقة نفسها التي عملت بها الفهارس في درس المتجهات. تحتفظ الذاكرة بتسلسل مسطح واحد من الأرقام، لذا يجب أولًا دمج الفهرسين في فهرس مسطح واحد: اضرب فهرس الصف في عدد أعمدة المصفوفة، ثم أضف فهرس العمود. ومن هناك يصبح الفهرس المسطح عنوان بايت بالطريقة نفسها التي يصبح بها فهرس المتجه كذلك: address = base + index * 4.
mul t4, t1, t3 # t4 = فهرس الصف * عدد الأعمدةadd t4, t4, t2 # t4 = that + فهرس العمود (الفهرس المُسطَّح)slli t4, t4, 2 # t4 = إزاحة البايت = الفهرس * 4add t5, t0, t4 # t5 = عنوان العنصر في هذا الصف والعمودlw t5, 0(t5) # t5 = القيمة عند ذلك العنوان
يضرب فهرس الصف في عدد الأعمدة. في درس المتجهات كان يمكن إجراء الضرب بإزاحة لأن 4 قوة للعدد اثنين، لكن عدد الأعمدة في المصفوفة عادة ليس كذلك، لذا يُستخدم هنا بدلًا من . يُضاف فهرس العمود، ثم تُضرب النتيجة في 4 باستخدام آخر (4 قوة للعدد اثنين، لذا لا تزال الإزاحة صالحة لهذا الجزء). وينتج عن ذلك إزاحة البايت للعنصر عند الصف والعمود المعطيين.
الصف 0، العمود 0 يقابل الفهرس 0.
.data في برنامجك وقراءتك الخاصة له على تلك السلسلة الواحدة، باستخدام حساب و و الموضح أعلاه. وبمجرد فهم الشبكة والصف المسطح كشيء واحد معروض مرتين، يغطي النمط نفسه أي شبكة بيانات: صفوف البكسلات في صورة، أو لوح لعبة، أو جدول بيانات. كل منها مصفوفة واحدة، يُوصل إليها بضربة ضرب إضافية واحدة.جمع المصفوفة
.datam: .word 1, 2, 3, 4, 5, 6, 7, 8, 9 # مصفوفة 3×3، مخزّنة صفًا تلو الآخر.textla t0, m # العنوان الأساسيli t1, 3 # عدد الصفوفli t2, 3 # عدد الأعمدةli t3, 0 # فهرس الصف الحالي، يبدأ من 0li s0, 0 # المجموع الجاريrow_loop:beq t3, t1, row_doneli t4, 0 # فهرس العمود الحالي، يبدأ من 0col_loop:beq t4, t2, col_donemul t5, t3, t2 # فهرس الصف * عدد الأعمدةadd t5, t5, t4 # + فهرس العمود = الفهرس المسطّحslli t5, t5, 2 # إزاحة البايت = الفهرس * 4add t6, t0, t5 # عنوان العنصر في هذا الصف والعمودlw t6, 0(t6) # القيمة عند ذلك العنوانadd s0, s0, t6 # المجموع += العنصرaddi t4, t4, 1 # ينتقل إلى العمود التاليj col_loopcol_done:addi t3, t3, 1 # ينتقل إلى الصف التاليj row_looprow_done:mv a0, s0 # يطبع المجموع: 1+2+...+9 = 45li a7, 1ecallli a7, 10ecall
تستخدم حلقتان متداخلتان فهرسة المصفوفة. تختار الحلقة الخارجية صفًا، وتختار الحلقة الداخلية عمودًا داخل ذلك الصف. يضرب فهرس الصف في عدد الأعمدة. وإضافة فهرس العمود والضرب في 4 يعطي عنوان ذلك العنصر. تُحمَّل القيمة المخزنة في ذلك العنوان وتُضاف إلى المجموع الجاري. وعندما تنتهي الحلقة الداخلية من صف، تنتقل الحلقة الخارجية إلى الصف التالي، حتى تتم معالجة الصفوف الثلاثة كلها.
