PDA

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



JaVa
پنج شنبه 18 خرداد 1391, 19:41 عصر
با سلام و خسته نباشید به شما دوستان گرامی


این کد در مورد تبدیل رشته به عدد و بلعکس هست مشکلی که وجود داره اینه که در تبدیل کردن مشکلی داره همه چیزش هم منطقی ولی باز هم درست کار نمی کنه!!!!!





stksg segment para 'stack'
dw 64 dup(?)
stksg ends

datsg segment para 'data'
ten dw 10

max db 10
act db ?
buffer db 10 dup(?)

asc_num db 10
bin_num dw 10
datsg ends

codsg segment para 'code'
main proc far
assume ss:stksg,ds:datsg,cs:codsg

mov ax,datsg
mov ds,ax
;get string
mov ah,0ah
mov dx,offset max
int 21h


;convert ascii to number
mov di,0
mov si,offset buffer

mov bx,3

mov cx,1
back:
mov al,[si+bx]
and al,0fh
mov ah,0
mul cx
add di,ax
mov ax,cx
mul ten
mov cx,ax
dec bx
jns back

mov bin_num,di
;'''''''''''''''''''''''''''''''''''''''''''''
;convert number to ascii
mov cx,10
mov si,offset asc_num
add si,4
mov ax,bin_num
reply:
mov dx,0
div cx
or dl,30h
mov [si],dl
dec si
cmp ax,0
ja reply

;print string
mov ah,40h
mov ch,0
mov cl,10
mov dx,offset asc_num
mov bx,1
int 21h


mov ax,4c00h
int 21h

codsg ends
main endp
end main


با تشکر:تشویق:

MEHDI.MN1365
پنج شنبه 18 خرداد 1391, 22:26 عصر
دوست عزیز این طوری کار کن جواب میده

DSEG SEGMENT 'DATA'
st label byte
max db 5
len db ?
buffer db 5 dup('')
dolar db '$'
msg1 db 'enter first num = ','$'
a dw ?
b dw ?
DSEG ENDS

SSEG SEGMENT STACK 'STACK'
db 256 DUP(0)
db 32 dup('stak')
SSEG ENDS

CSEG SEGMENT 'CODE'
START PROC FAR
assume ds:dseg,cs:cseg,ss:sseg
MOV AX, DSEG
MOV DS, AX
MOV ES, AX



mov dx,offset msg1
mov ah,09h
int 21h

mov ah,0ah
lea dx,st
int 21h

lea bx,buffer
mov ch,0
mov cl,len

add bx,cx
mov dl ,1
mov ax,0

p1: mov al,[bx]
sub al ,48
mul dl

mov a,ax
mov al,10
mul dl
mov dl,al
sub bx,1
loop p1
MOV AX, 4C00h
INT 21h
START ENDP
CSEG ENDS
END START

MostafaMohammadi
جمعه 19 خرداد 1391, 14:36 عصر
من که نفهمیدم تو حلقه ها چیکار می کنی ولی اون

ten dw 10
رو ببر، زیر


max db 10
act db ?
buffer db 10 dup(?)

بنویس.

MostafaMohammadi
جمعه 19 خرداد 1391, 18:14 عصر
کاری‌هایی که انجام دادی برای من خیلی گنگ‌ه، مثلا تو خط 35 با مقدار اولیه BX=3 وارد یه حلقه ای میشی که از خونه سوم بافر شروع می کنه به انجام یک سری عملیات و و اون عملیات رو که من اصلا نمی فهمم چیه رو به صورت عقب گرد تا اولین خونه بافر انجام میدی، چرا؟
مثلا اگه تو رشته باشه 123456789 شما میری سراغ خونه سوم که توش کد اسکی عدد 3 است؟
یا مثلا توی خط 37 چرا AL رو با پانزده AND می کنی؟ به نظرم باید مقدار عددی کد اسکی کلید "0" رو از AL کم کنی تا مقدار عددی اش بدست بیاد و ... خلاصه AND کردن ات رو اصلا نمی فهمم.
به این تصویر زیر هم یه نگاهی بنداز.

JaVa
جمعه 19 خرداد 1391, 20:18 عصر
با سلام

این هم از توضیحات من

stksg segment para 'stack'
dw 64 dup(?)
stksg ends

datsg segment para 'data'


max db 10
act db ?
buffer db 10 dup(?)

ten dw 10

asc_num db 10
bin_num dw 10

datsg ends

codsg segment para 'code'
main proc far
assume ss:stksg,ds:datsg,cs:codsg

mov ax,datsg
mov ds,ax
;get string
mov ah,0ah
mov dx,offset max
int 21h


;convert ascii to number
mov di,0;براي نتيجه محاسبات در نظر گرفته شده
mov si,offset buffer;آفست آدرس بافر را در ثبات اس آي قرار مي دهد

mov bx,act;شماره رقم اسکي سمت راست عدد اسکي وارد شده

mov cx,1;براي وزن عدد همون يکان دهگان و ....
back:
mov al,[si+bx];محتواي خانه اس آي + بي ايکس را در آ ال قرا مي دهد
and al,0fh;کد اسکي هر رقم را به کد بي سي دي غير فشرده تبديل مي کند
mov ah,0
mul cx;کد بي سي دي هر رقم را در وزن نظير آن ضرب مي کند
add di,ax;رقم وزن دار را محاسبات قبلي جکع مي کند
mov ax,cx;
mul ten ;ثبات سي ايکس را در ده ضرب مي کند که وزن رقم بعدي بدست آيد
mov cx,ax
dec bx;از ثبات بي ايکس يکي کم مي کنه
jns back

mov bin_num,di
;'''''''''''''''''''''''''''''''''''''''''''''
;convert number to ascii
mov cx,10
mov si,offset asc_num
add si,4
mov ax,bin_num
reply:
mov dx,0
div cx
or dl,30h
mov [si],dl
dec si
cmp ax,0
ja reply

