من یه نمونه ISA سریع نوشتم که به احتمال زیاد می تونه نواقصی داشته باشه. این پردازنده 14 دستور العمل و هشت ثبات داره. ثبات شماره صفر r0 همیشه مقدارش صفر هست که zr هم نامیده میشه. ثبات شماره یک مقدار IP رو نگهداری میکنه و ثبات شماره دو CR هستش. و چهار ثبات آخر برای کارهای همه منظوره هستند. اندازه کلمه و اندازه دستورهای پردازنده 16 بیتی هست و می تونه 1 مگابایت رو کلمه رو آدرس دهی کنه. این پردازنده 5 گروه دستور رو داره که اگر تعداد بیتها بیشتر 16 بودش میشد به سه گروه کاهش داد.
instruction set:
R-Type:
<- 3 -><- 4 -><- 3 -><- 3 -><- 3 ->
+------+--------+------+------+------+
| cond | opcode | dest | src | src2 |
+------+--------+------+------+------+
I-Type:
<- 3 -><- 4 -><- 3 -><- 3 -><- 3 ->
+------+--------+------+------+------+
| cond | opcode | dest | src | val |
+------+--------+------+------+------+
J-type:
<- 3 -><- 4 -><- 3 -><- 5 ->
+------+--------+------+-------------+
| cond | opcode | dest | immediate |
+------+--------+------+-------------+
M-Type:
<- 3 -><- 4 -><- 1 -><- 8 ->
+------+--------+------+-------------+
| cond | opcode | L/H | target |
+------+--------+------+-------------+
S-Type:
<- 3 -><- 4 -><- 1 -><- 1 -><- 3 -><- 4 ->
+------+--------+-----+-----+------+--------+
| cond | opcode | Dir | A | dest | target |
+------+--------+-----+-----+------+--------+
OP codes:
+--+--------+-----+---+ ----------------+
| 1| | LD | J | | \
| 2| | ST | R | | | -> Memory
| 3| | MV | M | | /
+--+--------+-----+---+-----------------+
| 4| | ADD | R | | \
| 5| | ADDi| I | | |
| 6| | SUB | R | | |
| 7| | SUBi| I | | |
| 8| | AND | R | | |-> ALU
| 9| | OR | R | | |
|10| | NOT | R | | |
|11| | XOR | R | | /
+--+--------+-----+---+-----------------+
|12| | SH | S | | |-> Shifter
+--+--------+-----+---+-----------------+
|13| | JMP | J | | -> Jump
+--+--------+-----+---+-----------------+
|14| | HLT | | | -> Other
+--+--------+-----+---+-----------------+
خب یه مثال جمع:
add r3r3,r4
مثال دستور inc:
addi r3,r3,1
مثال برای مقدار دهی یک ثبات:
mvl r3, 12
mvh r3,27
مثال انتقال به چپ حسابی
shla r3,4
مثال انتقال ثباتی:
add r3,zr,r4
خب پردازنده جوری طراحی شده که به راحتی میشه برای خیلی از if ها و ... بدون پرش کار رو انجام داد. اینکار به کمک بیت های cond برای دستورها انجام میگیره و باعث میشه pipline بیخودی خالی نشه. مثلا:
subi r3,r3,0
addiz r3,r3,1
jmpz r3,r2,12
عملوندهای z مشخص کننده ست بودن پرچم zero هست.
IO از نوع Memory Map فرض شده. همجنین میشه:
1. دو دستور دیگه اضافه کرد.
2. از دستور hlt صرف نظر کرد.
3. با یکم دستکاری از ثبات zr صرف نظر کرد.
4. از دستورهای addi و subi در صورت کم آوردن دستور میشه صرف نظر کرد.
برخی دستورهای دیگه که می تونه برنامه نویسی رو راحتر کنه و به سیستم اضافه کرد مثلا cmp و یا اینکه مثلا میشه یه دستور برای فراخوانی وقفه و ... اضافه کرد.
درست بررسی نکردم اما فکر کنم حداقل میشه سه مرحله pipeline اضافه کرد. چون تعداد دستورها کم هستش یه CU کوچیک خواهد داشت. برای بهبود میشه تعداد گروه ها رو کم کردش تا CU هم سریعتر بشه و هم اینکه کوچکتر.
همینطور میشه یه نمونه از دستور ST رینج دار رو برای ذخیره گروهی ثبات ها و یه دستور test رو پیاده سازی کرد که کار ساخت سیستم عامل رو براش به مراتب راحتر خواهد کرد.
از اونجا که IO از نوع Memory Maped هستش خیلی راحت میشه تعداد IO رو زیاد کم کرد بدون اینکه نگرانی از نظر تعداد پورت و یا کم بود جا برای مشخص کردن شماره IO و یا داده اون در دستورها داشته باشیم.
چون تمامی دستورها 16 بیتی هستش پیاده سازی به مراتب راحتر میشه اما میشه دستورها رو 32 بیتی کرد و ریجیستر IR رو 32 بیتی در نظر گرفت. مزیتش اینه:
- رنج دستورها کاملتر میشه
- تعداد ثباتها رو میشه به 32 تا افزایش داد (اکثر معماری های مدرن 32 ثبات دارند)
- تعداد بیت های شرط رو میشه به چهار تا افزایش داد که برنامه نویسی رو راحتر میکنه.
- محدودیت های نوع I و نوع M به مراتب کمتر میشه.
معایب:
- CU بزرگنر میشه
- دو سیکل برای انتقال داده هدر میره مگر اینکه دو تا IR داشته باشیم
- اندازه پردازنده افزایش پیدا میکنه.