PDA

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 عصر
مثل اینکه کسی جوابگو نیست.:افسرده:
کجاش رو متوجه نشدید. لطفا مشخص تر مطرح کنید در مورد این کد حتی کتاب هم میشه نوشت.