;print string
mov ah,40h
mov ch,0
mov cl,10
mov dx,offset asc_num
mov bx,1
int 21h


mov ax,4c00h
int 21h

codsg ends
main endp
end main





همچونین این کدی که دوستون نوشته نتیجه رو در کجا قرار می ده


با تشکر از همکاری شما

MostafaMohammadi
جمعه 19 خرداد 1391, 21:17 عصر
اگه می خواهید کدهای اسکی تون رو به مقدار عددی اش تبدیل نکنید و روی همون ها عملیات ریاضی رو انجام بدید باید بعد از هر عملیات نتیجه رو اصلاح کنید. برای مثال بعد از عملیات ضرب می بایست از دستور AAM استفاده کنید یا بعد از عملیات جمع از دستور DAA استفاده کنید.
دلیل خاصی داره که نمی خواهید کدهای اسکی تون رو به مقدار عددی اش تبدیل کنید؟ چون عملیات ریاضی اونجوری خیلی ساده تر انجام میشه. بهتر نیست از همون اول کدهای اسکی تون رو به معادل عدد اش تبدیل کنید و خیال خودتون رو راحت کنید؟

JaVa
شنبه 20 خرداد 1391, 15:18 عصر
با سلام و خسته نباشید:/.

فوری ، فوری
دوستان لطف کنند پاسخ بدن.
لطفا این توضیحات که درباره هر خط من دادم رو بررسی کن اگه نا درست بود صحیحش بنویسید:
برای تبدیل کردن به رشته فقط کافی که 48 واحد به کد اسکی اضافه کنه بعد عدد رو چاپ کنه؟؟؟؟؟؟؟؟؟؟
در ضمن نتیجه نهایی رو کجا می زاره ؟؟؟




include io.h
stksg segment para 'stack'
db 256 dup(?)
stksg ends

DSEG SEGMENT 'DATA'
st label byte
max db 5
len db ?
buffer db 5 dup(' ')
dolar db '$'

