ورود

View Full Version : مشکل در برنامه ی محاسبه فاکتوریل



اسمبلی
پنج شنبه 28 مهر 1390, 14:17 عصر
سلام و خسته نباشید

من یه برنامه برای محاسبه فاکتوریل اعداد یک رقمی نوشتم

برای همه ی اعداد جواب میده فقط فاکتوریل 9 رو اشتباه جواب میده یعنی چون جواب فاکتوریل 9 میشه 362880 که یه عدد 6 رقمی هستش رو اشتباها یه عدد 5 رقمی می نویسه

من کد برنامه رو می ذارم خواهش می کنم کمکم کنید و بهم بگید که چیکارش کنم. خیلی براش زحمت کشیدم اگه راه حلش رو می دونید تورو خدا ازم دریغ نکنید.

با سپاس فراوان:لبخندساده:


page 110,100
title 'fact.asm'
;--------------------------------------
stacksg segment stack 'stack'
dw 32h dup(0)
stacksg ends
;-----------------------------------------
; 2-define data segment
; ----------------------------------
datasg segment 'data'
fact dw ?
string db 6 dup(' '),"$"
datasg ends
;-----------------------------------------
; 3-define code segment
; ----------------------------------
codesg segment 'code'
assume ss:stacksg,ds:datasg,cs:codesg
main proc far
mov ax,datasg
mov ds,ax
;----------------------------------------------
mov ah,1h
int 21h
mov ah,0
sub ax,30h
mov fact,1
mov bx,ax
mov ax,1
while: cmp fact,bx
jnle end_while
mul fact
inc fact
jmp while
end_while:

;-------------------------------------
lea bx,string
add bx,5
mov cx,10
divloop: mov dx,0
div cx
add dl,30h
mov [bx],dl
dec bx
cmp ax,0
jne divloop
lea dx,string
mov ah,9h
int 21h
;mov dx,fact
;mov ah,2h
;int 21h
;--------------------------------------
mov ax,4c00h
int 21h
main endp
codesg ends
end main

unknown.unforgiven
پنج شنبه 28 مهر 1390, 14:54 عصر
سلام
متغیر fact رو یه متیر 16 بیتی یا دو بایتی در نظر گرفتید که همین باعث مشکل میشه، چون متغیر های دو بایتی میتونن حداکثر عدد 65535 رو داشته باشن. چون !9 بیشتر از 65535 هستش از این روش نمیتونید استفاده بکنید. میتونید از روش آرایه ای استفاده بکنید

اسمبلی
پنج شنبه 28 مهر 1390, 15:13 عصر
سلام

خیلی ممنون از پاسخت

ولی میشه یکم بیشتر توضیح بدی؟؟

یعنی برای ساختن آرایه باید چیکار کنم؟ آخه ما تو اسمبلی آرایه رو هنوز نخوندیم ...

unknown.unforgiven
پنج شنبه 28 مهر 1390, 17:57 عصر
روش ساخت آرایه:

arrayName dw n dup(value)
arrayName اسم آرایه است، dw نوع آرایه رو تعیین میکنه و میتونه سایر مواردی مثل db و ... باشه، n طول آرایه رو مشخص میکنه، dup کلمه کلیدیه، value هم مقدار پیش فرض درایه های آرایه است برای مثال 1، 2، ?، 'S'، '$' و ...

اسمبلی
پنج شنبه 28 مهر 1390, 18:24 عصر
ممنون از کدی که گذاشتین
من این کد رو در جایی که متغیر fact رو تعریف کردم گذاشتم
به این صورت

fact dw 32h dup(0)

که fact اسم آرایه هستش
ولی بازم جواب نمیده ، البته نمی دونم کد رو درست نوشتم یا نه؟ و اینکه آیا در جای مناسبی نوشتم یا نه؟

unknown.unforgiven
پنج شنبه 28 مهر 1390, 23:36 عصر
1.

fact dw 32h dup(0)
نمیدونم میشه طول آرایه رو بر حسب hex داد یا نه. تو یه برنامه دیگه امتحان کن ببین میشه یا نه؟ نتیجه رو به منم بگی ممنون میشم

