ورود

View Full Version : پیدا کردن max



ghazal_mohammady
یک شنبه 04 فروردین 1392, 12:03 عصر
با عرض سلام و خسته نباشید خدمت اساتید گرامی، من در برنامه نویسی اسمبلی بسیار مبتدی هستم و نیاز به کمک فوری دارم،
سه برنامه رو هر چه سریع تر باید تحویل بدم
1) پیدا کردن ماکسیمم بین ده عدد ورودی
2) انجام عمل ضرب بدون استفاده از عملگر ضرب
3) پیدا کردن کارکتر متفاوت در بین دو رشته ی و برگردادن مکان تفاوت

آیا می تونم از حضورتون کمک بگیرم ؟
پیشاپیش سپاس گزارم

xman_1365_x
یک شنبه 04 فروردین 1392, 13:36 عصر
شروع به نوشتن کنید هر جا مشکل داشتین سوال کنید،کدی هم که نوشتین قرار بدین

ghazal_mohammady
یک شنبه 04 فروردین 1392, 14:52 عصر
سپاس گزارم از توجه شما
اما من اول اول راهم اصلا بلد نیستم باید چه کار کنم، وقتمم کمه
میشه یه منبعی مرتبط به بنده معرفی کنید؟
باز هم سپاس گزارم

ghazal_mohammady
یک شنبه 04 فروردین 1392, 16:09 عصر
:افسرده:


dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
MAIN PROC FAR
mov ax,dseg
mov dx,ax

mov bx,10
for:
dec bx
MOV AH,1H
INT 21H
cmp bx,0
je l2
loop for
l2:
SUB AL,48
cmp al,max
ja l3
l3:
mov max,al
cmp bx,0
je end1
end1:
MOV AH,9H
lea dx,maxstr
INT 21H
MOV AH,2H
MOV DL,max
ADD DL,48
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
END MAIN

مثل این که مشکلشو نمی دونم چطور حل کنم

ghazal_mohammady
یک شنبه 04 فروردین 1392, 16:58 عصر
از مدیران محترم خواهش می کنم راهنماییم کنند، من دنبال راحت طلبی نیستم ولی متاسفانه در دانشگاه مدرس خوبی نداشتم و هیچ چیز یاد نگرفتم، اگه منابع مختصر و کاربردی می شناسید لطفا راهنماییم کنید
بازهم سپاس گزارم

xman_1365_x
دوشنبه 05 فروردین 1392, 02:12 صبح
اگر در گوگل جستجو میکردین منابع زیادی میدیدین،برای برنامه ماکزیمم اول با استفاده از وقفه 21 تابع 10 یک بافر از ورودی بگیرید،بعد نیاز به حلقه دارین ده بار تکرار شه ساده ترین راه استفاده از دستور لوپ هست،بعد هم پیمایش هست اگر میتونید مثلا ادرس حافظه رو با اندیس کاهش یا افزایش بدین برای پیمایش کردن،دستور مقایسه هم cmp
از محیط emu8086 استفاده کنید، در منوی راهنماش مثال هایی از طرز استفاده زده
فکر کنم راهنمایی برای شروع کافیه
موفق باشید

f_talebi
دوشنبه 05 فروردین 1392, 10:37 صبح
متاسفانه اسمبلی کمی از یادم رفته. الان مشکل این کد چیه؟ میتونم برات ی سری توضیح ک یادم مونده رو بگم نمیدونم ب دردت میخوره یا نه اما چون گفتی ک متوجش نمیشی فکر کردم شاید ب دردت بخوره کمی توضیح .


