یک اسمبلر کامل و قدرتمند برای شبیهساز CPU v4 که با Rust نوشته شده است.
- ✅ پشتیبانی از تمامی دستورات CPU v4 (100+ دستور)
- ✅ سینتکس ساده و قابل فهم
- ✅ پشتیبانی از Labels و Jumps
- ✅ انواع مختلف Operands (Register, Immediate, Address)
- ✅ کامنتگذاری با
;یا# - ✅ خروجی Binary مستقیم
- ✅ Debug Information و Error Reporting
- ✅ Performance بالا با Rust
# کامپایل اسمبلر (نیاز به Rust)
make assembler
# یا به صورت دستی:
rustc -O assembler.rs -o assembler# اسمبل کردن فایل
./assembler input.asm output.bin
# اجرای برنامه در CPU
./cpu --load output.bin --run
# یا در حالت تعاملی
./cpu
CPU v4> load output.bin
CPU v4> run; کامنتها با ; یا # شروع میشوند
# این هم کامنت است
NOP ; هیچ کاری نکن
HLT ; توقف CPU; رجیسترهای عمومی
R0, R1, R2, ..., R15
; رجیسترهای خاص
PC ; Program Counter
SP ; Stack Pointer
BP ; Base Pointer
FLAGS ; پرچمها
ACC ; Accumulator
MAR ; Memory Address Register
MDR ; Memory Data Register
; رجیسترهای کنترل
CR0, CR1, CR2, CR3
; رجیسترهای سیستم
TIM ; Timer
IOP ; I/O Port
IRQ ; Interrupt Request
RND ; Random NumberMOVI R0, #123 ; عدد دسیمال
MOVI R1, #0xFF ; عدد هگزادسیمال
MOVI R2, 'A' ; کاراکتر
MOVI R3, #0x1000 ; آدرس هگزstart: ; تعریف label
MOVI R0, #5
JMP end ; پرش به label
loop:
DEC R0
JNZ loop ; پرش شرطی
end:
HLTADD R0, R1 ; R0 = R0 + R1
SUB R0, R1 ; R0 = R0 - R1
MUL R0, R1 ; R0 = R0 * R1
DIV R0, R1 ; R0 = R0 / R1
MOD R0, R1 ; R0 = R0 % R1
INC R0 ; R0++
DEC R0 ; R0--
NEG R0 ; R0 = -R0
ABS R0 ; R0 = |R0|AND R0, R1 ; R0 = R0 & R1
OR R0, R1 ; R0 = R0 | R1
XOR R0, R1 ; R0 = R0 ^ R1
NOT R0 ; R0 = ~R0
SHL R0, R1 ; R0 = R0 << R1
SHR R0, R1 ; R0 = R0 >> R1LOD R0, [0x1000] ; R0 = memory[0x1000]
STR R0, [0x1000] ; memory[0x1000] = R0
MOV R0, R1 ; R0 = R1
MOVI R0, #123 ; R0 = 123
LEA R0, [label] ; R0 = address of label
PUSH R0 ; push R0 to stack
POP R0 ; pop from stack to R0CMP R0, R1 ; مقایسه R0 با R1
CMPI R0, #100 ; مقایسه R0 با 100
TEST R0, R1 ; تست بیتها
JMP label ; پرش غیرشرطی
JZ label ; پرش اگر صفر
JNZ label ; پرش اگر غیرصفر
JC label ; پرش اگر carry
JNC label ; پرش اگر no carry
JS label ; پرش اگر منفی
JNS label ; پرش اگر مثبتCALL function ; صدا زدن تابع
RET ; برگشت از تابع
function:
MOVI R0, #42
RETIN R0, R1 ; خواندن از پورت
OUT R0, R1 ; نوشتن به پورت
PRINT R0 ; چاپ کاراکتر
INPUT R0 ; گرفتن ورودیINT #21 ; وقفه نرمافزاری
IRET ; برگشت از وقفه
CLI ; غیرفعال کردن وقفهها
STI ; فعال کردن وقفهها
SYSCALL R0 ; فراخوانی سیستم; examples/hello.asm
start:
MOVI R0, 'H'
PRINT R0
MOVI R0, 'i'
PRINT R0
MOVI R0, '!'
PRINT R0
HLT; examples/factorial.asm
start:
MOVI R0, #5 ; محاسبه 5!
MOVI R1, #1 ; نتیجه
loop:
MUL R1, R0 ; result *= n
DEC R0 ; n--
JNZ loop ; تکرار تا n=0
; R1 حالا شامل 5! = 120
HLT; examples/sum.asm
start:
MOVI R0, #10 ; شمارنده
MOVI R1, #0 ; مجموع
sum_loop:
ADD R1, R0 ; sum += i
DEC R0 ; i--
JNZ sum_loop ; تکرار
; R1 = 1+2+...+10 = 55
HLT# کامپایل مثالها
./assembler examples/hello.asm hello.bin
./assembler examples/factorial.asm factorial.bin
./assembler examples/simple.asm simple.bin
# اجرا در CPU
./cpu --load hello.bin --run
./cpu --load factorial.bin --debug --runاسمبلر اطلاعات کاملی از خطاها ارائه میدهد:
❌ Assembly failed: Line 15: Unknown instruction 'INVALID'
❌ Assembly failed: Line 8: Undefined label: unknown_label
❌ Assembly failed: Line 12: Expected register operand
- کد تولید شده بهینه است
- Labels به آدرسهای صحیح تبدیل میشوند
- اندازه دستورات محاسبه دقیق
- خروجی Binary کامپکت
برای افزودن دستورات جدید یا بهبود اسمبلر، فایل assembler.rs را ویرایش کنید.
🎉 حالا کار با اسمبلی راحت و لذتبخش است!