2. انتظار نداشته باش فقط با آرایه کردن از برنامت جواب بگیری! باید یه سری تغییرات توش ایجاد بکنی. یه توضیح کوچیک میدم بقیش با خودت. فرض کن میخوای 45 رو در 78 ضرب بکنی. عدد 78 رو به صورت آرایه فرض کن، یعنی 8 و 7. اول از همه اون عددی که میخوای ضرب بشه رو به تمام درایه ها ضرب کن، یعنی 8*45 و 7*45 که میشه 360 و 315. حالا شروع کن عمل 10 بر یک رو از درایه راست انجام بده که میشه 0 و 351. دوباره این کار رو انجام میدیم و نتیجه میشه 0 و 1 و 35 (به درایه ها 1 دونه اضافه میشه). باز دوباره 10 بر یک میکنی که میشه 0 و 1 و 5 و 3. اگه دقت کرده باشی تو مرحله آخر تعداد درایه میشه به تعداد رقم حاصل ضرب. اگر این درایه ها رو پیش هم بچینی میشه عددت که تو این مثالی که زدم میشه 3510 که همون نتیجه ضرب 45*78 هستش

اسمبلی
جمعه 29 مهر 1390, 13:34 عصر
سلام

ممنون از راهنمائیت

من هر کاری می کنم درست نمیشه که نمیشه!

میشه کمکم کنی و بگی که کجای برنامه ام رو باید تغییر بدم؟ دیگه کلافه شدم از بس تغییرش دادم و درست نشد.

خواهش می کنم اگه امکانش هست کمکم کن...

unknown.unforgiven
جمعه 29 مهر 1390, 22:54 عصر
اینو باید تغییر بدی

mov fact,1
mov bx,ax
mov ax,1
while: cmp fact,bx
jnle end_while
mul fact
inc fact
jmp while
end_while:
بخش چاپ رو هم باید تغییر بدی. البته فعلاً اون تیکه ی بالا رو درست بکن بعد برو سراغ تیکه چاپ. این کد رو یه نگاهی بنداز:
int fact[6]={0,0,0,0,0,1};
for(int i=2;i<n;i++)
{
for(int j=0;j<6;j++)
fact[j]*=i;
for(int j=5;j>0;j--)
{
fact[j-1]+=fact/10;
fact[j]%=10;
}
}
for(int i=0;i<6;i++)
cout<<fact[i];
6 که طول آرایه است، تعداد ارقام عدد !n رو تعیین میکنه

xman_1365_x
شنبه 30 مهر 1390, 18:45 عصر
من کد برنامه رو می ذارم خواهش می کنم کمکم کنید و بهم بگید که چیکارش کنم. خیلی براش زحمت کشیدم اگه راه حلش رو می دونید تورو خدا ازم دریغ نکنید.

راستش این روزا حالی نیست... اما پستت رو خوندم بعد دیدم قسم دادی نشد بی تفاوت رد شم،انشاالله دیگه سر چیزای کوچیک قسم ندی کسی رو



من یه برنامه برای محاسبه فاکتوریل اعداد یک رقمی نوشتم

برای همه ی اعداد جواب میده فقط فاکتوریل 9 رو اشتباه جواب میده یعنی چون جواب فاکتوریل 9 میشه 362880 که یه عدد 6 رقمی هستش رو اشتباها یه عدد 5 رقمی می نویسه

آرایه یه این صورت که برای هر کاراکتر یک بایت و حافظه زیادی هدر میشه و روش خوبی نیست
برای شما چون فقط یک رقمی میخواین حساب کنید یک دابل ورد کافیه
برنامه شما قسمت محاسبه فاکتوریل نتیجش درسته اما در نمایش دادنش اشتباه میکنید
وقتی ضرب میکنید حاصل ضرب دو عدد 16 بیتی 32 بیتی میشه که در dx:ax ریخته میشه
حالا شما در محاسبه فاکتوریل dx = 0
بعد برای نمایش یک شرط بزار اگر dx != 0 یعنی عدد 32 بیتی شده (dx:ax) پس با تقسیم بر 10 عدد هارو جدا کنید و نمایش بدین
در غیر اینصورت فقط ax رو تبدیل و نمایش بدین
موفق باشی

xman_1365_x
یک شنبه 01 آبان 1390, 05:24 صبح
تا الان بیدار بودم گفتم براتون بنویسم، از این کد استفاده کنید.


define value:
x dd 362880
code:
push -1

mov dx,x+2
mov ax,x
again:
mov bx,10
div bx
push dx
xor dx,dx
cmp ax,0
jne again

display:
pop dx
cmp dx,-1
je endshow
add dx,30h
je endsho
mov ah,2
int 21h
jmp display

endshow:

موفق باشی

اسمبلی
پنج شنبه 05 آبان 1390, 11:57 صبح
سلام

دوستان ممنون ، مشکلم کل شد.... :لبخندساده: