علیرضا مختاری - سید محمد امین رجائی - محمد جواد عباسی
این پروژه یک اسمبلر و شبیهساز ساده برای معماری RISC-V (سطح RV32I) است. برنامه قادر است فایل اسمبلی (program.asm) را در چهار مرحله به صورت کامل پردازش و اجرا کند:
- پاس اول: تحلیل لیبلها و راهنماها (directives)
- پاس دوم: رمزگذاری (Encoding) دستورها
- تولید فایل خروجی باینری (
output.txt) - اجرای مرحلهبهمرحله دستورات با شبیهسازی دقیق سختافزار (Simulator)
[program.asm]
↓
┌────────┐
│ Parser │ ← پاس اول: تحلیل لیبلها
└────────┘
↓
┌────────────────┐
│ Instruction │ ← پاس دوم: تبدیل دستورها به باینری
│ Encoder │
└────────────────┘
↓
┌────────────────────┐
│ File Output Writer │ ← تولید output.txt
└────────────────────┘
↓
┌────────────────────┐
│ Simulator │ ← خواندن و اجرای output.txt
└────────────────────┘
/project-root
│
├── input.asm ← فایل اسمبلی نمونه
├── output.txt ← فایل باینری خروجی
│
├── main.cpp ← فایل اصلی برنامه: اجرای کل مراحل
├── encoder.cpp/.h ← رمزگذار دستورات RISC-V به باینری
├── simulator.cpp/.h ← پیادهسازی شبیهساز معماری RV32I
│
- کامپایلر C++ استاندارد (مثلاً
g++) - سیستم عامل Windows/Linux/Mac
- فایل اسمبلی ورودی (
input.asm)
اگر فایلها جدا هستند:
g++ -std=c++11 -o riscv main.cpp encoder.cpp simulator.cpp symbol_table.cppاگر از Makefile استفاده میکنید:
makeپس از کامپایل، تنها کافی است دستور زیر را اجرا کنید:
./riscvدر اجرای برنامه:
- فایل
input.asmخوانده میشود. - فایل
output.txtتولید میشود. - شبیهساز دستورها را گامبهگام اجرا میکند و وضعیت رجیسترها و حافظه را نشان میدهد.
.org 0x1000
start:
addi x1, x0, 10
addi x2, x0, 5
add x3, x1, x2
sub x4, x3, x2
beq x4, x1, match
addi x5, x0, 1
match:
lw x6, 0(x10)
addi x7, x0, 99
halt:
jal x0, halt
.org 0x2000
.word 1234
.word 5678| راهنما | عملکرد |
|---|---|
.org |
تنظیم آدرس شروع |
.word |
قرار دادن مقدار 32 بیتی در حافظه |
.half |
قرار دادن مقدار 16 بیتی در حافظه |
.byte |
قرار دادن مقدار 8 بیتی در حافظه |
.align n |
تراز کردن آدرس به توان ۲ از n |
i rd, imm |
بارگذاری مقدار imm به rd با استفاده از lui+addi یا addi |
فایل output.txt در مرحلهٔ سوم بهصورت هگزادسیمال (hex mode) ایجاد میشود و شامل دستورات رمزگذاریشده RISC-V است. این فایل به عنوان ورودی برای شبیهساز استفاده میشود.
در هر چرخه کلاک، وضعیت سیستم و رجیستر ها به این شکل نمایش داده میشود:
clock: 4
x0: 00000000 x1: 0000000A x2: 00000005 ...
PC: 00001010 MAR: 00001000 MDR: 00A00093 ...