PDA

View Full Version : تغییرات در ماشین حساب به زبان اسمبلی



jamjid
پنج شنبه 20 دی 1386, 23:07 عصر
یه برنامه اسمبلی است که می خواهم کمکم کنید چون به کمک شما احتیاج دارم البته مشکل من برای شما سخت نیست
در برنامه ای (یه ماشین حساب ساده)که می توانید آنرا از اینجا دانلود کنید به مشکل برخوردم


http://hosseindn.persiangig.com/calc.rar
می خواهم هنگام تعریف متغیر برای گرفتن ورودی از کاربر به جای دستورات زیر







DIGIT1 DB 3,?,3 DUP(?)
از دستور زیر استفاده کرد(همان دستورات گرفتن رشته از کاربر)







Strlist lable byte
max db 3
len db ?
Buffer db 3 dup(' ')
این دستورات آرایه ای تعریف می کند و با استفاده از شماره سرویس
0h
Ah از شماره وقفه 21
‌ از کاربر ورودی را گرفت


mov ah, 0ah
lea dx, strlist
int 21
من می خواهم بدانم اگر بخواهم از روشی که گفتم استفاده کنم باید در کدام قسمت برنامه تغییرات اعمال کرد تا برنامه به همان روال قبل جواب بدهد
در برنامه از متغیرهایی مانند Digit1+2 استفاده شده من اگه بخواهم به روشی که گفتم عمل کنم باید تغییراتی اعمال کنم چون متغیر Digit1 تغییر می یابد

