PDA

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



Sasy360
چهارشنبه 10 تیر 1388, 00:35 صبح
سلام به همه
پروژه اسمبلی ما نوشتن یه برنامه هست که بیاد 10 عدد رو بگیره و اون ها رو به ترتیب نزولی و خروجی چاپ کنه.
من یه برنامه نوشتم که اعداد رو میگیره تبدیل میکنه به BCD فشرده و اون ها رو مرتب میکنه. تا اینجا برنامم مشکل منطقی زیاد داره:
این سگمنت داده برنامه است:

DATASG SEGMENT 'DATA'
MESSAGE DB 'PLEASE ENTER 10 NUMBERS','$'
ORG 1500
ARRAY DB ?
DATASG ENDSاینم قسمتی هست که کد اسکی اعداد ذخیره شده در ARRAY تبدیل به BCD فشرده میشه و فکر کنم بیشترین خطا رو این قسمت داشته باشه:

MOV BX,0
LEA DI,ARRAY
MOV CX,10
MOV CL,4
LOOP4: MOV AL,[DI]
MOV AH,[DI+1]
AND AL,0FH
AND AH,0FH
SHL AL,CL
OR AL,AH
MOV [DI+BX],AL
ADD DI,2
DEC BX
LOOP LOOP4CX تعداد دور تو LOOP رو مشخص میکنه و CL هم مقدار شیفت رو. حالا اگه تو حلقه شیفت داشته باشیم باید چیکار کنیم؟ اینا قاطی میشن که!
نمیشه دو تا اشاره‌گر رو با هم OR کرد؟ از من که خطا می گرفت.
از کد
MOV [DI-BX],AL ایراد میگرفت و مجبور شدم
MOV [DI+BX],AL رو بنویسم. حالا اگه صفر رو بزارم تو BX و بعد BX رو یکی کم کنم مقدار میشه منفی یک؟
این قسمت مقایسه هست:

LEA DI,ARRAY;compare
MOV CX,09
LOOP2:
MOV AL,[DI]
MOV AH,[DI+1]
CMP AL,AH
JLE JUMP1
XCHG AL,AH
MOV [DI],AL
MOV [DI+1],AH
JUMP1: INC DI
LOOP LOOP2;/compareنمیشه دو تا اشاره گر رو XCHG کرد؟

mg_mahyar
چهارشنبه 10 تیر 1388, 16:59 عصر
من برنامه ام رو نوشتم میزارم برات
sort توش داره
http://barnamenevis.org/forum/showthread.php?t=165760

Sasy360
جمعه 26 تیر 1388, 01:45 صبح
من برنامه ام رو نوشتم میزارم برات
sort توش داره
http://barnamenevis.org/forum/showthread.php?t=165760ممنون خیلی جالب بود. باعث شد یه کتاب بخرم. ماکرو ها و کلی چیز کوچیک و بزرگ دیگه هم یاد بگیرم.
برنامتون یه چند تا باگ کوچیک داشت که برطرفشون کردم


