ورود

View Full Version : درخواست كمك فوري توضيح چند خط از برنامه ماشين حساب زير



oranoos_mt
جمعه 27 خرداد 1390, 13:57 عصر
سلام. من تو خطهاي زير از برنامه مشكل دارم. لطفا كمك كنيد خيلي واجبه

1) dalile pop kardane ax bx dx (khate 36-38)
2) khate 48 : chera mul si? va inke chetori si ba bx zarb mishe?
3) 51 : chera sub dl,48 ?
setare_asemooniii: 52 : chera add ax,dx ?
4) chera div si ? va chera natije mire dakhele bx ?
5) 73 : chera or ax,ax ?
6) 76 : chera add dl,48 ?
7) 80 : mov byte ptr[bx],$ manzoor az $ chiye? karesh chiye


data segment
temp db 10 dup(0)
str db 'Please Enter Number1:',"$"
str1 db 'Please Enter Operator:',"$"
str2 db 'Please Enter Number2:' ,"$"
str3 db 'result:',"$"
str4 db 'invalid operator',"$"
num1 dw ?
num2 dw ?
result dw ?
operator db ?
data ends

code segment
assume cs:code,ds:data
;------------------------------------getnumber-------------------------------------------------------------------------------------------
getnum proc
push ax
push bx
push dx
again: mov ah,8
int 21h
cmp al,13
je finish
cmp al,'0'
jl again
cmp al,'9'
jg again
mov [bx],al
inc bx
mov dl,al
mov ah,2
int 21h
jmp again
finish:mov [bx],al
pop dx
pop bx
pop ax
ret
getnum endp
;-------------------------------------------asctobin-------------------------------------------
asctobin proc
push bx
push si
push dx
mov si,10
mov ax,0
next: mul si
mov dl,[bx]
inc bx
sub dl,48
add ax,dx
cmp byte ptr[bx],13
jne next
pop dx
pop si
pop bx
ret
asctobin endp
;------------------------------------------bintoasc-----------------------------------------------
bintoasc proc
push cx
push dx
push si
push bx
push ax
mov si,10
xor cx,cx
next2: xor dx,dx
div si
push dx
inc cx
or ax,ax
jnz next2
l1: pop dx
add dl,48
mov [bx],dl
inc bx
loop l1
mov byte ptr[bx],'$'
pop ax
pop bx
pop si
pop dx
pop cx
ret
bintoasc endp
;------------------------------------------------amaliat---------------------------------------------------
amaliat proc
mov ax,num1
mov bx,num2
mov dl,operator
cmp dl,'+'
jne menha
add ax,bx
ret
menha: cmp dl,'-'
jne zarb
sub ax,bx
ret
zarb: cmp dl,'*'
jne taghsim
mul bx
ret
taghsim: cmp dl,'/'
jne invalid
sub dx,dx
div bx
ret
invalid:
lea dx,str4
mov ah,9h
int 21h

ret
amaliat endp
;------------------------------------------------------------MAIN---------------------------------------------------------
main proc
mov ax,data
mov ds,ax

lea dx,str
mov ah,9h
int 21h
lea bx,temp
call getnum
call asctobin
mov num1,ax

lea dx,str1
mov ah,9h
int 21h

mov ah,1
int 21h
mov operator,al

lea dx,str2
mov ah,9h
int 21h

call getnum
call asctobin
mov num2,ax
call amaliat
mov result,ax


lea dx,str3
mov ah,9h
int 21h


mov ax,result
call bintoasc
mov dx,bx
mov ah,9
int 21h

;************************************************* ****************
;exit
mov ah,4ch
int 21h
main endp
code ends
end main

oranoos_mt
جمعه 27 خرداد 1390, 23:55 عصر
خواهشا يكي كمكم كنه.
بدجوري لنگم :گریه:

