View Full Version : برنامه عدد اول پنجاه بار کد نویسی شد کمک!
MORTAL4U
چهارشنبه 29 خرداد 1387, 09:01 صبح
متاسفانه من در نوشتن یک برنامه ناکام موندم!
برنامه این هست : عددی رو بگیره و تو خروجی نمایش بده اول هست یا نه.
من 1هفتس دارم کتابو زیرو رو میکنم و شاید اگه بگم 20_30 بار کدنویسی رو عوض کردم و از نو نوشتم بیراه نگفته باشم ، الان با یک مشکل برخورد کردم که تو ساختن فایل .obj از من اررور سرور میگیره و میگه عملوند ها تاپیشون مچ نیست من نمیدونم مشکل از کجاست اگه ممکنه منو راهنمایی کنید (خودم احتما میدم در قسمت حلقه ایراد هست چون من دقیقا متوجه نشدم وقتی ثبات bx بر ax تقسیم میشه )
1_آیا جواب که باقی مونده که تو ah قرار میگیره ax از بین میره؟(خودم احتمال 99.9% میدم که بله)
2_ آیا میشه به جز ثبات bx از محلی از حافظه بعنوان تقسیم استفاده کرد یا نه و به اون عدد هم بشه اضافه کرد (inc) ؟
3_وقتی مثلا ما عدد 5 رو ثبات bx کپی میکنیم فرقی داره تو دستور div از bx استفاده کنیم یا از [bx] چون هم آدرس و هم محل عدد 5 هست درسته؟
کد برنامه هم اینجاست ممنون میشم توضیح بدین اررور برای چی هست و کجای برنامه
include io.h
stack1 segment stack
dw 120h dup(?)
stack1 ends
data1 segment
str db 80 dup(?)
SUM DB 80 DUP(?)
NUM DB 80 DUP(?)
msg1 db "Prime",0
msg2 db "NotPrime",0
data1 ends
code1 segment
assume ds:data1 , cs:code1
start: mov ax,seg data1
mov dS,ax
inputs str , 80
atoi str
MOV SUM,0
MOV BX,2
MOV NUM,AX
mov SUM,ax
SUB SUM,2
mov cx,SUM
L1: JCXZ PRIME
Idiv BX
JZ NOTPRIME
MOV AX,NUM
INC BX
loopNZ L1
PRIME: output msg1
jmp QUIT
NOTPRIME: output msg2
QUIT: mov ax,4c00h
int 21h
code1 ends
end start
hoax3r
چهارشنبه 29 خرداد 1387, 11:09 صبح
سلام
بیشترین مشکلات برنامه مرویوط به اندازه نبودن متغییر ها و ثباتهاست
مثل اینا ثباتها دو بایتی هستن ولی متغییر ها یک بایت
MOV NUM,AX
mov SUM,ax
mov cx,SUM
...
...
مورد بعدی تقسیمتون هست ، چون bx دو بایتی هست دیگه ax نیست که تقسیم میشه
بلکه ترکیب dx:ax که مقسوم قرار میگیره، اگه فقط از ax میخواین استفاده کنین dx رو صفر
کنید تا مطمعن بشین از این نظر مشکلی پیش نمیاد
در مورد سوالاتون
1- در بالا گفتم اینجا چون bx دو بایتی هست باقیمانده بجای ah تو dx قرار میگیره
2 - بله میشه
3 - فرق داره ، از همون bx استفاده کنین، وقتی بصورت [bx] استفاده بشه در واقع شما اینو استفاده کردی [ds:[bx
MORTAL4U
چهارشنبه 29 خرداد 1387, 11:37 صبح
سلام
بیشترین مشکلات برنامه مرویوط به اندازه نبودن متغییر ها و ثباتهاست
مثل اینا ثباتها دو بایتی هستن ولی متغییر ها یک بایت
MOV NUM,AX
mov SUM,ax
mov cx,SUM
...
...
مورد بعدی تقسیمتون هست ، چون bx دو بایتی هست دیگه ax نیست که تقسیم میشه
بلکه ترکیب dx:ax که مقسوم قرار میگیره، اگه فقط از ax میخواین استفاده کنین dx رو صفر
کنید تا مطمعن بشین از این نظر مشکلی پیش نمیاد
در مورد سوالاتون
1- در بالا گفتم اینجا چون bx دو بایتی هست باقیمانده بجای ah تو dx قرار میگیره
2 - بله میشه
3 - فرق داره ، از همون bx استفاده کنین، وقتی بصورت [bx] استفاده بشه در واقع شما اینو استفاده کردی [ds:[bx
خیلی ممنون از جوابتون الان من کد رو طبق راهنمایی شما اصلاح کردم و دیگه اررور نداره
ولی هنگام اجرای برنامه هر عددی رو که وارد میکنم رو با پیغام divide overflow نمایش میده به جز عدد 2 که اون رو اول (prime) نشون میده!
بنظرتون کجای کد ایراد داره؟
hoax3r
چهارشنبه 29 خرداد 1387, 11:57 صبح
اگه ممکنه کدتون رو بزارین تا برسی کنم
MORTAL4U
چهارشنبه 29 خرداد 1387, 16:53 عصر
اگه ممکنه کدتون رو بزارین تا برسی کنم
ممنون
include io.h
stack1 segment stack
dw 120h dup(?)
stack1 ends
data1 segment
str db 80 dup(?)
SUM Dw 80 DUP(?)
NUM Dw 80 DUP(?)
msg1 db "Prime",0
msg2 db "NotPrime",0
data1 ends
code1 segment
assume ds:data1 , cs:code1
start: mov ax,seg data1
mov dS,ax
inputs str , 80
atoi str
MOV SUM,0
MOV BX,2
MOV NUM,AX
mov SUM,ax
SUB SUM,2
mov cx,SUM
L1: JCXZ PRIME
Idiv BX
mov dx,0
cmp ax,0
JZ NOTPRIME
MOV AX,NUM
INC BX
loopNZ L1
PRIME: output msg1
jmp QUIT
NOTPRIME: output msg2
QUIT: mov ax,4c00h
int 21h
code1 ends
end start
hoax3r
چهارشنبه 29 خرداد 1387, 17:40 عصر
خوب شما قبل اینکه دستور idiv رو به کار ببری باید dx رو صفر کنین، نه بعد تقسیم
الگوریمتون هم یه مشکل کوچیک داره اونم اینکه بعد تقسیم باقیمانده برسی نمیشه
بدون برسی باقیمانده چطوری میتونین بفهمین عدد اول هست. باید باقیمانده هم چک بشه
که اگر صفره پس قابل تقسیم و عدد اول نیست
نکته بعدی اینکه متغییر SUM اینجا چه تاثیری داره، اگه کدتون قرار توسعه پیدا کنه و SUM رو لازم دارین
که هیچ ولی اگه نه که میتونین حذفش کنید تا سرعت برنامه و پیدا کرن ایرادات آسونتر بشه
MORTAL4U
پنج شنبه 30 خرداد 1387, 03:25 صبح
خوب شما قبل اینکه دستور idiv رو به کار ببری باید dx رو صفر کنین، نه بعد تقسیم
الگوریمتون هم یه مشکل کوچیک داره اونم اینکه بعد تقسیم باقیمانده برسی نمیشه
بدون برسی باقیمانده چطوری میتونین بفهمین عدد اول هست. باید باقیمانده هم چک بشه
که اگر صفره پس قابل تقسیم و عدد اول نیست
نکته بعدی اینکه متغییر SUM اینجا چه تاثیری داره، اگه کدتون قرار توسعه پیدا کنه و SUM رو لازم دارین
که هیچ ولی اگه نه که میتونین حذفش کنید تا سرعت برنامه و پیدا کرن ایرادات آسونتر بشه
من فکر میکردم تو تقسیم دوبیتی باقی مانده میره به ax برای همین cmp ax,0 رو برای شرط اول نبودن در نظر گرفتم
sum رو فقط بعنوان شمارنده حلقه استفاده کردم برای ریختن تو cx
الان با اینکه عبارت پرش شرطی cmp dx,0 رو گذاشتم je notprime ولی برای تمام اعداد میره به notprime . مگه برای چک کردن باقی مانده نباید این کارو کرد؟
راستی مگه عدد اول منفی هم داریم؟ اصلا لازم هست که من از idiv استفاده کنم؟ میتونم از div استفاده کنم
من دقیقا فرق بین loop , loopz و loopnz رو متوجه نشدم ممکن هست به اختصار توضیح بدین
include io.h
stack1 segment stack
dw 120h dup(?)
stack1 ends
data1 segment
str db 80 dup(?)
NUM Dw 80 DUP(?)
msg1 db "Prime",0
msg2 db "NotPrime",0
data1 ends
code1 segment
assume ds:data1 , cs:code1
start: mov ax,seg data1
mov dS,ax
inputs str , 80
atoi str
MOV BX,2
MOV NUM,AX
mov cx,ax
SUB cx,2
L1: mov dx,0
Idiv BX
cmp dx,0
Je NOTPRIME
MOV AX,NUM
INC BX
loopNZ L1
PRIME: output msg1
jmp QUIT
NOTPRIME: output msg2
QUIT: mov ax,4c00h
int 21h
code1 ends
end start
hoax3r
پنج شنبه 30 خرداد 1387, 10:51 صبح
تا اینجا که برنامتون خوب کار میکنه، من با اعدادی مثل 13 ، 17 تست میکنم درسته
عدد اول منفی هم فکر نمیکنم داشته باشیم، با دستور div هم مشکلی پیش نمیاد
در مورد دستوراتی که گفتی
LOOP : فقط برسی میکنه اگه cx صفر نباشه پرش کنه
LOOPZ : بجز برسی cx پرچم zf رو هم برسی میکنه، zf اگر برابر 1 باشه حلقه ادامه پیدا میکنه
LOOPNZ : این هم بجز cx پرچم zf رو هم برسی مینکه، zf اگر برابر 0 باشه حلقه ادامه پیدا میکنه
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.