SHOW_MSG MACRO MSG
PUSH AX
PUSH DX
MOV AH,09H
MOV DX,OFFSET MSG
INT 21H
POP DX
POP AX
ENDM
CLRSCREEN MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,06H
MOV AL,00H
MOV CX,00
MOV DX,5F5FH
MOV BH,245
INT 10H
POP DX
POP CX
POP BX
POP AX
ENDM
GOTOXY MACRO X,Y
PUSH AX
PUSH BX
PUSH DX
MOV AH,02H
MOV DL,X
MOV DH,Y
MOV BH,0
INT 10H
POP DX
POP BX
POP AX
ENDM
PUTCH MACRO CHAR
MOV AH,02H
MOV DL,CHAR
INT 21H
ENDM
GETCH MACRO
MOV AH,07H
INT 21H
ENDM
DATA_HERE SEGMENT
A DW 20 dup(?)
MSG1 DB 'ENTER 20 NUMBER CONTAINS 4 DIGIT OR LOWER:',0DH,0AH,'$'
MSG2 DB 0DH,0AH,'SORTED IS:','$'
MSG3 DB 0DH,0AH,'$'
DATA_HERE ENDS
;................................................. ...
STACK_HERE SEGMENT
DW 20 DUP(0)
STACK_HERE ENDS
;................................................. ...
CODE_HERE SEGMENT
ASSUME CS:CODE_HERE,DS:DATA_HERE,SS:STACK_HERE
MAIN PROC FAR
MOV AX,DATA_HERE
MOV DS,AX
;................................................. ...
CLRSCREEN
GOTOXY 0,0
;................................................. ...
LEA SI,A
CALL IN_PUT
LEA SI,A
CALL SORT_SELECT
LEA SI,A
CALL OUT_PUT
GETCH
MOV AH,4CH
INT 21H
MAIN ENDP
;................................................. ...
IN_PUT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
SHOW_MSG MSG1
MOV CH,20
NEXT_NUMBER: MOV CL,04
MOV DI,0
NEXT_CHAR: GETCH
CMP AL,0DH
JNE CHEK_DIGIT
CMP CL,04
JE NEXT_CHAR
JNE NEXT_NUMBER2
CHEK_DIGIT: CMP AL,39H
JA NEXT_CHAR
CMP AL,30H
JB NEXT_CHAR
PUTCH AL
SUB AL,30H
MOV BL,AL
MOV AX,10
MUL DI
MOV DI,AX
MOV BH,0
ADD DI,BX
DEC CL
JNZ NEXT_CHAR
NEXT_NUMBER2: MOV WORD PTR [SI],DI
ADD SI,2
PUTCH 0DH
PUTCH 0AH
DEC CH
JNZ NEXT_NUMBER
POP BP
POP DX
POP CX
POP BX
POP AX
RET
IN_PUT ENDP
;................................................. ...
SORT_SELECT PROC NEAR
PUSH BX
PUSH DI
MOV CX,38
L2: MOV BX,CX
L1: MOV DI,[SI]
CMP DI,[SI][BX]
JAE COMPARED
PUSH [SI][BX]
PUSH [SI]
POP [SI][BX]
POP [SI]
COMPARED: SUB BX,2
JNZ L1
ADD SI,2
SUB CX,2
JNZ L2
POP DI
POP BX
RET
SORT_SELECT ENDP
;................................................. ...
OUT_PUT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
SHOW_MSG MSG2
MOV CH,20
LABEL2: SHOW_MSG MSG3
MOV BP,10
MOV DX,0
MOV AX,WORD PTR [SI]
DIV BP
PUSH DX
MOV DX,0
DIV BP
PUSH DX
MOV DX,0
DIV BP
PUSH DX
PUSH AX
MOV CL,4
MOV BP,0
LABEL1: POP BP
ADD BP,48
MOV BX,BP
PUTCH BL
DEC CL
JNZ LABEL1
ADD SI,2
DEC CH
JNZ LABEL2
POP BP
POP DX
POP CX
POP BX
POP AX
RET
OUT_PUT ENDP
;................................................. ...
CODE_HERE ENDS
END MAIN

trminator
چهارشنبه 10 شهریور 1389, 18:36 عصر
این برنامه تو کتاب مهندس نیکمهر نوشته بود که مرتب سازی حبابی صعودی رو انجام میده. من فکر می کنم که اشتباه باشه لطفا بررسی کنید. a آرایه n عنصری مورد نظر هست.

bubble ; sort
n dw ?
mov cx,n
dec cx
loop1: mov di,cx
mov bx,0
loop2: mov ax,a[bx]
cmp ax,a[bx+2]
jge continue
xchg ax,a[bx+2]
mov a[bx],ax
continue: add bx,2
loop loop2
mov cx,di
loop loop1

خط نهم رو نگاه کنید. شرط greater than equal هست. یعنی عنصر قبلی آرایه بزرگتر از عنصر بعدی باشه پس باید در این جا جابجایی انجام بشه ولی اینجا می پره به continue

xman_1365_x
شنبه 13 شهریور 1389, 03:24 صبح
این برنامه تو کتاب مهندس نیکمهر نوشته بود که مرتب سازی حبابی صعودی رو انجام میده. من فکر می کنم که اشتباه باشه لطفا بررسی کنید. a آرایه n عنصری مورد نظر هست.

bubble ; sort
n dw ?
mov cx,n
dec cx
loop1: mov di,cx
mov bx,0
loop2: mov ax,a[bx]
cmp ax,a[bx+2]
jge continue
xchg ax,a[bx+2]
mov a[bx],ax
continue: add bx,2
loop loop2
mov cx,di
loop loop1


خط نهم رو نگاه کنید. شرط greater than equal هست. یعنی عنصر قبلی آرایه بزرگتر از عنصر بعدی باشه پس باید در این جا جابجایی انجام بشه ولی اینجا می پره به continue




الان خوابم مياد حال بررسي ندارم:لبخند: باشه 15/6/89 به بعد ميام ميگم!
اما تو كتابش قسمت برنامه هاي نمونه دو مورد ديگه هست كه كاملتر هست سورس ها و همچنين الگوريتمشم هست.