sh

sh

تجميع RISC-V مرجع

يغطي lyszt.net sh وتعليمات RISC-V الأخرى بمزيد من التفصيل.

تنسيق الترميز

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

الوصف

يكتب sh نصف كلمة، 16 بت أو 2 بايت، إلى الذاكرة. وهو يطابق تحميلات lh و lhu ويخزن الحجم الأضيق حيث يخزن sw الكلمة الكاملة. يظهر الشكل أدناه. يأخذ القيمة في سجل المصدر rs2 ويكتب أدنى 16 بت منها إلى العنوان في سجل القاعدة rs1 بالإضافة إلى الإزاحة. يتطابق التخطيط مع sw، مع تسمية سجل المصدر أولاً.

sh rs2, offset(rs1)

يحمل السجل 32 بت ويتم تخزين 16 فقط، لذا يحتفظ sh بأدنى 16 بت ويسقط أعلى 16 بت. لا يوجد خيار موقّع أو غير موقّع للتخزين. هذا الخيار ينتمي إلى التحميلات، حيث يجب توسيع قيمة ضيقة لملء سجل وتحتاج البتات المفقودة إلى قاعدة. التخزين يضيّق القيمة، والاحتفاظ بالبتات المنخفضة هو السلوك الوحيد المنطقي. إذا كان السجل يحمل قيمة كبيرة جدًا بالنسبة لـ 16 بت، فستفقد البتات الإضافية دون تحذير، لذا تحقق من النطاق قبل التخزين.

يقول دليل RISC-V إن sh يخزن أدنى 16 بت من السجل rs2 إلى الذاكرة عند عنوان rs1 بالإضافة إلى الإزاحة الممتدة بالإشارة ذات 12 بت. تخزينات نصف الكلمة عند العناوين الزوجية محاذاة طبيعيًا ولا تثير خطأ محاذاة أبدًا. التخزين إلى عنوان غير محاذى طبيعيًا يتصرف كما يحدده بيئة التنفيذ، ويقول الدليل إنه قد يعمل ببطء شديد.

يكتب sh كل تنسيق 16 بت يقرأه lh و lhu مرة أخرى، مثل عينات الصوت وبيانات البكسل 16 بت ومصفوفات نصف الكلمة. النمط الشائع هو القراءة والتعديل والكتابة. حمّل نصف كلمة باستخدام lhu، وعدّلها في السجل، ثم أعد تخزينها باستخدام sh. تتغير فقط البايتان المستهدفتان وتبقى البايتات المحيطة بهما كما كانت. تقع أنصاف الكلمات على مسافة 2 بايت، لذا تحرّك الحلقات العنوان بمقدار 2.

مثال

la t0, slot
li t1, -5
sh t1, 0(t0)   # memory at slot now holds the low 16 bits of -5