مشکل دوم این اینست که چطوری می تونم از کاربر تا 8 رقم ورودی بگیرم و برنامه جواب درست بدهد
)برنامه تا 2 کاراکتر بیشتر ورودی نمیگیرد (
لازم به ذکر است که من به جای اعداد 3 در Data segment ‌عدد 9 گذاشتم . کاربر میتوانست تا 8 رقم عدد ورودی بدهد ولی برنامه جواب درست به کاربر نمی داد

اگه لطف کنید این تغییرات را به من بگید ممنون میشم
البته این برنامه از همین سایت که توسط آقا مهدی ... گذاشته شده بود دانلود کردم
قبلا از بچه های همین سایت کمک گرفته بودم ولی به نتیجه نرسیدم
امید وارم با کمک همه دوستان به نتیجه برسیم

با تشکر از همه دوستان

Delphi Coder
دوشنبه 24 دی 1386, 02:32 صبح
این برنامه اصلا مشکل داره از بیخ شما چیشو میخواید درست کنید.

6+5=136!!!!!!!!!!!!!!!!
12*3=516!!!!!!!!!!!!!!!!
12/4=0!!!!!!!!!!!!!!!!!!!!

jamjid
سه شنبه 25 دی 1386, 11:00 صبح
دوست عزیز قالب ورودی این برنامه به شکل زیر است
## @ ##
#= عدد و @=علامت
شما باید به شکل زیر ورودی وارد می کردید
06 + 05
12 * 03
12 / 04
===> یک عدد دو رقمی وارد می کنید بعد کلید اینتر ، بعد علامت دوباره کلید اینتر و سپس یک عدد دو رقمی دیگر نیز وارد می کنید و برای جواب گفتن دوباره کلید اینتر را فشار دهید

Delphi Coder
پنج شنبه 27 دی 1386, 14:24 عصر
من می خواهم بدانم اگر بخواهم از روشی که گفتم استفاده کنم باید در کدام قسمت برنامه تغییرات اعمال کرد تا برنامه به همان روال قبل جواب بدهدبه جای اینکه DIGIT1 رو به وقفه بدید آدرس Strlist یا max رو جایگزین کنید.
مشکل دوم این اینست که چطوری می تونم از کاربر تا 8 رقم ورودی بگیرم و برنامه جواب درست بدهد
از دستورات و رجیسترهای 32 بیتی به جای 16 بیتی استفاده کنید.

jamjid
یک شنبه 30 دی 1386, 12:07 عصر
از دستورات و رجیسترهای 32 بیتی به جای 16 بیتی استفاده کنید
چطوری این کار را بکنم؟

jdeveloper
دوشنبه 01 بهمن 1386, 20:01 عصر
شما با استفاده از رجیسترهای 32 بیتی مثل EAX به جای AX این کار رو میتونید انجام بدید البته این کار از 386 به بالا مجاز است.

jamjid
سه شنبه 02 بهمن 1386, 12:31 عصر
منظورتون این است که من در اول هر ثبات E بگذارم .؟
در مورد کدام ثباتها میشه این کار را کرد ؟

jamjid
شنبه 13 بهمن 1386, 06:25 صبح
در کتب آقای جعفر نژاد در فصل 7 از یه یک کتابخانه lib.asm صحبت شده است که در ان توابع آماده است مثلا برای دریافت یک عدد .
اگه من برنامه را با اون توابع بنویسم چطور است ؟
من این فایلlib.asm را ندارم اگه میشه برایم بفرستید
ممنون میشم اگه یه مثال از تابع get_num آن برایم بزنید
مثلا برای گرفتم یه عدد 8 رقمی چطور باید از آن استفاده کرد
ممنون
با تشکر

Delphi Coder
شنبه 13 بهمن 1386, 08:17 صبح
.MODEL TINY
.386p
.CODE
ORG 256
s:
mov eax,012345678
ret
END s
این یه برنامه com هست که توش از رجیستر 32 بیتی استفاده شده و با tasm هم میشه اسمبل کرد. پس از این بابت مشکلی نیست.
حالا شما چرا نمی تونید از رجیستر های 16 بیتی استفاده کنید؟ چون جا نمیشه و نمیتونه محاسباتی که میخواید انجام بدید رو پوشش بده.
ولی استفاده از دستورات و رجیسترهای 32 بیتی کمک میکنه تا این مشکل حل بشه.

jamjid
شنبه 13 بهمن 1386, 16:22 عصر
سلام
از این که شبه دستور 0386 را به من یاد دادید ممنون چون من قبلا این دستور را نمی دانستم
من از این دستور استفاده کردم و برنامه اسمبل شد وفایل اجرایی آنر ساخت
ولی وقتی آن را اجرا می کنم با این پیام خطا زیر می شوم . حال شما بگو مشکل چیست؟
"NTVDM.EXE has encountered a problem and needs to close. We are sorry for the inconvenience."
تغییراتی را که هم اعمال کردم این بوده است که به جای ثبات های ax,bx,cx,dx ثبات های eax,ebx,ecx,edx استفاده کردم .
منتظر جواب هستم .
در ضمن عرض کنم که آدما هیچ وقت نمی توانند به یک چیز خاص تسلط کامل پیدا کنند .
ممنون میشدم توصیه هایتان را با پیام خصوصی می گفیتد.

Delphi Coder
شنبه 13 بهمن 1386, 17:37 عصر
فقط این کار کافی نیست. ببینید مثلا وقتی پارامتر دستور div از نوع بایت باشه ax تقسیم بر پارامتر میشه خارج قسمت در al و باقیمانده در ah قرار میگیره. وقتی نه پارامتر 16 بیتی میشه اینبار DX:AX تقسیم بر پارامتر میشه بعد ax میشه خارج قسمت و dx باقیمانده ..... منظورم اینه که به همه چیز باید حوستون باشه بعضی جاها تغییرات خوهید داشت و فقط با اضافه کردن e جلوی رجیسترها طبیعتا برنامه جواب نمیده.

من از این دستور استفاده کردم و برنامه اسمبل شد وفایل اجرایی آنر ساخت
ولی وقتی آن را اجرا می کنم با این پیام خطا زیر می شوم . حال شما بگو مشکل چیست؟
"NTVDM.EXE has encountered a problem and needs to close. We are sorry for the inconvenience."
با TD286 برنامتونو debug کنید ببینید مشکل کجاست. با دیباگر dos نمیشه چون اون دستورات 32 بیتی رو نمیتونه disassemble کنه.

jdeveloper
شنبه 13 بهمن 1386, 19:31 عصر
اگر شما بخواهید یک برنامه مثلا ماشین حساب را که یک عدد دورقمی میگیرد واز سیستم شانزده بیتی استفاده میکند به برنامه سی و دو بیتی تغییر دهید باید کل سیستم برنامه را عوض کنید

jamjid
یک شنبه 14 بهمن 1386, 16:26 عصر
این دفعه اول من است که می خواهم برنامه 32 بیتی بنویسم .دو تا کتاب اسمبلی معروف هم دارم ولی ادر این کتابها از برنامه های 16 بیتی استفاده کردند و به همین دلیل است که اشکالات زیادی دارم
اگه شما کمک کنید قصد دارم برنامه را از اول خودم بنویسم
من فرصت کمی دارم و به کمک شما دوستان شدیدا احتیاج دارم
1-گرفتم اعداد در 32 بیتی با 16 بیتی تفاوتی دارد؟
2- وقتی از EAX به جای AX ‌استفاده می کنیم Ah ,Al هم تغییر می کند؟
3- دستورات جمع و ضرب وتقسیم و تفریق در 32 بیتی فرقی دارد؟
4- اگر مسائل دیگری هم هست که ممکنه مفید باشه ممنون میشم ذکر کنید
با تشکر
در ضمن منTD286 را ندارم
دوباره تغیراتی اعمال کردم فایل اجرایی را ساخت
ولی وقتی اجرا می کنی ،‌ فقط یه صفحه سیاه ظاهر میشه (اجرا میشه) ولی نمیدونم چرا دستورات را انجام نمیده
اگه لازم هست برنامه را آپلود کنم

jdeveloper
جمعه 19 بهمن 1386, 22:43 عصر
2 - AX شانزده بیت اول EAX را تشکیل میدهد یعنی اگر بخواهید به ورد اول EAX دسترسی داشته باشید باید از AX استفاده کنید

| 8bit آال | bit 8 آ هاش | 16bit |

jdeveloper
جمعه 19 بهمن 1386, 22:52 عصر
3- بله حتما" تا اونجایی که من مطلع هستم دستورات برروی بایت یا ورد عمل میکنند مثلا برای جمع دو عدد 32 بیتی میتونید اون رو به دو عدد 16 بیتی تقسیم کنید

اگر یک عدد شما در AX:DX ویکی در Y+2 و Y باشد ADD AX , Y ADC DX,Y+2

jdeveloper
جمعه 19 بهمن 1386, 23:11 عصر
البته الان که من نگاه کردم میشه مستقیما" از رجیستر 32 بیت در دستورات هم استفاده کرد مثلا Mov Eax , 76 مشکلی ایجاد نمیکنه . پس میتونید مستقیما MOV EAx, Y رو اجرا کنید البته Y باید از نوع Double باشه یعنیY DD

garib22001
جمعه 10 اسفند 1386, 12:03 عصر
ba salam .mishe tagsim 16 biti bar 8 biti ro bedon estefade az dastor div va fagat ba shift kardan ro dar micro z80 baram bezarin ba tashakor.

sarbandi
شنبه 10 فروردین 1387, 16:21 عصر
.model small
.data
oprand1 db 9 dup(0)
oprand2 db 9 dup(0)
natigeh db 20 dup('0')
len1 db 0
len2 db 0
len3 db 0
col db 0
row db 0
mot db 0
mot1 db 0
mot2 dw 0
mot3 dw 0
ka_ge dw 0
count dw 0
si1 dw 0
di1 dw 0
sign db 0
operate db 0
ja0 db 'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄ¿','$'
ja1 db '³ ³','$'
ja2 db 'ÃÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ ÄÄÄÄÄ´','$'
ja3 db '³ 1 ³ 2 ³ 3 ³ 4 ³ 5 ³','$'
ja4 db 'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ ÍÍÍÍÍ´','$'
ja5 db '³ 7 ³ 8 ³ 9 ³ 0 ³ esc ³','$'
ja6 db 'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ ÍÍÍÍÍ´','$'
ja7 db '³ + ³ - ³ * ³ / ³ = ³','$'
ja8 db 'ÀÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍ ÍÍÍÍÍÙ',0ah,0dh,'$'
.code
calculator proc
;//////////////////////////////////////////
mov ax,@data
mov ds,ax
call cls
call shekl
calculatorp:
call amaliat
mov ah,00h
int 16h
cmp al,27
je calc_ret
call start
jmp calculatorp
calc_ret:
mov ah,4ch
int 21h
calculator endp
;/////////////////////////////////
cls proc
push ax
push bx
push cx
push dx
mov bl,0h
mov cx,0000h
mov dx,184fh
mov bh,07h
mov al,00h ;cls function
mov ah,06h
int 10h
mov dx,0000h
call gotoxy
pop dx
pop cx
pop bx
pop ax
ret
cls endp
;////////////////////////////
operatore proc
cmp al,'*'
jne opr1
jmp opr_ret
opr1:
cmp al,'+'
jne opr2
jmp opr_ret
opr2:
cmp al,'-'
jne opr3
jmp opr_ret
opr3: cmp al,'/'
jne opr_num
opr_ret: mov operate,al
call cout_char
mov mot,1
mov mot1,1
opr_num:
ret
operatore endp
;////////////////////////////
detect proc
cmp al,'9'
jg det_ret
cmp al,'0'
jl det_ret
call cout_char
sub al,'0'
mov [si],al
dec si
inc len1
det_ret:
ret
detect endp
;////////////////////////////
harekat proc
har: cmp mot1,0
jne har_ret2
cmp len1,9
je har_ret2
call getkey
call detect
cmp mot,0
jne har1
call operatore
har1:
cmp al,'='
je har_ret1
cmp al,27
je har_ret
jmp har
har_ret:
mov ah,4ch
int 21h
har_ret1:cmp mot,0
je har
har_ret2:
ret
harekat endp
;////////////////////////////////
amaliat proc
mov row,5
mov col,55
mov len1,0
mov operate ,0
lea si,oprand1
add si,8
mov mot,0
mov mot1,0
call harekat
mo2:
cmp operate,0
jne mo1
call getkey
call operatore
jmp mo2
mo1:
mov row,5
mov col,27
call cls2
mov row,5
mov col,55
mov si1,9
mov ax,word ptr len1
sub si1,ax
lea si,oprand2
add si,8
mov len1,0
mov mot1,0
call harekat
cmp al,'='
je play
ba:
mov ah,00h
int 16h
cmp al,'='
je play
cmp al,27
jne ba
mov ah,4ch
int 21h
play:
mov di1,9
mov ax,word ptr len1
sub di1,ax
mai2:
cmp operate ,'-'
jne kalc1
kalc_a:
call proc_sub
call cout1
jmp exit
kalc1:cmp operate ,'/'
jne kalc2
kalc1_s:
call proc_div
jmp exit
kalc2:
cmp operate ,'*'
jne kalc3
call proc_zarb
call cout1
jmp exit
kalc3: cmp operate ,'+'
jne exit
call proc_jam
call cout1
exit:
ret
amaliat endp
;//////////////////////////////
cout_char proc
mov ah,0
push ax
mov ch,0
mov cl,len1
sub col,cl
mov dh,row
mov dl,col
inc dl
call gotoxy
c_char:
cmp cx,0
je c_char1
call re_makan
mov dl,col
call gotoxy
call cout
add dl,2
mov col,dl
dec col
call gotoxy
dec cx
jmp c_char
c_char1:
pop ax
mov dh,5
mov dl,55
call gotoxy
call cout
ret
cout_char endp
;/////////////////////////////
shekl proc
push ax
push cx
push dx
mov dl,26
mov dh,4
mov col,dl
mov row,dh
call gotoxy
mov cx,9
lea dx,ja0
jad: mov ah,09h
int 21h
add dx,32
push dx
inc row
mov dh,row
mov dl,col
call gotoxy
pop dx
loop jad
pop dx
pop cx
pop ax
ret
shekl endp
;////////////////////////////
gotoxy proc
mov ah,02h
int 10h
ret
gotoxy endp
;////////////////////////////
cout proc
mov ah,0eh
int 10h
ret
cout endp
;////////////////////////////
getkey proc
mov ah,07h
int 21h
ret
getkey endp
;////////////////////////////
re_makan proc
mov ah,08h
int 10h
ret
re_makan endp
;////////////////////////////
proc_jam proc
mov mot,0
mov len3,0
lea si,oprand1
lea di,oprand2
call norm
mov cx,9
jam_2: cmp si1,0
jg jam7
mov al,0
jmp jams
jam7: mov al,[si]
jams:mov ah,0
cmp di1,0
jle jamd
mov ah,[di]
jamd:
add ah,al
add ah,mot
mov mot,0
cmp ah,10
jl jam1
sub ah,10
mov mot,1
jmp jam3
jam1:
mov mot,0
jam3:
add ah,'0'
mov ,ah
inc len3
inc si
inc di
dec bx
dec si1
dec di1
loop jam_2
jam_cha:mov al,mot
add al,'0'
mov [bx],al
ret
proc_jam endp
;//////////////////////////////
proc_sub proc
mov mot,0
mov di,si1
cmp di,di1
jg menha0_3
cmp di,di1
jl menha_1
lea si,oprand1
add si,8
lea di,oprand2
add di,8
menha0_4:
mov al,[di]
cmp [si],al
jl menha0_3
dec si
dec di
loop menha0_4
jmp menha_1
menha0_3:
mov al,operate
mov sign,al
mov di,si1
mov si,di1
mov si1,si
mov di1,di
lea si,oprand2
lea di,oprand1
jmp menha_2
menha_1:
lea si,oprand1
lea di,oprand2
menha_2:
mov len3,0
call norm
mov cx,si1
menha2:
cmp di1,0
jg menha3
mov al,0
jmp men1
menha3:mov al,[di]
men1:
mov ah,0
cmp si1,0
jg menha6
jmp menha_ret
menha6: mov ah,[si]
inc len3
cmp ah,al
jge menha1_1
mov mot2,si
menha3_6:mov dl,0
inc si
cmp [si],dl
jne menha3_3
mov dl,9
mov [si],dl
jmp menha3_6
menha3_3:mov dl,1
sub [si],dl
mov si,mot2
add ah,10
jmp menha1_1
menha1_1:
sub ah,al
add ah,'0'
mov [bx],ah
inc si
inc di
dec bx
dec si1
dec di1
loop menha2
menha_ret:
ret
proc_sub endp
;////////////////////////////
proc_zarb proc
lea si,oprand1
lea di,oprand2
call norm
mov mot,0
mov cl,10
mov ax,si1
mov mot2,ax
mov len3,bl
con:
cmp di1,0
je zarb_ret
push bx
push si
mov dl,[di]
l1:
cmp si1,0
je l2
mov ch,mot
mov cl,[bx]
sub cl,'0'
add ch,cl
mov al,[si]
mov ah,0
mul dl
add al,ch
mov cl,10
div cl
mov mot,al
add ah,'0'
mov [bx],ah
dec bx
inc si
dec si1
jmp l1
l2: mov dx,mot2
mov si1,dx
mov al,mot
add al,'0'
mov [bx],al
mov mot,0
mov len3,bl
pop si
pop bx
dec bx
dec di1
inc di
jmp con
zarb_ret:lea ax,natigeh
add ax,19
mov bh,0
mov bl,len3
sub ax,bx
mov len3,al
ret
proc_zarb endp
;////////////////////////////
proc_div proc
mov count,0
mov al,byte ptr si1
mov len1,al
mov al,byte ptr di1
mov len2,al
lea si,oprand1
lea di,oprand2
call norm
mov mot2,si
mov mot3,di
;========
tagh_al1 :
mov ax,di1
cmp si1,ax
jg tagh1_1
cmp si1,ax
je tagh2
tagh_ret1:
call cout_taghsim
jmp tagh_ret
;==========
tagh2:mov cx,si1
lea si,oprand1
lea di,oprand2
add si,8
add di,8
tagh2_1:
mov al,[di]
cmp [si],al
jg tagh1
cmp [si],al
jl tagh_ret1
dec si
dec di
loop tagh2_1
inc count
jmp tagh_ret1
;==========
tagh1: mov di,mot3
mov si,mot2
tagh1_1:
mov len3,0
mov cx,di1
tagh3_2:
mov al,[di]
cmp [si],al
jge tagh3
mov bx,si
tagh3_6: mov ah,0
inc bx
cmp [bx],ah
jne tagh3_3
mov ah,9
mov [bx],ah
jmp tagh3_6
tagh3_3:
mov ah,1
sub [bx],ah
mov ah,10
add [si],ah
tagh3:
sub [si],al
inc si
inc di
loop tagh3_2
;==============
lea si,oprand1
add si,8
tagh5_3: mov ah,0
cmp [si],ah
jne tagh3_4
dec si
mov bx,si1
tagh5_2: mov al,[si]
mov [si+1],al
dec si
dec bx
cmp bx,0
jne tagh5_2
inc len3
dec si1
lea si,oprand1
add si,8
jmp tagh5_3
;==============
tagh3_4:
inc count
mov ax,65000
cmp count,ax
jne d2
mov count,0
inc ka_ge
d2: cmp si1,0
jne d1
jmp tagh_ret1
d1: mov si,mot2
mov di,mot3
mov ah,0
mov al,len3
add si,ax
mov len3,0
mov mot2,si
jmp tagh_al1
tagh_ret:
ret
proc_div endp
;////////////////////////////
norm proc
mov cx,9
add si,si1
sub cx,si1
mov si1,cx
mov cx,9
add di,di1
sub cx,di1
mov di1,cx
lea bx,natigeh
add bx,19
ret
norm endp
;////////////////////////////
cout1 proc
call cls2
mov col,27
mov row,5
mov cl,len3
mov ch,0
inc cx
mov mot,0
mov mot1,0
mov al,sign
call cout_ch
cout2:mov al,[bx]
cmp al,'0'
je cout_1
mov mot,1
cout_1:
cmp mot,0
jne cout4
inc mot1
jmp cout5
cout4:
call cout_ch
cout5:
inc bx
loop cout2
cout6: mov al,len3
inc al
cmp mot1,al
jne cout7
mov al,'0'
dec col
call cout_ch
cout7:
ret
cout1 endp
;////////////////////////////
cout_taghsim proc
mov col,27
mov row,5
call cls2
call start1
mov ah,0
mov ax,ka_ge
lea si,oprand1
add si,5
call bintoascy
lea si,oprand2
add si,4
mov ax,65000
call bintoascy
mov si1,4
mov di1,5
call proc_zarb
mov si,0
mov cx,9
a1:mov oprand2[si],0d
mov oprand1[si],0d
inc si
loop a1
mov ax,count
lea si,oprand2
add si,4
call bintoascy
mov ch,0
mov cl,len3
mov si,8
mov di,20
sub di,cx
di_ch:
mov al,natigeh[di]
sub al,'0'
mov oprand1[si],al
dec si
inc di
loop di_ch
mov si1,9
mov ah,0
mov al,len3
sub si1,ax
mov di1,4
call proc_jam
call cout1
ret
cout_taghsim endp
;////////////////////////////
cls2 proc
mov dh,5
mov dl,26
c1: mov al,' '
inc dl
call gotoxy
call cout
cmp dl,55
jne c1
ret
cls2 endp
;////////////////////////////
start proc
mov si1,0
mov di1,0
mov ka_ge,0
mov len1,0
mov len2,0
mov len3,0
mov mot3,0
mov mot2,0
mov mot1,0
mov mot,0
mov sign,0
mov operate,0
call start1
mov col,27
mov row,5
call cls2
ret
start endp
;=================
start1 proc
mov si,0
mov cx,9
res:
mov al,0
mov oprand1[si],al
mov oprand2[si],al
inc si
loop res
mov si,0
mov cx,20
res1:
mov al,'0'
mov natigeh[si],al
inc si
loop res1
ret
start1 endp
;////////////////////////////
bintoascy proc
mov bx,10
back:mov dx,0
div bx
mov [si],dl
inc si
cmp ax,0
ja back
ret
bintoascy endp
;///////////////////////////
cout_ch proc
mov dl,col
mov dh,row
call gotoxy
call cout
inc col
ret
cout_ch endp
;///////////////////////////
end calculator



اینهم برای دانلود
15731
exe شو از لینک های زیر دانلود کنند
[B]mohammadsarbandi@yahoo.com
mohammadsarbandi@gmail.com
http://sarbandi.persiangig.ir/CPP/

http://sarbandi.persiangig.ir/CPP/8-QUEENF.EXE
http://sarbandi.persiangig.ir/CPP/EIGH_QEENF1.EXE

taze_vared
شنبه 19 بهمن 1387, 11:00 صبح
.model small
.data
oprand1 db 9 dup(0)
oprand2 db 9 dup(0)
natigeh db 20 dup('0')
len1 db 0
len2 db 0
len3 db 0
col db 0
row db 0
mot db 0
mot2 dw 0
mot3 dw 0
ka_ge dw 0
count dw 0
si1 dw 0
di1 dw 0
sign db 0
operate db 0
ja0 db 'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ÄÄÄÄÄ¿','$'
ja1 db '³ ³','$'
ja2 db 'ÃÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄÂÄÄÄÄÄ ÄÄÄÄÄ´','$'
ja3 db '³ 1 ³ 2 ³ 3 ³ 4 ³ 5 ³','$'
ja4 db 'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ ÍÍÍÍÍ´','$'
ja5 db '³ 7 ³ 8 ³ 9 ³ 0 ³ esc ³','$'
ja6 db 'ÃÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍÅÍÍÍÍÍ ÍÍÍÍÍ´','$'
ja7 db '³ + ³ - ³ * ³ / ³ = ³','$'
ja8 db 'ÀÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍÁÍÍÍÍÍ ÍÍÍÍÍÙ',0ah,0dh,'$'
.code
calculator proc
;//////////////////////////////////////////
mov ax,@data
mov ds,ax
call cls
call shekl
calculatorp:
call amaliat
mov ah,00h
int 16h
cmp al,27
je calc_ret
call start
jmp calculatorp
calc_ret:
mov ah,4ch
int 21h
calculator endp
;/////////////////////////////////
cls proc
push ax
push bx
push cx
push dx
mov bl,0h
mov cx,0000h
mov dx,184fh
mov bh,07h
mov al,00h ;cls function
mov ah,06h
int 10h
mov dx,0000h
call gotoxy
pop dx
pop cx
pop bx
pop ax
ret
cls endp
;////////////////////////////
operatore proc
cmp al,'*'
jne opr1
jmp opr_ret
opr1:
cmp al,'+'
jne opr2
jmp opr_ret
opr2:
cmp al,'-'
jne opr3
jmp opr_ret
opr3: cmp al,'/'
jne opr_num
opr_ret: mov operate,al
call cout_char
mov mot,1
mov mot1,1
opr_num:
ret
operatore endp
;////////////////////////////
detect proc
cmp al,'9'
jg det_ret
cmp al,'0'
jl det_ret
call cout_char
sub al,'0'
mov [si],al
dec si
inc len1
det_ret:
ret
detect endp
;////////////////////////////
harekat proc
har: cmp mot1,0
jne har_ret2
cmp len1,9
je har_ret2
call getkey
call detect
cmp mot,0
jne har1
call operatore
har1:
cmp al,'='
je har_ret1
cmp al,27
je har_ret
jmp har
har_ret:
mov ah,4ch
int 21h
har_ret1:cmp mot,0
je har
har_ret2:
ret
harekat endp
;////////////////////////////////
amaliat proc
mov row,5
mov col,55
mov len1,0
mov operate ,0
lea si,oprand1
add si,8
mov mot,0
mov mot1,0
call harekat
mo2:
cmp operate,0
jne mo1
call getkey
call operatore
jmp mo2
mo1:
mov row,5
mov col,27
call cls2
mov row,5
mov col,55
mov si1,9
mov ax,word ptr len1
sub si1,ax
lea si,oprand2
add si,8
mov len1,0
mov mot1,0
call harekat
cmp al,'='
je play
ba:
mov ah,00h
int 16h
cmp al,'='
je play
cmp al,27
jne ba
mov ah,4ch
int 21h
play:
mov di1,9
mov ax,word ptr len1
sub di1,ax
mai2:
cmp operate ,'-'
jne kalc1
kalc_a:
call proc_sub
call cout1
jmp exit
kalc1:cmp operate ,'/'
jne kalc2
kalc1_s:
call proc_div
jmp exit
kalc2:
cmp operate ,'*'
jne kalc3
call proc_zarb
call cout1
jmp exit
kalc3: cmp operate ,'+'
jne exit
call proc_jam
call cout1
exit:
ret
amaliat endp
;//////////////////////////////
cout_char proc
mov ah,0
push ax
mov ch,0
mov cl,len1
sub col,cl
mov dh,row
mov dl,col
inc dl
call gotoxy
c_char:
cmp cx,0
je c_char1
call re_makan
mov dl,col
call gotoxy
call cout
add dl,2
mov col,dl
dec col
call gotoxy
dec cx
jmp c_char
c_char1:
pop ax
mov dh,5
mov dl,55
call gotoxy
call cout
ret
cout_char endp
;/////////////////////////////
shekl proc
push ax
push cx
push dx
mov dl,26
mov dh,4
mov col,dl
mov row,dh
call gotoxy
mov cx,9
lea dx,ja0
jad: mov ah,09h
int 21h
add dx,32
push dx
inc row
mov dh,row
mov dl,col
call gotoxy
pop dx
loop jad
pop dx
pop cx
pop ax
ret
shekl endp
;////////////////////////////
gotoxy proc
mov ah,02h
int 10h
ret
gotoxy endp
;////////////////////////////
cout proc
mov ah,0eh
int 10h
ret
cout endp
;////////////////////////////
getkey proc
mov ah,07h
int 21h
ret
getkey endp
;////////////////////////////
re_makan proc
mov ah,08h
int 10h
ret
re_makan endp
;////////////////////////////
proc_jam proc
mov mot,0
mov len3,0
lea si,oprand1
lea di,oprand2
call norm
mov cx,9
jam_2: cmp si1,0
jg jam7
mov al,0
jmp jams
jam7: mov al,[si]
jams:mov ah,0
cmp di1,0
jle jamd
mov ah,[di]
jamd:
add ah,al
add ah,mot
mov mot,0
cmp ah,10
jl jam1
sub ah,10
mov mot,1
jmp jam3
jam1:
mov mot,0
jam3:
add ah,'0'
mov [bx],ah
inc len3
inc si
inc di
dec bx
dec si1
dec di1
loop jam_2
jam_cha:mov al,mot
add al,'0'
mov [bx],al
ret
proc_jam endp
;//////////////////////////////
proc_sub proc
mov mot,0
mov di,si1
cmp di,di1
jg menha0_3
cmp di,di1
jl menha_1
lea si,oprand1
add si,8
lea di,oprand2
add di,8
menha0_4:
mov al,[di]
cmp [si],al
jl menha0_3
dec si
dec di
loop menha0_4
jmp menha_1
menha0_3:
mov al,operate
mov sign,al
mov di,si1
mov si,di1
mov si1,si
mov di1,di
lea si,oprand2
lea di,oprand1
jmp menha_2
menha_1:
lea si,oprand1
lea di,oprand2
menha_2:
mov len3,0
call norm
mov cx,si1
menha2:
cmp di1,0
jg menha3
mov al,0
jmp men1
menha3:mov al,[di]
men1:
mov ah,0
cmp si1,0
jg menha6
jmp menha_ret
menha6: mov ah,[si]
inc len3
cmp ah,al
jge menha1_1
mov mot2,si
menha3_6:mov dl,0
inc si
cmp [si],dl
jne menha3_3
mov dl,9
mov [si],dl
jmp menha3_6
menha3_3:mov dl,1
sub [si],dl
mov si,mot2
add ah,10
jmp menha1_1
menha1_1:
sub ah,al
add ah,'0'
mov [bx],ah
inc si
inc di
dec bx
dec si1
dec di1
loop menha2
menha_ret:
ret
proc_sub endp
;////////////////////////////
proc_zarb proc
lea si,oprand1
lea di,oprand2
call norm
mov mot,0
mov cl,10
mov ax,si1
mov mot2,ax
mov len3,bl
con:
cmp di1,0
je zarb_ret
push bx
push si
mov dl,[di]
l1:
cmp si1,0
je l2
mov ch,mot
mov cl,[bx]
sub cl,'0'
add ch,cl
mov al,[si]
mov ah,0
mul dl
add al,ch
mov cl,10
div cl
mov mot,al
add ah,'0'
mov [bx],ah
dec bx
inc si
dec si1
jmp l1
l2: mov dx,mot2
mov si1,dx
mov al,mot
add al,'0'
mov [bx],al
mov mot,0
mov len3,bl
pop si
pop bx
dec bx
dec di1
inc di
jmp con
zarb_ret:lea ax,natigeh
add ax,19
mov bh,0
mov bl,len3
sub ax,bx
mov len3,al
ret
proc_zarb endp
;////////////////////////////
proc_div proc
mov count,0
mov al,byte ptr si1
mov len1,al
mov al,byte ptr di1
mov len2,al
lea si,oprand1
lea di,oprand2
call norm
mov mot2,si
mov mot3,di
;========
tagh_al1 :
mov ax,di1
cmp si1,ax
jg tagh1_1
cmp si1,ax
je tagh2
tagh_ret1:
call cout_taghsim
jmp tagh_ret
;==========
tagh2:mov cx,si1
lea si,oprand1
lea di,oprand2
add si,8
add di,8
tagh2_1:
mov al,[di]
cmp [si],al
jg tagh1
cmp [si],al
jl tagh_ret1
dec si
dec di
loop tagh2_1
inc count
jmp tagh_ret1
;==========
tagh1: mov di,mot3
mov si,mot2
tagh1_1:
mov len3,0
mov cx,di1
tagh3_2:
mov al,[di]
cmp [si],al
jge tagh3
mov bx,si
tagh3_6: mov ah,0
inc bx
cmp [bx],ah
jne tagh3_3
mov ah,9
mov [bx],ah
jmp tagh3_6
tagh3_3:
mov ah,1
sub [bx],ah
mov ah,10
add [si],ah
tagh3:
sub [si],al
inc si
inc di
loop tagh3_2
;==============
lea si,oprand1
add si,8
tagh5_3: mov ah,0
cmp [si],ah
jne tagh3_4
dec si
mov bx,si1
tagh5_2: mov al,[si]
mov [si+1],al
dec si
dec bx
cmp bx,0
jne tagh5_2
inc len3
dec si1
lea si,oprand1
add si,8
jmp tagh5_3
;==============
tagh3_4:
inc count
mov ax,65000
cmp count,ax
jne d2
mov count,0
inc ka_ge
d2: cmp si1,0
jne d1
jmp tagh_ret1
d1: mov si,mot2
mov di,mot3
mov ah,0
mov al,len3
add si,ax
mov len3,0
mov mot2,si
jmp tagh_al1
tagh_ret:
ret
proc_div endp
;////////////////////////////
norm proc
mov cx,9
add si,si1
sub cx,si1
mov si1,cx
mov cx,9
add di,di1
sub cx,di1
mov di1,cx
lea bx,natigeh
add bx,19
ret
norm endp
;////////////////////////////
cout1 proc
call cls2
mov col,27
mov row,5
mov cl,len3
mov ch,0
inc cx
mov mot,0
mov mot1,0
mov al,sign
call cout_ch
cout2:mov al,
cmp al,'0'
je cout_1
mov mot,1
cout_1:
cmp mot,0
jne cout4
inc mot1
jmp cout5
cout4:
call cout_ch
cout5:
inc bx
loop cout2
cout6: mov al,len3
inc al
cmp mot1,al
jne cout7
mov al,'0'
dec col
call cout_ch
cout7:
ret
cout1 endp
;////////////////////////////
cout_taghsim proc
mov col,27
mov row,5
call cls2
call start1
mov ah,0
mov ax,ka_ge
lea si,oprand1
add si,5
call bintoascy
lea si,oprand2
add si,4
mov ax,65000
call bintoascy
mov si1,4
mov di1,5
call proc_zarb
mov si,0
mov cx,9
a1:mov oprand2[si],0d
mov oprand1[si],0d
inc si
loop a1
mov ax,count
lea si,oprand2
add si,4
call bintoascy
mov ch,0
mov cl,len3
mov si,8
mov di,20
sub di,cx
di_ch:
mov al,natigeh[di]
sub al,'0'
mov oprand1[si],al
dec si
inc di
loop di_ch
mov si1,9
mov ah,0
mov al,len3
sub si1,ax
mov di1,4
call proc_jam
call cout1
ret
cout_taghsim endp
;////////////////////////////
cls2 proc
mov dh,5
mov dl,26
c1: mov al,' '
inc dl
call gotoxy
call cout
cmp dl,55
jne c1
ret
cls2 endp
;////////////////////////////
start proc
mov si1,0
mov di1,0
mov ka_ge,0
mov len1,0
mov len2,0
mov len3,0
mov mot3,0
mov mot2,0
mov mot1,0
mov mot,0
mov sign,0
mov operate,0
call start1
mov col,27
mov row,5
call cls2
ret
start endp
;=================
start1 proc
mov si,0
mov cx,9
res:
mov al,0
mov oprand1[si],al
mov oprand2[si],al
inc si
loop res
mov si,0
mov cx,20
res1:
mov al,'0'
mov natigeh[si],al
inc si
loop res1
ret
start1 endp
;////////////////////////////
bintoascy proc
mov bx,10
back:mov dx,0
div bx
mov [si],dl
inc si
cmp ax,0
ja back
ret
bintoascy endp
;///////////////////////////
cout_ch proc
mov dl,col
mov dh,row
call gotoxy
call cout
inc col
ret
cout_ch endp
;///////////////////////////
end calculator



اینهم برای دانلود
15731
exe شو از لینک های زیر دانلود کنند
[B]mohammadsarbandi@yahoo.com
mohammadsarbandi@gmail.com
http://sarbandi.persiangig.ir/CPP/

http://sarbandi.persiangig.ir/CPP/8-QUEENF.EXE
http://sarbandi.persiangig.ir/CPP/EIGH_QEENF1.EXE

بچه ها لطف میکنید این برنامه رو برای من توضیح بدید؟(مخصوصا قسمت های قرمز)
یه چیز دیگه من وقتی خودم یه تابع ضرب یا جمع نوشتم وقتی با cx و dx و...کار کردم حداکثر عددم تا 5 رقم میتونست باشه..اینجا چطوری تا 8 رقم رفته؟

taze_vared
شنبه 19 بهمن 1387, 12:27 عصر
یکی کمک کنه لطفا

محمدامین شریفی
جمعه 29 خرداد 1388, 02:19 صبح
بچه ها، یکی می تونه بگه معنی متغییر های mot1,ka_ge,si1 [پست 18 هست]چی میشه؟
در ضمن .386 در 8086 کار نمیکنه؟دلیلش چیه؟