PDA

View Full Version : گرفتن عدد از ورودی



hmd6613
دوشنبه 04 دی 1385, 22:44 عصر
با سلام
کسی می تونه بهم کمک کنه که چه جوری میشه چند عدد را از ورودی دریافت کرده تا روی آنها محاسبات ریاضی انجام دهیم؟(تو زبان اسمبلی)

mzjahromi
سه شنبه 05 دی 1385, 06:51 صبح
اعداد رو تو اسمبلی به سادگی نمیتونید دریافت کنید.
باید کاراکتر به کاراکتر بگیریشون و تبدیلشون کنی به عدد
شروع کن هر جا با مشکل برخورد کردی بپرس

hmd6613
سه شنبه 05 دی 1385, 12:27 عصر
اگه اعداد زیاد بود باید از آرایه ها استفاده کرد؟من می خوام یه ماتریسو از ورودی بخونم و روش محاسبات ریاضی انجام بدم.می تونید یه روش خوب بهم معرفی کنید؟

ارام فارسی
چهارشنبه 06 دی 1385, 10:59 صبح
با سرویس 0ah از وقفه ی شماره 21h یک رشته اطلاعات از صفحه کلید خوانده میشود و در محلی در سگمنت داده که خودت به طور معین در سگمنت داده از قبل تعریف کردی ذخیره میشود.البته این سرویس کاراکتر هایی که از صفحه کلید خوانده میشوند را روی مانیتور میفرستد.برای استفاده 1_ توی سگمنت داده با شبه دستور lable حافظه ی مورد نیاز رو تعریف کن.(به همون شیوه ای که خودت بهتر بلدی!) 2_حداکثر تعداد حروف رو بعد از دستور لیبل قرار بده و حتما هم براش اسم انتخاب کن.3_مکان دیگری در سگمنت داده در نظر بگیر برای اینکه سیستم عامل تعداد واقعی حروف را برات اونجا قرار بده.(بایت بعدی.)سومین بایت به بعد سگمنت داده همان رشته ی مورد نظر قرار میگیرد.پس براش حافظه ی لازم رو در نظر بگیر و با space پرش کن. این سرویس برای پایان دادن به ورود اطلاعات دگمه ی enter رو میشناسه.
حالا به جایی رسیدی که رشته رو گرفتی!.با کد اسکی هایی که در اختیار داری هر عملی که دلت خواست روش انجام بده.
یادت باشه که توی اسمبلی تمام سرویس های ورودی کد اسکی میگیرند.

mahani
چهارشنبه 06 دی 1385, 22:47 عصر
این سوالت به ظاهر ساده است ولی در اسمبلی پیچیدگیهای خاص خودشو داره باید به چند نکته دقت کنی:
1-میخواهی عددهات بصورت BCD ذخیره شوند یا Binary یا ...
2-چند رقمی بودن اعداد
3-با توجه به 1و2 میتوانی بفهمی که هر عدد حداکثر چند بایتی است پس باید متغیری متناسب با آن تعریف کنی
4-عددها رو یک رقم یک رقم بگیری 30H تا ازش کم کنی و با توجه به نوع عدد(BCDیاBinary) آنها با الگوریتمی به متغیر اضافه کنی

serfish
جمعه 08 دی 1385, 02:42 صبح
سلام
حالتون خوبه
این سورس همون کاری رو میکنه که شما میخواهید
میتونید خودتون برید و تحلیل کنید و به هدفتون برسید

این سورس کارش جمع کردن یا بسته به نیاز با تغییر کوچکی تفریق دو تا عدد 5 رقمی
page 60,70
title sub / sum
stsg segment stack 'stack'
db 200 dup(?)
stsg ends
dtsg segment 'data'
x db 6 dup(0)
y db 6 dup(0)
z db 6 dup(0)
dtsg ends
cdsg segment 'code'
assume ss:stsg,ds:dtsg,cs:cdsg
main proc near
mov ax,dtsg
mov ds,ax
;///////////////////
mov ah,6h
mov al,2
mov ch,0
mov cl,0
mov dh,25
mov dl,79
mov bh,60
int 10h
;******************
mov ah,15h
mov al,25
mov ch,6
mov cl,30
mov dh,12
mov dl,60
mov bh,10
int 10h
;*****************
adding proc near
mov cx,5
lea bx,x+1
for1:
mov ah,01H
int 21H
add al,48
mov [bx],al
inc bx
loop for1
mov cx,5
lea bx,y+1
mov ah,02H
mov dl,'+'
int 21H

for2:
mov ah,01H
int 21H
add al,48
mov [bx],al
inc bx
loop for2

;-------------------
lea si,x+5 ;
lea di,y+5
lea bx,z+5
mov cx,6

for4:
mov al,[si]
sub al,[di]

cmp al,9
js nextt

sub al,10
mov dl,1
sub [si-1],dl
nextt:

mov [bx],al
dec si
dec di
dec bx
loop for4
;-------------------

mov cx,6
lea bx,z
mov ah,02H
mov dl,'='
int 21H
for3:
mov dx,48
add [bx],dx
mov dl,[bx]
mov ah,02H
int 21H
inc bx

loop for3
adding endp
;******************************
subing proc near
mov cx,5
lea bx,x+1
for11:
mov ah,01H
int 21H
sub al,48
mov [bx],al
inc bx
loop for11
mov cx,5
lea bx,y+1
mov ah,02H
mov dl,'-'
int 21H

