PDA

View Full Version : مرتب سازی حبابی



omidparkour
پنج شنبه 29 آبان 1393, 15:11 عصر
سلام
من میخوام یه برنامه بنویسم که 10 تا عدد از ورودی بگیره و در آرایه ای قرار بده و سپس مرتب سازی کنه
من خودم برنامه زیر رو نوشتم اما نمیدونم چرا کار نمیکنه

include io.h.model small
.Stack 200h
.Data
;arr1 db 10 dup(?)
msg1 db "enter a number: ",0
msg2 db "the entered number is:",0
crlf db 10,13,0
temp dw ?
temp2 dw ?
arrw dw 10 dup(?)
.Code
main proc
mov ax, @data
mov ds, ax
;-------------------------------------------------------------
clrscr
mov si, offset arrw
;mov di, offset arrw
mov cx,10
wh1:
output msg1
inputs temp,4
atoi temp
mov [si],ax
add si,2
clrscr
loop wh1
;-------------------------------------------------------------
;mov si,offset arrw
;mov di,offset arrw
;add di,2
;mov ax,[si]
;mov bx,[di]
;mov cx,9
;wh3:
; mov ax,[si]
; mov bx,[di]
; cmp ax,bx
; jg great
; jnbe wh3
;great:
; mov [di],ax
; mov [si],bx
; add si,2
; add di,2
; loop wh3
;-------------------------------------------------------------
;Sort Asc
;-------------------------------------------------------------


mov si,offset arrw
mov di,offset arrw
add di,2
mov cx,10
;cmp cx,9
;je finish
loop2: ;cmp cx,0
;je finish
mov ax,[si]
mov bx,[di]
cmp ax,bx
ja change ;jump Greater
;loop3:
add si,2
add di,2
jmp loop2
;cmp ax,bx
; jne loop2 ;jump not Equal
; loop loop2
;jmp finish
change:
mov [di],ax
mov [si],bx
add di,2
jmp loop2
finish:
;-------------------------------------------------------------
mov si, offset arrw
mov cx,10
output msg2
output crlf
wh2:
mov dx,[si]
itoa temp2,dx
;mov temp3,bx
output temp2
output crlf
add si,2
loop wh2
;-------------------------------------------------------------
mov ax, 4c00h
int 21h
main endp
end main

masoud.8086
پنج شنبه 29 آبان 1393, 17:40 عصر
سلام
من به دليل اينكه فايل هدرتو نداشتم نتونستم برنامرو اجرا كنم اما ي ايراد برام مسلمه اونم اينه كه نحوه تعريف ارايت براي دريافت از ورودي رو اشتباه تعريف كردي

(?)arrw dw 10 dup
كه درستش اينطوريه

(?)arrw dw 10,10 dup
البته وقتي از ورودي دريافت ميكني خونه اول و دوم ارايتو نميتوني استفاده كني پس بايد از انديس سوم ارايت كه خونه دوم ميشه به بعد ازش استفاده كني.يعني[mov si,arrw[2
موفق باشي.

omidparkour
پنج شنبه 29 آبان 1393, 23:43 عصر
الان فکر نکنم درست شده باشه :افسرده:

omidparkour
جمعه 30 آبان 1393, 23:02 عصر
اسمبلی کار نداره این انجمن ؟؟؟؟؟؟؟؟؟!!!!!!!!!!!!!!!!!

masoud.8086
شنبه 01 آذر 1393, 09:49 صبح
سلام
به اين مثال توجه كن
; multi-segment executable file template.


data segment
a db 1,2,3,4,5
n dw 5
m dw 5
ends


stack segment
dw 128 dup(0)
ends


code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax
mov n,5
mov cx,5
p:
mov si,0
mov di,1

push n

l:
cmp n,0
je exit
mov al,a[si]
cmp al,a[di]
jl chang
inc si
inc di
dec n

jmp l
chang:
xchg al,a[di]
mov a[si],al
inc si
inc di
dec n
jmp l
exit:
pop n
dec n
loop p
mov ax, 4c00h ; exit to operating system.
int 21h
ends


end start ; set entry point and stop the assembler.






اينجا ي ارايه تعريف شده كه من ميخوام اينو مرتبش كنم
ابتدا ميايم دو خونه اولو مقايسه ميكنم واگر لازم بود جاهاشونو عوض ميكنيم بعد ميام خونه دوم و سومو و بعد سوم و چهارم و همينطور بعدي ها .خوب ي بار كه حلقه L تموم بشه يعني كوچكترين عنصر ارايم در خونه اخر قرار گرفته يعني از 5 تا خونه يكش مرتب شده پس دفه بعد بايد بيام 4 تاخونه ديگه ارايه رو مرتب كنم (حلقه p) حلقه p هر بار ي بار كمتر اجرا ميشه .تا جايي كه حلقه p =0ميشه يعني كل ارايه مرتب شده.حالا اگه ميخواي از ورودي دريافت كني از وقنه int 21h/ah.,0ah ويا وقفه int21/ah/01 استفاده ميكني و داخل ارايه ميريزي و بعد براساس تعداد ورودي هات تعداد تكرار حلقتو مشخص ميكني (يعني مقدار n ,مقدار حلقه اول mov cx,5) كه اينجا چون تعداد خونه هاي ارايم(ورودي هام 5 تا بوده ).همچنين وقتي از وردي دريافت ميكني بايد رشته عددي رو به عدد تبديل كني چون اسمبلي همه چيزو به عنوان رشته ميشناسه براي اين كارم بايد بياي ارزش گذاري رشته عددي رو انجام بدي كه تاچند تا پست پايين تر دربارش توضيح دادم..
موفق باشي.