با سلام
کسی می تونه بهم کمک کنه که چه جوری میشه چند عدد را از ورودی دریافت کرده تا روی آنها محاسبات ریاضی انجام دهیم؟(تو زبان اسمبلی)
با سلام
کسی می تونه بهم کمک کنه که چه جوری میشه چند عدد را از ورودی دریافت کرده تا روی آنها محاسبات ریاضی انجام دهیم؟(تو زبان اسمبلی)
اعداد رو تو اسمبلی به سادگی نمیتونید دریافت کنید.
باید کاراکتر به کاراکتر بگیریشون و تبدیلشون کنی به عدد
شروع کن هر جا با مشکل برخورد کردی بپرس
You never know what you can do until you try
اگه اعداد زیاد بود باید از آرایه ها استفاده کرد؟من می خوام یه ماتریسو از ورودی بخونم و روش محاسبات ریاضی انجام بدم.می تونید یه روش خوب بهم معرفی کنید؟
با سرویس 0ah از وقفه ی شماره 21h یک رشته اطلاعات از صفحه کلید خوانده میشود و در محلی در سگمنت داده که خودت به طور معین در سگمنت داده از قبل تعریف کردی ذخیره میشود.البته این سرویس کاراکتر هایی که از صفحه کلید خوانده میشوند را روی مانیتور میفرستد.برای استفاده 1_ توی سگمنت داده با شبه دستور lable حافظه ی مورد نیاز رو تعریف کن.(به همون شیوه ای که خودت بهتر بلدی!) 2_حداکثر تعداد حروف رو بعد از دستور لیبل قرار بده و حتما هم براش اسم انتخاب کن.3_مکان دیگری در سگمنت داده در نظر بگیر برای اینکه سیستم عامل تعداد واقعی حروف را برات اونجا قرار بده.(بایت بعدی.)سومین بایت به بعد سگمنت داده همان رشته ی مورد نظر قرار میگیرد.پس براش حافظه ی لازم رو در نظر بگیر و با space پرش کن. این سرویس برای پایان دادن به ورود اطلاعات دگمه ی enter رو میشناسه.
حالا به جایی رسیدی که رشته رو گرفتی!.با کد اسکی هایی که در اختیار داری هر عملی که دلت خواست روش انجام بده.
یادت باشه که توی اسمبلی تمام سرویس های ورودی کد اسکی میگیرند.
این سوالت به ظاهر ساده است ولی در اسمبلی پیچیدگیهای خاص خودشو داره باید به چند نکته دقت کنی:
1-میخواهی عددهات بصورت BCD ذخیره شوند یا Binary یا ...
2-چند رقمی بودن اعداد
3-با توجه به 1و2 میتوانی بفهمی که هر عدد حداکثر چند بایتی است پس باید متغیری متناسب با آن تعریف کنی
4-عددها رو یک رقم یک رقم بگیری 30H تا ازش کم کنی و با توجه به نوع عدد(BCDیاBinary) آنها با الگوریتمی به متغیر اضافه کنی
سلام
حالتون خوبه
این سورس همون کاری رو میکنه که شما میخواهید
میتونید خودتون برید و تحلیل کنید و به هدفتون برسید
این سورس کارش جمع کردن یا بسته به نیاز با تغییر کوچکی تفریق دو تا عدد 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
ببخشید من معذرت میخوام اشتباه کپی کردم
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
با تشکر از راهنمایتون،اما یه اشالی وجود داره این برنامه هر چی میزتم جواب جمعو صفر میاره
میشه یه سادهترشو بگید مثلا دو عدد یه رقمی یا دو رقمی بگیره؟
سلام
یک راه ساده تر در اسمبلی هر چی که دریافت کنید به عنوان رشته دریافت می شودوشما بایدان رو تبدیل به عدد بکنید.
دریافت یک کارکتر
mov ah,01h
int 21h
دریافت مجموعه ای از کاراکتر ها یا یک رشته
mov ah,0ah
int 21h
اگرکارکتر دریافتی رو از30hکم کنی کارکتر تبدیل به عدد می گردد.بعد می توانی عملیات محاسباتی روی ان انجام بدهی.البته جواب بدست امده از عملیات باید با 30hجمع شوداگر هم رشته دریافت کردی این کار را برای هر کارکتر انجام بده وذخیره کن(در حافظه ای مثل buffer)بعد از تبدیل به عدد عملیات ریاضی مورد نظرت را روی ان اجرا کن بع دانه دانه با 30hجمع کن وذخیره کن.امیدوارم مفید باشه