ورود

View Full Version : برنامه sort



mg_mahyar
شنبه 06 تیر 1388, 16:49 عصر
سلام من یک برنامه نوشتم که 20 عدد حداکثر 4 رقمی رو میگیره در آرایه ذخیره میکنه و بعد به ترتیب نزولی مرتب میکنه و نمایش میده
برنامه به نطرم درسته ولی درست کار نمیکنه نمیدونم ایراد از sort هست یا نمایش عدد ها لطفا کمک کنید خیلی فوریه

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,184FH
MOV BH,07
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 DD 20dup(0)
CONT DB 0
MSG1 DB 'ENTER 20 NUMBER 4 DIGIT OR LOWER:',0DH,0AH,'$'
MSG2 DB 0DH,0AH,'SORTED IS:','$'
MSG3 DB 0DH,0AH,'$'
DATA_HERE ENDS
;................................................. ...
STACK_HERE SEGMENT
DW 20DUP(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
MOV AX,STACK_HERE
MOV SS,AX
;............................................
CLRSCREEN
GOTOXY 2,5
;............................................
LEA SI,A
CALL BINARRY_INPUT
LEA SI,A
CALL SORT_SELECT
LEA SI,A
CALL BINARRY_SHOW
SHOW_MSG MSG1
GETCH
MOV AH,4CH
INT 21H
MAIN ENDP
;................................................. ...
BINARRY_INPUT PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
SHOW_MSG MSG1
MOV BX,00
MOV CH,20
NEXT_NUMBER:MOV CL,04
NEXT_CHAR:GETCH
CMP AL,0DH
JNZ CHEK_DIGIT
CMP CL,04
JZ NEXT_CHAR
JNZ NEXT_NUMBER2
CHEK_DIGIT:CMP AL,39H
JA NEXT_CHAR
CMP AL,30H
JB NEXT_CHAR
PUTCH AL
SUB AL,30H
MOV AH,00H
MOV BP,AX
MOV AX,10
MUL WORD PTR [SI][BX]
MOV WORD PTR [SI][BX],AX
ADD WORD PTR [SI][BX],BP
DEC CL
JNZ NEXT_CHAR
NEXT_NUMBER2:PUTCH 0DH
PUTCH 0AH
INC BX
DEC CH
JNZ NEXT_NUMBER
POP BP
POP DX
POP CX
POP BX
POP AX
RET
BINARRY_INPUT ENDP
;................................................. ...
SORT_SELECT PROC NEAR
PUSH BX
PUSH DX
PUSH BP
MOV BP,1
MOV BX,0
L4:MOV DX,WORD PTR [SI][BX]
L3:CMP DX,WORD PTR [SI][BP]
JA L2
JMP L1
L1:INC BP
CMP BP,21
JNE L3
INC BX
CMP BX,20
JNE L4
JMP L5
L2:XCHG WORD PTR [SI][BP],DX
XCHG WORD PTR [SI][BX],DX
L5:POP BP
POP DX
POP BX
RET
SORT_SELECT ENDP
;................................................. ...
BINARRY_SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
MOV CH,20
LABEL2:SHOW_MSG MSG2
;CREATE
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:;WRITE
POP BP
ADD BP,48
MOV BX,BP
PUTCH BL
DEC CL
JNZ LABEL1
INC SI
DEC CH
JNZ LABEL2
POP BP
POP DX
POP CX
POP BX
POP AX
BINARRY_SHOW ENDP
;................................................. ...
END MAIN

mg_mahyar
شنبه 06 تیر 1388, 20:45 عصر
جان من کمک کنید
من خیلی گیر اینم
ایراد از چیه؟
عدد هارو میگیره درستم میگیره ولی نشون درست نمیده
فکر کنم SI به جای غیر از A اشاره میکنه

tdkhakpur
شنبه 06 تیر 1388, 20:51 عصر
سلام
خوب شما توابع را یک به یک اجراش کنید.
ولی فکر کنم داده های ورودی شما اشتباه وارد میشه.

mg_mahyar
شنبه 06 تیر 1388, 21:02 عصر
سلام
خوب شما توابع را یک به یک اجراش کنید.
ولی فکر کنم داده های ورودی شما اشتباه وارد میشه.
اره تو محشری از همه سری
این مشکلش توی گرفتن عدد بود من یک واحد اضافه میکردم میرفت بایت بعدی ولی باید دو واحد میزدم تا بره ورد بعدی چون متغییرم وردی بود
توی نمایش و سورتم این مشکل بود
ممنون


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 20dup(0)
MSG1 DB 'ENTER 20 NUMBER 4 DIGIT OR LOWER:',0DH,0AH,'$'
MSG2 DB 0DH,0AH,'SORTED IS:','$'
MSG3 DB 0DH,0AH,'$'
DATA_HERE ENDS
;................................................. ...
STACK_HERE SEGMENT
DW 20DUP(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
MOV AX,STACK_HERE
MOV SS,AX
;............................................
CLRSCREEN
GOTOXY 0,0
;............................................
LEA SI,A
CALL BINARRY_INPUT
LEA SI,A
CALL SORT_SELECT
LEA SI,A
CALL BINARRY_SHOW
SHOW_MSG MSG1
GETCH
MOV AH,4CH
INT 21H
MAIN ENDP
;................................................. ...
BINARRY_INPUT 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
JNZ CHEK_DIGIT
CMP CL,04
JZ NEXT_CHAR
JNZ 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
BINARRY_INPUT 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
;................................................. ...
BINARRY_SHOW PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH BP
MOV CH,20
LABEL2:SHOW_MSG MSG2
;CREATE
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:;WRITE
POP BP
ADD BP,48
MOV BX,BP
PUTCH BL
DEC CL
JNZ LABEL1
INC SI
INC SI
DEC CH
JNZ LABEL2
POP BP
POP DX
POP CX
POP BX
POP AX
BINARRY_SHOW ENDP
;................................................. ...
END MAIN