mov bx,10 اینجا مقدار 10 رو به bx دادیم و bx برامون نقش شمارنده رو داره تو این برنامه.
for:
dec bx داره یکی یکی از bx کم میشه .این همون bx-- تو سی پلاس پ
MOV AH,1H اینجا تابع1هگز رو به ah میفرستیم و تو خط بعد میگیم که این تابع از وقفه ی 21 هگز هستش.
INT 21Hهمیشه شماره ی تابع رو بهah میدیم و بعدش اون وقفه رو فراخوانی میکنیم. و هر تابع هم یه کار خاصی برامون انجام میده.
cmp bx,0 سی ام پی مخفف کلمه ی compare به معنی مقایسه کردنه. تو حلقه ها از این استفاده میشه که ببینیم کی حلقه مون تموم میشه. اینجا ک صفرو با bx مقایسه کرده ک بدونه مقدار bx چنده
je l2 اگر برابر با صفر شد به l2 برو. Je نخفف jump equal هست اگه درست گفته باشم ک یعنی اگه در خط قبل عملگرها باهم برابر بودند به این لیبلی ک جلوت نوشتم)l2( بپر
loop for
l2: اینم لیبل l2:
SUB AL,48 اومده مقداره 48رو از al کم کرده ظاهرا
cmp al,max و اینجا al رو با max مقایسه کرده
ja l3 اگر بزرگتر بود به لیبل l3 برو
l3:
mov max,al
cmp bx,0
je end1
end1:
MOV AH,9H این چند دستور بالا هم ک مشخص بودن. و حالا این تابع 9h که به ah میره ؛کارش چاپ رشته هست و از این خط تا دو خط بعد همش مال چاپ رشتست.
lea dx,maxstr باید آدرس آفست متغیری که میخوای مقدارش چاپ بشه رو به dx بدی؛ دستور lea این کارو برات انجام میده. اون maxstr هم خودت تعریفش کردی قبلا و میخوای الان چاپش کنی.
INT 21H اینم وقفه ای ک باعث چاپ رشته میشه.پس تا اینجا شد چاپ رشته.
MOV AH,2H متاسفاته کار تابع 2h رو بخاطر ندارم!
MOV DL,max
ADD DL,48
INT 21H
MOV AX,4C00H این تابع 4ch هم تا جایی ک یادمه آخر برنامه مینوسن و برای اتمام برنامه و آزاد کردن منابع هست
INT 21H و اینم وقفشه. همیشه وقفه آخر نوشته میشه .

f_talebi
دوشنبه 05 فروردین 1392, 13:54 عصر
اگه سرچ کنید خیلی چیزا پیدا میکنید.اینم مربوط ب وقفه ها :

http://hpkclasses.ir/Courses/Assembly/asm1200.html

اینجا هم هست:

http://alirezakhelafati.blogfa.com/post/399

http://www.iran-eng.com/archive/index.php/t-272649.html?

که منم با خوندن این مطالب ،این تابع ها رو که بلد نبودم یاد گرفتم! :

ﻭﻗﻔﻪ 21h

ﺗﺎﺑﻊ 01h. ﻳﮏ ﮐﻠﻴﺪ ﺭﺍ ﺍﺯ ﺻﻔﺤﻪ ﮐﻠﻴﺪ ﻣﯽ ﺧﻮﺍﻧﺪ.
ﮐﺪ ﮐﻠﻴﺪ ﺧﻮﺍﻧﺪﻩ ﺷﺪﻩ ﺩﺭ ﺛﺒﺎﺕ AL ﺑﺮﮔﺮﺩﺍﻧﺪﻩ ﻣﯽ ﺷﻮﺩ.

mov AH, 0lh
int 21h
mov AL, character
ﺗﺎﺑﻊ 02h. ﻳﮏ ﮐﺎﺭﺍﮐﺘﺮ ﺭﺍ ﺭﻭﯼ ﺻﻔﺤﻪ ﻧﻤﺎﻳﺶ ﻧﺸﺎﻥ ﻣﯽ ﺩﻫﺪ.
ﮐﺪ ﮐﺎﺭﺍﮐﺘﺮ ﺩﺭ ﺛﺒﺎﺕ DL ﺑﺎﻳﺪ ﻗﺮﺍﺭ ﺩﺍﺩﻩ ﺷﻮﺩ.

mov AH, 02h
mov DL,character
int 21h

ghazal_mohammady
دوشنبه 05 فروردین 1392, 15:42 عصر
با سلام و سپاس بسیار زیاد از راهنمایی های شما
راستشو رو بخواین من تو جزوه م همه ی وقفه ها رو دارم اما برنامه نوشتن چیزیه که با تجربه باید مسلط شم مثلا این برنامه ی مکس رو ببینید، چرا خروجیش صفره ؟


dseg segment 'data'
max db 1,5,8,6,7,3,5,1,5,4
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
main proc far
mov ax,dseg
mov dx,ax
mov bx,0
mov al,max[bx]
sub al,48
mov cx,10
for:
inc bx
cmp al,max[bx]
jna l1
mov al,max[bx]
l1:
loop for

mov ah,2h
mov dl,al
add dl,48
int 21h
mov ax,4c00h
int 21h
main endp
cseg ends
end main

ghazal_mohammady
پنج شنبه 08 فروردین 1392, 17:30 عصر
با سلام مجدد، خواهش می کنم استاید محترم کمکم کنند، مشکل این کدها چیه ؟


dseg segment 'data'
max db 1,5,8,6,7,3,5,1,5,4
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
main proc far
mov ax,dseg
mov dx,ax
mov bx,0
mov al,max[bx]
sub al,48
mov cx,10
for:
inc bx
cmp al,max[bx]
jna l1
mov al,max[bx]
l1:
loop for

mov ah,2h
mov dl,al
add dl,48
int 21h
mov ax,4c00h
int 21h
main endp
cseg ends
end main

ghazal_mohammady
پنج شنبه 08 فروردین 1392, 17:31 عصر
و این کد


dseg segment 'data'
st_1 label byte
max1 db 40
len1 db ?
str1 db 40 dup(?)
st_2 label byte
max2 db 40
len2 db ?
str2 db 40 dup(?)
msg1 db "PLZ enter string1:",'$'
msg2 db 10,13,"PLZ enter string2:",'$'
dif db 0
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
main proc far
mov ax,dseg
mov dx,ax
mov ah,9h
lea dx,msg1
int 21h
lea dx,st_1
mov ah,0ah
int 21h

mov ah,9h
lea dx,msg2
int 21h
lea dx,st_2
mov ah,0ah
int 21h
mov bl,len1
mov bh,0

mov cx,bx
for:
mov al,str1[bx]
mov bl,str2[bx]
cmp al,bl
jne l2
inc dif
l2:
loop for

mov dl,dif
add dl,48
mov ah,2h
int 21h
mov ax,4c00h
int 21h
main endp
cseg ends
end main

خواهش می کنم بزرگواری کنید و کمکم کنید، مشکل من فقط مبتی بودنه که نمیتونم برنامه به زبان اسمبلی بنویسم ؟؟؟

gh_mohammady
دوشنبه 12 فروردین 1392, 09:07 صبح
اساتید عزیز خواهش می کنم کمکم کنید، باقی کدهارو خودم درست کردم اما این کد رو نمیدونم باید چیکارش کنم
باید مکس رو نشون بده ولی همش عدد آخر رو نشون می ده



dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
MAIN PROC FAR
mov ax,dseg
mov ds,ax

mov bx,10
for:
dec bx
MOV AH,1H
INT 21H
cmp bx,0
je l2
loop for
l2:
SUB AL,48
cmp al,max
ja l3
l3:
mov max,al
cmp bx,0
je end1
end1:
MOV AH,9H
lea dx,maxstr
INT 21H
MOV AH,2H
MOV DL,max
ADD DL,48
INT 21H
MOV AX,4C00H
INT 21H
MAIN ENDP
END MAIN

Hr.Ziggurat
سه شنبه 13 فروردین 1392, 00:37 صبح
یه چندتا مشکل داره :
توی اون حلقه ی اول از loop استفاده کردی ولی به CX که مقدار ندادی! بعد شرط پایان حلقه رو اصلا BX گذاشتی!
بعد هر بار که عدد گرفته میشه ، عدد قبلی کجا میره؟!
اون خط l3 هم خیلی با حاله! چه AL از max بزرگتر باشه چه نباشه برنامه به l3 میرسه که!
BX قبل خط end1 چرا باید دوباره با 0 مقایسه بشه ؟ بدیهی که صفره!
باز واسه end1 که همون مشکل l3 وجود داره!


dseg segment 'data'
max db 0
maxstr db "maxstr: ",'$'
errstr db "digit error! ",'$'
dseg ends
cseg segment 'code'
assume cs:cseg,ds:dseg
MAIN PROC FAR
mov ax,dseg
mov ds,ax
mov ah,1
mov cx,10
for:
INT 21H
cmp max,al
ja not_max
mov max,al
not_max:
loop for
cmp max,48
jb error
cmp max,57
ja error
MOV AH,9H
lea dx,maxstr
INT 21H
MOV AH,2H
MOV DL,max
INT 21H
jmp endprog
error:
MOV AH,9H
lea dx,errstr
INT 21H
endprog:
MOV AX,4C00H
INT 21H
MAIN ENDP
END MAIN

اینجور کدا فکر کنم راحت با google پیدا بشه...

gh_mohammady
شنبه 17 فروردین 1392, 11:53 صبح
از همکاری شما واقعا سپاس گز ارم جناب Hr.Ziggurat (http://barnamenevis.org/member.php?217817-Hr.Ziggurat)