// تعریف نوع و مدل برنامه برای کامپایلر
.model small
//مقدار حافظه مورد نیاز برای پشته برنامه که عملیات محاسباتی در آن انجام خواهد شد
.stack 100h
//شروع دیتا برنامه
.data
//تعریف متغیرها و نوع آنها
a_h dw 0
a_l dw 0b_h dw 0
b_l dw 0
c_h dw 0
c_l dw 0
i db 0
flg db 1
opr db 0
// رشته calculator که در برنامه چاپ می شود
item1 db “CALCULATOR $”
// مدل برنامه و شروع کد برنامه
.۳۸۶
.code
//شروع دستورات اصلی و مقداردهی های اولیه
main proc
mov ax,@data
mov ds,ax
call clearscr
mov dl,30
mov dh,1
mov cx,offset item1
call write
call nextline
l0:
mov cx,10
mov a_h,0
mov a_l,0
l1:
mov ah,07h
int 21h ; //فراخوانی مقادیر ورودی
cmp al,30h
jb l2
mov dl,al
mov ah,02h
int 21h ; //چاپ کاراکترها
sub al,30h
cmp al,0ah
mov ah,0
push ax
mov ax,a_h
mul cx
pop bx
add ax,bx
mov a_h,ax
jmp l1
l2:
// دستورات شناخت و مقایسه اینکه کدام عملگر الان فراخوانی شده
cmp al,”+” ;+
je l9
cmp al,”.” ;+
je l11
cmp al,”-” ;-
je l9
cmp al,”*” ;*
je l9
cmp al,”/” ;/
je l9
cmp al,1bh ;// لغو کردن
je l7
cmp al,0dh ;// کد تایید توسط کاربر
je l8
jmp l1
l8:
// قطعه کد رفتن به خط بعدی و نمایش نتیجه محاسبات
call nextline
mov dl,” ”
mov ah,02h
int 21h
mov dl,”=”
mov ah,02h
int 21h
mov dl,” ”
mov ah,02h
int 21h
// قطعه کد مربوط به چهار عمل اصلی
cmp opr,”+”
je l_add
cmp opr,”-”
je l_sub
cmp opr,”*”
je l_mul
cmp opr,”/”
je l_div
jmp l1
l9:
mov opr,al
mov dl,al
mov ah,02h
int 21h ; // چاپ کاراکتر عملگر
mov ax,a_h
mov b_h,ax
mov ax,a_l
mov b_l,ax
jmp l0
l11:
mov dl,”.”
mov ah,02h
int 21h ;; // چاپ علامت اعشار .
mov cx,10
l011:
mov ah,07h
int 21h ; // فراخوانی کلیدها
cmp al,30h
jb l2
mov dl,al
mov ah,02h
int 21h ; // چاپ مقادیر وارد شده
sub al,30h
mov ah,0
mov dx,ax
mov ax,0
div cx
add a_l,ax
mov ax,cx
mov bx,10
mul bx
mov cx,ax
jmp l011
// قطعه کد عملیات جمع در ماشین حساب
l_add:
mov ax,b_l
mov bx,a_l
add ax,bx
mov c_l,ax
mov ax,a_h
mov bx,b_h
adc ax,bx
mov c_h,ax
call display1
jmp l0
// قطعه کد عملیات تفریق ماشین حساب
l_sub:
mov ax,b_l
mov bx,a_l
sub ax,bx
mov c_l,ax
mov ax,b_h
mov bx,a_h
sub ax,bx
mov c_h,ax
call display1
jmp l0
// قطعه کد عملیات ضرب ماشین حساب
l_mul:
mov ax,b_l
mov bx,a_l
mul bx
mov c_l,dx
mov ax,b_l
mov bx,a_h
mul bx
add c_l,ax
adc c_h,dx
mov ax,b_h
mov bx,a_l
mul bx
add c_l,ax
adc c_h,dx
mov ax,b_h
mov bx,a_h
mul bx
add c_h,ax
call display1
jmp l0
// قطعه کد عملیات تقسیم ماشین حساب
l_div:
mov edx,0
mov dx,b_h
mov ax,b_l
shl eax,16
mov bx,a_h
shl ebx,16
mov bx,a_l
div ebx
mov c_l,ax
shr eax,16
mov c_h,ax
call display1
jmp l0
l7:
mov ax,4c00h
int 21h
main endp
// قطعه کد مربوط به صفحه نمایش و دریافت و خروجی هایی محاسبات
display1 proc
push ax
push bx
push cx
push dx
mov ax,c_l
mov dx,c_h
cmp dx,7fffh
jb positive
not dx
not ax
add ax,1
adc dx,0
mov c_h,dx
mov c_l,ax
mov dl,”-”
mov ah,02h
int 21h
positive:
mov ax,c_h
mov cx,0
mov bx,10
repeat1:
mov dx,0
div bx
push dx
inc cx
cmp ax,0
jne repeat1
repeat2:
pop dx
add dl,”0″
mov ah,02h
int 21h
loop repeat2
mov dl,”.”
mov ah,02h
int 21h
mov ax,c_l
mov bx,10
mov cx,4
repeat3:
mul bx
push ax
add dl,”0″
mov ah,02h
int 21h
pop ax
loop repeat3
mov a_h,0
mov b_h,0
mov c_h,0
mov a_l,0
mov b_l,0
mov c_l,0
mov opr,0
call nextline
call nextline
pop dx
pop cx
pop bx
pop ax
ret
display1 endp
// قطعه کد چاپ پیغام و نتیجه عملیات محاسباتی در صفحه نمایش
|
دیدگاهتان را بنویسید