View Full Version : یک عدد از ورودی گرفته و مقسوم علیه های آن را نمایش دهد ؟
atefe70
پنج شنبه 08 تیر 1391, 23:36 عصر
این برنامه هست که ما نوشتیم کسی هست بتونه رفع اشکال کنه واسمون؟
sseg segment para stack 'stack'
db 32 dup(?)
sseg ends
dseg segment para 'data'
number dw ?
x dw ?,'$'
dseg ends
cseg segment para 'code'
main proc far
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds,ax
mov AH, 02h
mov BH, 0
mov DH, 5
mov DL, 10
int 10h
mov ah,3fh
mov bh,00
mov cx,32
lea dx,number
int 21h
mov cx,1
maghsoom:
cmp cx,number
je finish
mov ax,number
mov dx,0
div cx
cmp dx,0
je chap
inc cx
jmp maghsoom
chap:
mov x,cx
mov ah,09h
lea dx,x
int 21h
inc cx
jmp maghsoom
finish:
mov ax,4c00h
int 21h
main endp
cseg ends
end main
ممنون میشم اگه کسی راهنمایی کنه مشکلات کدم از کجاست .
میدونم این حرف یه خورده دستوریه ولی تا شنبه فقط وقت دارم :ناراحت:یعنی منتظر یه جواب فوری هستم .ممنونم
MostafaMohammadi
جمعه 09 تیر 1391, 01:04 صبح
خط ۳۵ تا ۴۳ داری چیکار میکنی؟ می خوای اطلاعات رو از روی فایل بخونی؟ اگه اینطوره اشتباه است. طریق خوندن فایل اینه:
AH = 3Fh
BX = file handle
CX = number of bytes to read
DS:DX -> buffer for data
عددات توی Number است، درسته؟ پس نباید نیازی به خوندن فایل داشته باشی. من متوجه هدف ات از این کار نمیشم.
بقیه چیزها درسته تا موقع برچسب چاپ، جاپ ات اشتباهه، برای چاپ باید ابتدا مقدار عددی رو به رشته عددی تبدیل کنی، توی تاپیکها بگرد این موضوع صدها بار پرسیده شده و الگوریتماش چندین بار جواب داده شده.
atefe70
جمعه 09 تیر 1391, 12:11 عصر
برنامه چون گفته عدد از ورودی بگیر من نحوه گرفتن رو با 0ahتغییر دادم . و اون رو از رشته عددی به عدد هم تبدیل کردم .
ولی باز خروجی من مشکل داره .... یعنی خروجی رو دوباره باز باید از عدد به رشته عددی تبدیل کرد ؟
.
.
این کدی که دوباره نوشتم . میشه بگید مشکلش کجاست ؟
datasg segment
num dw ?
num1 dw ?,'$'
str label byte
max db 5 ;nahayatan toole arqam ya reshte
len db ?
buffer db 5 dup(?)
msg1 db "yes","$"
msg2 db "no","$"
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg
mov ax,datasg
mov ds,ax
;gereftan reshte
mov ah,0ah
mov dx,offset str
int 21h
lea bx,buffer
mov ch,0
mov cl,len
mov al,0
for1:
mov dl,10
mul dl
mov dl,[bx]
and dl,0fh
add al,dl
inc bx
loop for1
mov num,al
;maghsoom elayh
mov cx,1
for:
cmp cx,num
je finish
mov ax,num
mov ax,0
div cx
cmp ax,0
je chap
inc cx
jmp for
chap:
mov num1,cx
mov ah,09h
lea dx,num1
int 21h
inc cx
jmp for
finish:
mov ax,4c00h
int 21h
main endp
codesg ends
end main
MostafaMohammadi
شنبه 10 تیر 1391, 01:17 صبح
خط ۴۱ رو پاک کن و به جاش بنویس:
SUB DL, '0'
این دستور کد اسکی '0' رو از کد اسکی کاراکتری که توی AL هست کم می کنه و AL میشه مقدار عددی. به این مثال ها توجه کن:
'5' - '0' = 5
53 - 48 = 5
5 + '0' = '5'
5 + 48 = 53
خط ۴۶، داری ثبات AL که یک بایت است رو میریزی تو متغییر NUM که ورد است، در صورتی که باید هر دو یک اندازه باشند. میتونی با دستور CBW عددات رو از بایت به ورد تبدیل کنی و بعد AX رو بریزی توی NUM، یعنی اینطوری باید اصلاح اش کنی:
.
.
.
loop for1
CBW
MOV NUM,AX
;maghsoom elayh
.
.
.
خط ۵۶ فکر کنم می خواستی DX رو صفر کنی، اشتباهی AX رو صفر میکنی، یه خطا هم به این میگیره چون صفر تقیسم بر یک داره میشه.
همونطور که گفتم:
جاپ ات اشتباهه، برای چاپ باید ابتدا مقدار عددی رو به رشته عددی تبدیل کنی، توی تاپیکها بگرد این موضوع صدها بار پرسیده شده و الگوریتماش چندین بار جواب داده شده.
متاسفانه نمیگردید، یه نگاهی به عکس ضمیمه شده و این الگوریتم بندازید، ببینید متوجه میشید چی به چیه.
MOV AX, N
MOV BX, 10
XOR CX, CX
L1: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L1
L2: POP DX
ADD DX, '0'
MOV AH, 2h
INT 21h
LOOP L2
atefe70
شنبه 10 تیر 1391, 15:40 عصر
datasg segment
num dw ?
num1 dw ?,'$'
str label byte
max db 5 ;nahayatan toole arqam ya reshte
len db ?
buffer db 5 dup(?)
msg1 db "yes","$"
msg2 db "no","$"
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg
mov ax,datasg
mov ds,ax
;gereftan reshte
mov ah,0ah
mov dx,offset str
int 21h
lea bx,buffer
mov ch,0
mov cl,len
mov al,0
for1:
mov dl,10
mul dl
mov dl,[bx]
sub dl,'0'
add al,dl
inc bx
loop for1
cbw
mov num,ax
;maghsoom elayh
mov cx,1
for:
cmp cx,num
je finish
mov ax,num
;mov dx,0
div cx
cmp ah,0
je chap
inc cx
jmp for
chap:
MOV AX, cx
MOV BX, 10
XOR CX, CX
L1: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L1
L2: POP DX
ADD DX, '0'
MOV AH, 2h
INT 21h
LOOP L2
inc cx
jmp for
finish:
mov ax,4c00h
int 21h
main endp
codesg ends
end main
من خط 57 رو ابتدا مقدارش رو طبق حرف شما صفر قرار دادم ولی چون برای من خروجی بی نهایت یک میداد غیر فعالش کردم .
دستوری که شما دادید رو هم برای تبدیل کرکتر قرار دادم و در اخر یه واحد به cxاضاف کردم و گفتم پرش کنه به حلقه for...و من بجای nگفتم باید حتما cxرو قرار بدم . درسته یا اینم اشتباهه ؟و باید چیز دیگه ای قرار میدادم ؟
.......اما اگه اشتباه نکنم دستور شما یعنی همون تبدیل به رشته عددی.و برای تبدیل باید هربار عدد تقسیم به 10بشه تا جایی که خارج قسمت به صفر میرسه . یعنی هر وقت عدد بیشتر از یه رقمی باشه کاربرد داره.....درست متوجه شدم ؟..........
اما خروجی من فقط عدد یک میشه ؟
متاسفم که این قدر در این مورد ناوارد عمل میکنم .
MostafaMohammadi
یک شنبه 11 تیر 1391, 00:18 صبح
من خط 57 رو ابتدا مقدارش رو طبق حرف شما صفر قرار دادم ولی چون برای من خروجی بی نهایت یک میداد غیر فعالش کردم .
DX باید صفر بشه، چون توی تقسیم دارین DX:AX رو بر CX تقسیم میکنید و اگه صفراش نکنید، هر بار یه عددی تو DX هست و شما ناخواسته اون رو توی تقسیم لحاظ میکنید. منظورتون رو از خروجی بینهایت نمیفهمم ولی هر چی که دلیل اصلی اش صفر شدن DX نبوده.
دستوری که شما دادید رو هم برای تبدیل کارکتر قرار دادم و در اخر یه واحد به cxاضاف کردم و گفتم پرش کنه به حلقه for...و من بجای nگفتم باید حتما cxرو قرار بدم . درسته یا اینم اشتباهه ؟و باید چیز دیگه ای قرار میدادم ؟
درسته، ولی من کد رو ندادم که کپی پیست کنید، داده بودم از روش بخونید و خودتون پیادهسازی کنید. در هر صورت.
.......اما اگه اشتباه نکنم دستور شما یعنی همون تبدیل به رشته عددی.و برای تبدیل باید هربار عدد تقسیم به 10بشه تا جایی که خارج قسمت به صفر میرسه . یعنی هر وقت عدد بیشتر از یه رقمی باشه کاربرد داره.....درست متوجه شدم ؟..........
آره، درسته. فقط یه نکته ای که داره، باقیماندهها PUSH میشوند توی استک و وقتی تقسیمها به اتمام رسید دونه دونه خونده میشن که حتما به این نکته توجه کردید.
اما خروجی من فقط عدد یک میشه ؟
این اشکال به خاطر این پیش میاومد که من برای چاپ عدد ثبات CX رو تغییر میدادم و ازش به عنوان شمارش گر استفاده می کردم. برای همین هر بار CX یا همون مقسومعلیه تون در انتهای حلقه صفر میشد و بعد یه بار افزایشاش میدادید و دوباره میشد همون ۱ که از اول بود. برای همین من به جای CX از یه متغییر به اسم DIVISOR استفاده کردم.
کد تغییر داده شده اینه (فقط DIVISOR جایگزین CX شده):
datasg segment
num dw ?
num1 dw ?,'$'
str label byte
max db 5 ;nahayatan toole arqam ya reshte
len db ?
buffer db 5 dup(?)
DIVISOR DW 0
msg1 db "yes","$"
msg2 db "no","$"
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg
mov ax,datasg
mov ds,ax
;gereftan reshte
mov ah,0ah
mov dx,offset str
int 21h
lea bx,buffer
mov ch,0
mov cl,len
mov al,0
for1:
mov dl,10
mul dl
mov dl,[bx]
sub dl,'0'
add al,dl
inc bx
loop for1
cbw
mov num,ax
;maghsoom elayh
mov DIVISOR,1
for:
MOV AX, DIVISOR
cmp AX, num
je finish
mov ax,num
mov dx,0
div DIVISOR
cmp ah,0
je chap
inc DIVISOR
jmp for
chap:
MOV AX, DIVISOR
MOV BX, 10
XOR CX, CX
L1: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L1
L2: POP DX
ADD DX, '0'
MOV AH, 2h
INT 21h
LOOP L2
inc DIVISOR
jmp for
finish:
mov ax,4c00h
int 21h
main endp
codesg ends
end main
xman_1365_x
یک شنبه 11 تیر 1391, 06:47 صبح
با تشکر از دوست گرامی MostafaMohammadi
کد پست 6 رو به این شکل اصلاح کنید تا خروجی درست بشه ، ضمنا ما میدونیم 1 و خود عدد جزء مقسوم علیه ها هست پس بهتره از محاسبات حذف بشه
datasg segment
num dw ?
num1 dw ?,'$'
str label byte
max db 5 ;nahayatan toole arqam ya reshte
len db ?
buffer db 5 dup(?)
DIVISOR DW 0
msg1 db "yes","$"
msg2 db "no","$"
counter dw 0
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg
mov ax,datasg
mov ds,ax
;gereftan reshte
mov ah,0ah
mov dx,offset str
int 21h
mov ah,2
mov dl,13
int 21h
mov dl,10
int 21h
lea bx,buffer
mov ch,0
mov cl,len
mov al,0
for1:
mov dl,10
mul dl
mov dl,[bx]
sub dl,'0'
add al,dl
inc bx
loop for1
cbw
mov num,ax
;maghsoom elayh
mov DIVISOR,1
mov counter,0
for:
inc counter
MOV AX, DIVISOR
cmp AX, num
ja finish
mov ax,num
mov dx,0
div DIVISOR
cmp dx,0
je chap
inc DIVISOR
jmp for
chap:
MOV AX, DIVISOR
MOV BX, 10
XOR CX, CX
L1: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L1
L2: POP DX
ADD DX, '0'
MOV AH, 2h
INT 21h
LOOP L2
mov ax,counter
cmp ax,num
je finish
mov ah,2
mov dl,','
int 21h
inc DIVISOR
jmp for
finish:
mov ax,4c00h
int 21h
main endp
codesg ends
end main
موفق باشید
atefe70
یک شنبه 11 تیر 1391, 14:57 عصر
با سپاس از تمامی دوستان ... اقای Xman و اقا mostafa
اینجا هم تونستم از کمک شما بهره ببرم و هم ذهنیم نسبت به خیلی از سوالا بازتر بشه .
fariba-2
جمعه 10 اردیبهشت 1395, 15:38 عصر
سلام
یه کم از این سوال و جواب گذشته ببخشید.
میشه خواهش کنم در مورد کدهاتون توضیح بدید؟
بعضی از این کدها برام ناآشناست.
fariba-2
جمعه 10 اردیبهشت 1395, 15:42 عصر
با تشکر از دوست گرامی MostafaMohammadi
کد پست 6 رو به این شکل اصلاح کنید تا خروجی درست بشه ، ضمنا ما میدونیم 1 و خود عدد جزء مقسوم علیه ها هست پس بهتره از محاسبات حذف بشه
datasg segment
num dw ?
num1 dw ?,'$'
str label byte
max db 5 ;nahayatan toole arqam ya reshte
len db ?
buffer db 5 dup(?)
DIVISOR DW 0
msg1 db "yes","$"
msg2 db "no","$"
counter dw 0
datasg ends
codesg segment
main proc far
assume cs:codesg,ds:datasg
mov ax,datasg
mov ds,ax
;gereftan reshte
mov ah,0ah
mov dx,offset str
int 21h
mov ah,2
mov dl,13
int 21h
mov dl,10
int 21h
lea bx,buffer
mov ch,0
mov cl,len
mov al,0
for1:
mov dl,10
mul dl
mov dl,[bx]
sub dl,'0'
add al,dl
inc bx
loop for1
cbw
mov num,ax
;maghsoom elayh
mov DIVISOR,1
mov counter,0
for:
inc counter
MOV AX, DIVISOR
cmp AX, num
ja finish
mov ax,num
mov dx,0
div DIVISOR
cmp dx,0
je chap
inc DIVISOR
jmp for
chap:
MOV AX, DIVISOR
MOV BX, 10
XOR CX, CX
L1: XOR DX, DX
DIV BX
PUSH DX
INC CX
CMP AX, 0
JNE L1
L2: POP DX
ADD DX, '0'
MOV AH, 2h
INT 21h
LOOP L2
mov ax,counter
cmp ax,num
je finish
mov ah,2
mov dl,','
int 21h
inc DIVISOR
jmp for
finish:
mov ax,4c00h
int 21h
main endp
codesg ends
end main
موفق باشید
سلام
یه کم از این سوال و جواب گذشته ببخشید.
میشه خواهش کنم در مورد کدهاتون توضیح بدید؟
بعضی از این کدها برام ناآشناست.
fariba-2
یک شنبه 12 اردیبهشت 1395, 12:00 عصر
مثل اینکه کسی جوابگو نیست.:افسرده:
Delphi Coder
دوشنبه 13 اردیبهشت 1395, 19:22 عصر
مثل اینکه کسی جوابگو نیست.:افسرده:
کجاش رو متوجه نشدید. لطفا مشخص تر مطرح کنید در مورد این کد حتی کتاب هم میشه نوشت.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.