msg1 db 'enter first num = ','$'
a dw ?
b dw ?

result dw ?

DSEG ENDS



CSEG SEGMENT 'CODE'
START PROC FAR
assume ds:dseg,cs:cseg,ss:stksg
;تنظيمات سگمنت
MOV AX, DSEG
MOV DS, AX

;چاپ پيام يک
mov dx,offset msg1
mov ah,09h
int 21h

;دريافت رشته
mov ah,0ah
lea dx,st
int 21h

lea bx,buffer;قرار دادن رشته در ثبات بي ايکس
mov ch,0;ريختن صفر در ثبات بي ايکس
mov cl,len;طول واقعي رشته را در ثبات سي ال قرار مي دهد

add bx,cx;؟؟؟؟؟؟؟
mov dl,1;قرار دادن يک در ثبات دي ال
mov ax,0

p1: mov al,[bx];مقدار اسکي بي ايکس را در ثبات دي ال قرار م بي دهد
sub al ,48;کم کردن چهل هشت واحد از کد اسکي که در ثبات دي ال قرار دارد
mul dl;ضرب آ ال در مقدار دي ال براي بدست آوردن ارزش واقعي عدد

;اگه اشتباه نکرده باشم حاصل را در آ قرار مي ده
mov a,ax
mov al,10
mul dl;???????
mov dl,al;????
sub bx,1
loop p1


MOV AX, 4C00h
INT 21h

START ENDP
CSEG ENDS
END START

MostafaMohammadi
شنبه 20 خرداد 1391, 17:09 عصر
lea bx,buffer;قرار دادن رشته در ثبات بي ايکس
mov ch,0;ريختن صفر در ثبات بي ايکس
mov cl,len;طول واقعي رشته را در ثبات سي ال قرار مي دهد
با سه تا دستور بالا، آدرس آفست بافر رو توی ثبات BX و تعداد ارقام عدد رو توی CX داریم درسته؟

add bx,cx;؟؟؟؟؟؟؟
حالا تو با این دستور آدرس آفست بافر بعلاوه تعداد ارقام عدد کرده، اینطوری BX اشاره داره به آخرین خونه از رشته بافر (یعنی رقم یکان)
تو حلقه هم هی این نشانه گر رو CX بار (یعنی به تعداد ارقام عددمون) کاهش میدیم که در انتها میرسیم به رقم اول عددمون.

mov dl,1;قرار دادن يک در ثبات دي ال
mov ax,0
; AX نگهدارنده موقت عددمون است که برای شروع صفر اش کرده.
p1: mov al,[bx];مقدار اسکي بي ايکس را در ثبات دي ال قرار م بي دهد
;محتویات خانه ای از حافظه که ثبات BX به اون اشاره داره رو داخل ثبات AL میریزه.
sub al ,48;کم کردن چهل هشت واحد از کد اسکي که در ثبات دي ال قرار دارد
; کد اسکی هر کاراکتر عددی منهای 48 میشه مقدار عددی اون کاراکتر، مثلا کد اسکی کلید "5" عدد 53 است که اگه منهای 48 کنی میشه 5
mul dl;ضرب آ ال در مقدار دي ال براي بدست آوردن ارزش واقعي عدد
; این همون چیزیه که بهش می گفتی وزنه، که با هر بار تکرار شدن حلقه 10 برابر میشه.

[CODE] mov a,ax
;اگه اشتباه نکرده باشم حاصل را در آ قرار مي ده
mov al,10
mul dl;???????
mov dl,al;????
;کلا توی این سه خط DL در ده ضرب میشه، نتیجه ضرب توی AX است که اینجا فقط AL رو به DL بر می گردونه (چون تعداد ارقام ات 4 رقمه DL هیچوقت از 1000 تجاوز نمیکنه، پس از AH صرف نظر می کنیم.)

sub bx,1
; اشاره گر حلقه رو یدونه کاهش میده، اینطوری میره سراغ رقم سمت چپی.
loop p1