for22:
mov ah,01H
int 21H
sub al,48
mov [bx],al
inc bx
loop for22

;-------------------
lea si,x+5 ;
lea di,y+5
lea bx,z+5
mov cx,6

for44:
mov al,[si]
sub al,[di]

cmp al,9
js next2

sub al,10
mov dl,1
sub [si-1],dl
next2:

mov [bx],al
dec si
dec di
dec bx
loop for44
;-------------------

mov cx,6
lea bx,z
mov ah,02H
mov dl,'='
int 21H
for33:
mov dx,48
add [bx],dx
mov dl,[bx]
mov ah,02H
int 21H
inc bx

loop for33
subing endp
reset:
mov ah,01h
int 21h
cmp al,'a'
jne next3
call adding
jmp exit
next3: cmp al,'s'
jne reset
call subing
;\\\\\\\\\\\\\\\\\\\
exit:
mov ax,4c00h
int 21h
main endp
cdsg ends
end main

serfish
جمعه 08 دی 1385, 02:45 صبح
ببخشید من معذرت میخوام اشتباه کپی کردم
page 60,70
title sub / sum
stsg segment stack 'stack'
db 200 dup(?)
stsg ends
dtsg segment 'data'
x db 6 dup(0)
y db 6 dup(0)
z db 6 dup(0)
dtsg ends
cdsg segment 'code'
assume ss:stsg,ds:dtsg,cs:cdsg
main proc near
mov ax,dtsg
mov ds,ax
;///////////////////
mov ah,6h
mov al,2
mov ch,0
mov cl,0
mov dh,25
mov dl,79
mov bh,60
int 10h
;******************
mov ah,15h
mov al,25
mov ch,6
mov cl,30
mov dh,12
mov dl,60
mov bh,10
int 10h
;*****************
adding proc near
mov cx,5
lea bx,x+1
for1:
mov ah,01H
int 21H
add al,48
mov [bx],al
inc bx
loop for1
mov cx,5
lea bx,y+1
mov ah,02H
mov dl,'+'
int 21H

for2:
mov ah,01H
int 21H
add al,48
mov [bx],al
inc bx
loop for2

;-------------------
lea si,x+5 ;
lea di,y+5
lea bx,z+5
mov cx,6

for4:
mov al,[si]
sub al,[di]

cmp al,9
js nextt

sub al,10
mov dl,1
sub [si-1],dl
nextt:

mov [bx],al
dec si
dec di
dec bx
loop for4
;-------------------

mov cx,6
lea bx,z
mov ah,02H
mov dl,'='
int 21H
for3:
mov dx,48
add [bx],dx
mov dl,[bx]
mov ah,02H
int 21H
inc bx

loop for3
adding endp
;******************************
subing proc near
mov cx,5
lea bx,x+1
for11:
mov ah,01H
int 21H
sub al,48
mov [bx],al
inc bx
loop for11
mov cx,5
lea bx,y+1
mov ah,02H
mov dl,'-'
int 21H

for22:
mov ah,01H
int 21H
sub al,48
mov [bx],al
inc bx
loop for22

;-------------------
lea si,x+5 ;
lea di,y+5
lea bx,z+5
mov cx,6

for44:
mov al,[si]
sub al,[di]

cmp al,9
js next2

sub al,10
mov dl,1
sub [si-1],dl
next2:

mov [bx],al
dec si
dec di
dec bx
loop for44
;-------------------

mov cx,6
lea bx,z
mov ah,02H
mov dl,'='
int 21H
for33:
mov dx,48
add [bx],dx
mov dl,[bx]
mov ah,02H
int 21H
inc bx

loop for33
subing endp
reset:
mov ah,01h
int 21h
cmp al,'a'
jne next3
call adding
jmp exit
next3: cmp al,'s'
jne reset
call subing
;\\\\\\\\\\\\\\\\\\\
exit:
mov ax,4c00h
int 21h
main endp
cdsg ends
end main

hmd6613
چهارشنبه 13 دی 1385, 16:14 عصر
با تشکر از راهنمایتون،اما یه اشالی وجود داره این برنامه هر چی میزتم جواب جمعو صفر میاره
میشه یه سادهترشو بگید مثلا دو عدد یه رقمی یا دو رقمی بگیره؟

dostmohammady
سه شنبه 08 اسفند 1385, 12:43 عصر
سلام
یک راه ساده تر در اسمبلی هر چی که دریافت کنید به عنوان رشته دریافت می شودوشما بایدان رو تبدیل به عدد بکنید.
دریافت یک کارکتر
mov ah,01h
int 21h
دریافت مجموعه ای از کاراکتر ها یا یک رشته
mov ah,0ah
int 21h
اگرکارکتر دریافتی رو از30hکم کنی کارکتر تبدیل به عدد می گردد.بعد می توانی عملیات محاسباتی روی ان انجام بدهی.البته جواب بدست امده از عملیات باید با 30hجمع شوداگر هم رشته دریافت کردی این کار را برای هر کارکتر انجام بده وذخیره کن(در حافظه ای مثل buffer)بعد از تبدیل به عدد عملیات ریاضی مورد نظرت را روی ان اجرا کن بع دانه دانه با 30hجمع کن وذخیره کن.امیدوارم مفید باشه