View Full Version : سوال: برنامه ی که آرایه n عنصری را از نوع dd را دریافت کرده و کوچکترین عنصر آرایه مشخص کند
sadegh5822
شنبه 10 خرداد 1393, 20:17 عصر
سلام کسی سورس این برنامه رو داره.؟ برنامه ی بنویسید که آرایه n عنصری را از نوع dd را دریافت کرده و کوچکترین عنصر آرایه مشخص کند.؟
vahid-p
شنبه 10 خرداد 1393, 22:06 عصر
یکم سعی کنید، نتونستید اگه وقت شد امشب یا بعد امتحان فردا براتون مینویسم. خیلی سادست، فقط سختی کارش اینه که عدد رو از ورودی بگیری. یعنی کاراکترها رو ضرب در 10 و با هم جمع کنی و به عنوان یک عدد ذخیره کنی. ببین اینو میتونی بنویسی.
vahid-p
یک شنبه 11 خرداد 1393, 16:30 عصر
خب من نحوه گرفتن اعداد رو مینویسم. یعنی یه جور مثل c++ اینکار رو انجام میده : <<cin
بقیش دیگه سادست و انتظار دارم خودتون انجام بدید تا تمرین درسی کاملا یک طرفه حل نشده باشه.
منظورتون از dd همان define double است و Double اعداد 32 بیتی است ( در اسمبلی 8086 )
با توجه به این موضوع ما دو ثبات ( register ) شانزده بیتی استفاده میکنیم برای ذخیره اعدادمون.
برنامه عدد رو از ورودی میگیره ( دقت کنید هنگام گرفتن اعداد فقط باید عدد و در پایان Enter زد. برگشت ( backspace ) و... باعث اخلال در برنامه میشه و تو این کد این موارد رو در نظر نگرفتم ) و مقدار با ارزش عدد رو در DX و کم ارزش رو در AX قرار میده. این procedure گرفتن عدد Double :
getdouble proc
mov ax,0
mov dx,0
loop1:
push dx
push ax
mov ah,01
int 21h
cmp al,0dh
je endproc
mov cl,al
pop ax
mov bx,10
mul bx
sub cl,'0'
mov ch,0
add ax,cx
adc dx,0
pop cx
push ax
push dx
mov ax,cx
mov bx,10
mul bx
mov dx,ax
pop cx
pop ax
add dx,cx
jmp loop1
endproc:
pop ax
pop dx
ret
getdouble endp
اما کد بالا بعلاوه نحوه ذخیره عدد حاصل :
data segment
a dd 0
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax, data
mov ds, ax
mov es, ax
call getdouble
lea bx,a
mov [bx],dx
mov [bx]+2,ax
mov ax, 04c00h
int 21h
getdouble proc
mov ax,0
mov dx,0
loop1:
push dx
push ax
mov ah,01
int 21h
cmp al,0dh
je endproc
mov cl,al
pop ax
mov bx,10
mul bx
sub cl,'0'
mov ch,0
add ax,cx
adc dx,0
pop cx
push ax
push dx
mov ax,cx
mov bx,10
mul bx
mov dx,ax
pop cx
pop ax
add dx,cx
jmp loop1
endproc:
pop ax
pop dx
ret
getdouble endp
ends
end start
حالا شما کافیه، اون آرایه ای که تعریف کردید، به تعداد n این کار رو تکرار کنید. و آرایتون درست میشه.
حالا برای یافتن مینیمم، یک متغیر به اسم مثلا min dd 0 اول برابر مقدار اولین عدد آرایه قرار میدید و بعد از اون مقایسه میکنید اگر قسمت با ارزش عدد داخل آرایه از مقدار با ارزش عدد min کمتر بود، پس این عدد رو داخل min ذخیره میکنید. اگر برابر بود، مقدار کم ارزش رو مقایسه میکنید. و این کار رو تا انتها انجام میدید و در انتهای کار مقدار min مینیمم آرایه است.
موفق باشید
sadegh5822
سه شنبه 13 خرداد 1393, 07:01 صبح
دوست عزیز اگه امکانش است خودت کاملش کن.
vahid-p
سه شنبه 13 خرداد 1393, 15:34 عصر
قسمت سختشو که نوشتم برات. برای یافتن مینیمم، من کامل و گام به گام توضیح دادم چیکار میکنی. دو خط که میتونی بنویسی.
من برنامه کامل رو نمینویسم چون نه وقتش هست و به درد من نمیخوره، مهم اینه شما یادبگیرید. وگرنه کل کد مینوشتم، یک کلام هم توضیح نمیدادم!
درسته توضیح دادن شاید وقت بیشتری بگیره، ولی برای شما یا کسان دیگه ای که بعدا شاید این تاپیک رو ببینند به درد میخوره.
خب برای مقایسه کردن هم توضیح بدم.
شما بعد از گرفتن اعداد min رو برابر عدد اول آرایه قرار میدید.
یعنی :
lea bx,min
lea si,array
mov ax,[si]
mov [bx],ax
mov ax,[si]+2
mov [bx]+2,ax
اما یک procedure برات مینویسم که کارت رو راحت کنم. اسمش رو میذارم compare که عدد داخل آرایه قسمت پر ارزشش رو به dx میدی و قسمت کم ارزشش رو به ax . اونوقت call compare میکنی و اگر کوچکتر بود خودش عدد کوچکتر رو به min انتقال میکنه ( ضمنا حتی اگر بزرگتر بود bh=1 , bl=0 و اگر مساوی بود bl=1 , bh=0 قرار میده و اگر کوچکتر بود ( چیزی که ما اینجا میخوایم ) کل bl=0 , bh=0 میکنه و همچنین با جامپ jz میتونی بفهمی کوچکتر هست یا خیر که من داخل خود پراسیجر compare آوردم )
پس اول عدد اولی رو به min میدم ( همون کد چند خط قبل )
بعد از اون هر عدد آرایه ( که هر عدد با عدد قبلیش از نظر خونه ای که قرار دارن باید بعلاوه 4 کنی ( چون 32 بیتیه ) ). قسمت پر ارزش در dx و کم ارزش در ax.
مثلا در ادامه برنامه قبل : ( این در حلقه n-1 بار تکرار میشه )
add si,4
mov dx,[si]
mov ax,[si]+2
call compare
اینم از پراسیجر compare :
compare proc
lea bx,min
mov cx,[bx]
cmp dx,cx
jb minimum
ja maximum
mov cx,[bx]+2
cmp ax,cx
je equal
jb minimum
maximum:
mov bh,1
mov bl,0
or bh,1
jmp endofproc
minimum:
and bx,0
jmp endofproc
equal:
mov bh,0
mov bl,1
or bl,1
endofproc:
jnz endofproc2
lea bx,min
mov [bx],dx
mov [bx]+2,ax
endofproc2:
ret
compare endp
تو یک حلقه n-1 بار باید تکرار بشه ( procedure رو نمیگما ). همین! ( حواستون باشه اگر از cx برای شمارنده استفاده میکنی، حتما قبل از call compare اونو ذخیره کنی و بعد از اون بازخونی کنی ( مثلا با push , pop در stack چون cx داخل procedure تغییر میکنه. )
بقیش با خودتون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.