Skip to content

mohammadamin382/cpu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

53 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CPU Assembler v4.0 Ultra 🚀

یک اسمبلر کامل و قدرتمند برای شبیه‌ساز 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 Number

مقادیر فوری (Immediates)

MOVI R0, #123       ; عدد دسیمال
MOVI R1, #0xFF      ; عدد هگزادسیمال
MOVI R2, 'A'        ; کاراکتر
MOVI R3, #0x1000    ; آدرس هگز

Labels و Jump ها

start:              ; تعریف label
    MOVI R0, #5
    JMP end         ; پرش به label
    
loop:
    DEC R0
    JNZ loop        ; پرش شرطی
    
end:
    HLT

دستورات حسابی

ADD 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 >> R1

دستورات حافظه

LOD 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 R0

دستورات مقایسه و پرش

CMP 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
    RET

دستورات I/O

IN R0, R1           ; خواندن از پورت
OUT R0, R1          ; نوشتن به پورت  
PRINT R0            ; چاپ کاراکتر
INPUT R0            ; گرفتن ورودی

دستورات سیستم

INT #21             ; وقفه نرم‌افزاری
IRET                ; برگشت از وقفه
CLI                 ; غیرفعال کردن وقفه‌ها
STI                 ; فعال کردن وقفه‌ها  
SYSCALL R0          ; فراخوانی سیستم

مثال‌های کاربردی

Hello World

; 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 را ویرایش کنید.


🎉 حالا کار با اسمبلی راحت و لذت‌بخش است!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors