sub

sub

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

يغطي lyszt.net sub وتعليمات 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

الوصف

تقوم sub بطرح القيمة الموجودة في أحد السجلات من قيمة سجل آخر وتدوين النتيجة في سجل ثالث. وهي تعمل على السجلات، وهي فتحات تخزين صغيرة مرقمة داخل المعالج يحتوي كل منها على رقم واحد مكون من 32 بت.

يظهر شكل sub أدناه، والنتيجة هي rd = rs1 - rs2. rd هو السجل الوجهة، حيث تذهب النتيجة. rs1 و rs2 هما السجلان المصدران. الترتيب مهم، وعكسه خطأ شائع يرتكبه المبتدئون.

sub rd, rs1, rs2

السطر التالي يحسب t0 ناقص t1. المصدر الأيسر هو القيمة التي تُطرح منها.

sub t2, t0, t1

لا توجد تعليمة subi لطرح ثابت. تقبل تعليمة addi الثوابت السالبة، لذا فإن طرح عدد ثابت يعني إضافة سالبه. السطر التالي يقلل قيمة t0 بمقدار واحد.

addi t0, t0, -1

يحتوي RISC-V على سجل خاص يُسمى zero يحمل دائمًا القيمة 0. تؤدي طرح عدد من zero إلى عكس إشارته، لذا فإن السطر التالي يضع سالب t1 في t0. تعليمة neg هي اختصار لهذا.

sub t0, zero, t1

يُعرّف دليل RISC-V الأمر sub بأنه طرح rs2 من rs1. يتم تجاهل التجاوز (overflow)، ولا تُكتب في السجل rd سوى البتات المنخفضة من XLEN من النتيجة، حيث XLEN هو عرض السجل بالبتات، وهو 32 في هذه الحالة. يذكر الدليل أيضًا أن السجل x0، الذي يسميه هذا المحاكي zero، مبرمج بشكل ثابت على قيمة تكون جميع بتاتها 0.

في المثال، 10 ناقص 4 يساوي 6 في t2. وتبادل المصدرين يعطي -6، والذي يخزنه المعالج وفقًا لنظامه الخاص للأعداد السالبة.

مثال

li t0, 10
li t1, 4
sub t2, t0, t1   # t2 = 6