xman_1365_x
شنبه 28 خرداد 1390, 09:44 صبح
0-فارسي تايپ كنيد!(ويرايش كنيد پستتون رو) و پروژه دانشجويي رو خودتون زحمت بكشيد.
1-دليلش براي ذخيره كردن ثبات هاي مذكور هست (شايد بعد از اين تابع بهشون نياز باشه نمي خوايم مقدارشون با فراخواني تابع و در تابع تغيير كنه)كه با push كردن در خط هاي 18-20 ثبات هارو در پشته ذخيره ميكنه و در پايان تابع مقادير اون ثبات هارو از پشته فراخواني ميكنه
2-چرا كه نه؟ با اون ضرب نميشه جمع ميشه!
كار اون پروسيجر اينه كه براي تبديل كردن رشته عددي كه گرفتيم تبديل كنيم به عدد تا بتونيم راحت محاسبات رو انجام بديم!براي اين كارم ميدونيم هر رقم ارزش مكاني داره و براي اين اومده در 10 ضرب كرده و چك ميكنه آخر رشت به اينتر رسيده يا نه تا زماني كه نرسيده در 10 ضرب و با رقم هاي وارد شده جمع ميكنه
3-براي تبديل اسكي به باينري و بلعكسش بايد با اون جمع كنيد!(كاربردش اينه شما براي محاسبات نياز به باينري دارين و براي اينكه بتونين روي صفحه نمايش نشون بدين به كد اسكي اون عدد نياز دارين)
خط 52 حد اقل قبلش آي دي بنده خدا رو پاك ميكردين:لبخند: اين خط براي جمع كردن رقم هاي وارد شده و جمع با ارزش مكاني عدد هست كه بالا توضيح دادم.
4-خوب بلعكس پروسيجر قبلي هست براي اينكه ارزش مكاني بدست بياره و عدد رو رقم رقم جدا كنه تا بتونه توي صفحه نمايش نشون بده بايد بر 1ده تقسيم كنه و اينكه نتيجه داخل bx نميره بلكه bx اشارهگر هست كه آدرس temp رو در خودش داره كه در پروسيجر main تعريف شده و مقدير رو بعد از تبديل به اسكي در اون ذخيره ميكنه تا بعد نمايش بده
5-وقتي داريم برعكس انجام ميديم براي اينكه متوجه شيم رقم هامون تموم شده و ديگه نبايد تقسيم كنيم(شرط پايان حلقه) موقعي هست كه ax صفر ميشه
(اگر متوجه نشدين ميتونيد يك عدد رو متوالي بر ده تقسيم كنيد ببينيد كي صفر ميشه)
6-قبلا گفتم براي تبديل باينري به اسكي تا بشه روي صفحه نمايش داد(ترس نداشته باشين اون خط رو كامنت كنيد ببنيد چه چيزي چاپ ميشه:چشمک:
7-منظوري نداره شما ببخشيد، براي چاپ كردن رشته روي صفحه با وقفه int21,ah=9 پايان رشته كاراكتر دالر هست پس از جايي كه آدرس temp هست تا زماني كه به دالر برسه برروي صفحه نمايش ميده اگر ميخواست اين كارو انجام نده بايد يكي يكي هر كاراكتر رو نمايش ميداد و لي بايد طول رشترو ميدونستيم كه اين روش كندتر هست و با وقفه int32,ah=2 انجام ميشه
مزاح هايي هم كه در متن بود براي لبخند زدن پس دلگير نشين
موفق باشي

oranoos_mt
شنبه 28 خرداد 1390, 11:56 صبح
0-فارسي تايپ كنيد!(ويرايش كنيد پستتون رو) و پروژه دانشجويي رو خودتون زحمت بكشيد.
1-دليلش براي ذخيره كردن ثبات هاي مذكور هست (شايد بعد از اين تابع بهشون نياز باشه نمي خوايم مقدارشون با فراخواني تابع و در تابع تغيير كنه)كه با push كردن در خط هاي 18-20 ثبات هارو در پشته ذخيره ميكنه و در پايان تابع مقادير اون ثبات هارو از پشته فراخواني ميكنه
2-چرا كه نه؟ با اون ضرب نميشه جمع ميشه!
كار اون پروسيجر اينه كه براي تبديل كردن رشته عددي كه گرفتيم تبديل كنيم به عدد تا بتونيم راحت محاسبات رو انجام بديم!براي اين كارم ميدونيم هر رقم ارزش مكاني داره و براي اين اومده در 10 ضرب كرده و چك ميكنه آخر رشت به اينتر رسيده يا نه تا زماني كه نرسيده در 10 ضرب و با رقم هاي وارد شده جمع ميكنه
3-براي تبديل اسكي به باينري و بلعكسش بايد با اون جمع كنيد!(كاربردش اينه شما براي محاسبات نياز به باينري دارين و براي اينكه بتونين روي صفحه نمايش نشون بدين به كد اسكي اون عدد نياز دارين)
خط 52 حد اقل قبلش آي دي بنده خدا رو پاك ميكردين:لبخند: اين خط براي جمع كردن رقم هاي وارد شده و جمع با ارزش مكاني عدد هست كه بالا توضيح دادم.
4-خوب بلعكس پروسيجر قبلي هست براي اينكه ارزش مكاني بدست بياره و عدد رو رقم رقم جدا كنه تا بتونه توي صفحه نمايش نشون بده بايد بر 1ده تقسيم كنه و اينكه نتيجه داخل bx نميره بلكه bx اشارهگر هست كه آدرس temp رو در خودش داره كه در پروسيجر main تعريف شده و مقدير رو بعد از تبديل به اسكي در اون ذخيره ميكنه تا بعد نمايش بده
5-وقتي داريم برعكس انجام ميديم براي اينكه متوجه شيم رقم هامون تموم شده و ديگه نبايد تقسيم كنيم(شرط پايان حلقه) موقعي هست كه ax صفر ميشه
(اگر متوجه نشدين ميتونيد يك عدد رو متوالي بر ده تقسيم كنيد ببينيد كي صفر ميشه)
6-قبلا گفتم براي تبديل باينري به اسكي تا بشه روي صفحه نمايش داد(ترس نداشته باشين اون خط رو كامنت كنيد ببنيد چه چيزي چاپ ميشه:چشمک:
7-منظوري نداره شما ببخشيد، براي چاپ كردن رشته روي صفحه با وقفه int21,ah=9 پايان رشته كاراكتر دالر هست پس از جايي كه آدرس temp هست تا زماني كه به دالر برسه برروي صفحه نمايش ميده اگر ميخواست اين كارو انجام نده بايد يكي يكي هر كاراكتر رو نمايش ميداد و لي بايد طول رشترو ميدونستيم كه اين روش كندتر هست و با وقفه int32,ah=2 انجام ميشه
مزاح هايي هم كه در متن بود براي لبخند زدن پس دلگير نشين
موفق باشي

مرسي واقعا.
خيلي مفيد و كامل بود. ممنون
ببخشيد باز يه مشكلي:
چرا وقتي مينويسيم mul si ميگيد جمع ميشه؟ مگه mul ضرب نيست؟ هميشه mul si در 10 ضرب ميشه؟ و اينكه هميشه mul si با bx جمع ميشه؟ حالا چرا bx؟ چرا dx نه؟

براي div si هم همينطور. چرا div si داخل اشاره گر bx ميره؟
آيا همه اينها برميگرده به push كردن اين متغيرها؟

xman_1365_x
شنبه 28 خرداد 1390, 22:04 عصر
ببخشيد باز يه مشكلي:
چرا وقتي مينويسيم mul si ميگيد جمع ميشه؟ مگه mul ضرب نيست؟ هميشه mul si در 10 ضرب ميشه؟ و اينكه هميشه mul si با bx جمع ميشه؟ حالا چرا bx؟ چرا dx نه؟

براي div si هم همينطور. چرا div si داخل اشاره گر bx ميره؟
آيا همه اينها برميگرده به push كردن اين متغيرها؟ سوال شما اين بود(كه اديت هم نكردين :اشتباه:)

2) khate 48 : chera mul si? va inke chetori si ba bx zarb mishe?كد قسمت مربوطه


mov si,10
mov ax,0
next: mul si
mov dl,[bx]
inc bx
sub dl,48
add ax,dx
cmp byte ptr[bx],13
jne next

اين قسمت مجموعه اي از دستورات هست و نه يك دستور
توضيحات من كافي بود شما دقت نكردين، ببينيد درسته كه mul ضرب هست و داره تا زماني كه شرط به پايان نرسيده ax*si ضرب ميشه اما اين بين اگر هزار بارم در ax=0 ضرب كنيم ax=0 ميمونه حالا در خط هاي بعد يك كاراكتر از رشته اي كه داشتيم ميريزه توي dl و اون رو از 48 كم ميكنه تبديل به عدد ميشه و حالا اين با ax+dl جمع مي كنه و حالا ax نامساوي با صفر و در شروع مجدد در 10 هم ضرب ميشه تا وقتي كه به كد اسكي اينتر برسه نتيجه حاصل عددي كه شما به صورت رشته كاراكتري وارد كرده بودين هست.
براي درك بهتر شما و دوستان ديگر بزارين اينم بگم براي مثال شما يك رشته دريافت كردين


temp db '1','2','3'
temp2 db "123"

دو كد بالا يكسان هست و اينها به عنوان مثال رشته كاراكتري هست كه شما با وقفه دريافت كردين
حالا اين ها با كد اسكي در حافظه به صورت بايت هاي پشت هم قرار ميگيرند يعني


temp db 49,50,52
temp2 db 49,50,52

حالا براي تبديل اول ميايم از 48 كم مي كنيم تا معادل عددي بشه كم كنيد ميبينيد!
ولي مشكل بعد چيه؟ اونها عدد هايي تك رقمي و جدا از هم هستن كه
(1*10^2)+(2*10^1)+(10^0+3)=123
پس خروجي برنامه شما همينه و بعد از اينكه شما محاسبات رو انجام ميدين بخواين روي صفحه نمايش نشون بدين همين روند رو معكوس ميكنيم بر 10 تقسيم ميكنيم و با 48 جمع و بعد نمايش ميديم همين

موفق باشي