On assembly bubble sorting.
When compiling small code, because the data defined is byte type data, but AX is used when MOV data, errors occur (I haven't found any problems for a long time).
Keyboard input ten hexadecimal bytes of data, stored in a given storage unit, using bubble sorting method to arrange the data in order from large to small, displayed on the screen
Here, we use two bytes to store two hexadecimal bits, and space each data.
DATA SEGMENT DATA1 DB 40,0,40 DUP(0) COUNT EQU 10 STR DB 0DH,0AH,"Please input 10 number:",0DH,0AH,"$" RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$" DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX CALL INPUT CALL RANK CALL DISPLAY MOV AH,4CH INT 21H INPUT PROC MOV SI,0 MOV AH,09H MOV DX,OFFSET STR INT 21H MOV AH,0AH MOV DX,OFFSET DATA1 INT 21H RET INPUT ENDP RANK PROC MOV CX,COUNT S1:PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,COUNT-1 S2:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JC EXCH JNZ S3 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JNC S3 EXCH:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S3: NOP ADD SI,3 LOOP S2 POP CX LOOP S1 RET RANK ENDP DISPLAY PROC LEA DX,RANKED MOV AH,09H INT 21H LEA DX,DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX MOV BYTE PTR[BX+2],"$" LEA DX,DATA1 ADD DX,2 INT 21H RET DISPLAY ENDP CODE ENDS END START
Known data are: 41H, 70H, 03H, 53H, 88H, 16H, 8EH, 3FH. Arrange the data in the order of small to large by bubble sorting, and then type 75H by keyboard, insert it into this group of data, and keep the order of small to large unchanged. Display the number group after inserting the data on the screen
The editor has made some changes to the above program. The entry parameter of the insertion process is COUNT, which needs to be redefined.
According to the constant defined with "=" pseudo instruction in the book, the assignment can be repeated, but the small code is not implemented in the program~~~
But, cry, run in emu8086 = pseudo instruction does not work
What I want to do is to manually input 8 data for sorting, and then input another value to insert sorting. But the assignment of emu8086 '=' only works for the first time, while dosbox only works for the last time.
Therefore, when dosbox is running, the first data is 00. (the following code should have no problem in theory)
But the running result is not right!!!!!
DATA SEGMENT
DATA1 DB 40,0,40 DUP(0)
STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$"
RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$"
INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$"
DATA2 DB 10,0,10 DUP(0)
COUNT=8
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
CALL INPUT
MOV CX,COUNT
CALL RANK
CALL DISPLAY
CALL INSERTDA
COUNT=COUNT+1
MOV CX,COUNT
CALL RANK
CALL DISPLAY
MOV AH,4CH
INT 21H
INPUT PROC
MOV SI,0
MOV AH,09H
MOV DX,OFFSET STR
INT 21H
MOV AH,0AH
MOV DX,OFFSET DATA1
INT 21H
RET
INPUT ENDP
RANK PROC
MOV AH,02H
MOV DL,COUNT
ADD DL,30H
INT 21H
S1: PUSH CX
MOV SI,0
MOV BX,OFFSET DATA1
ADD BX,2
MOV CX,COUNT-1
S2:MOV DL,[BX+SI]
CMP DL,[BX+SI+3]
JA EXCH
JNZ S3
MOV DL,[BX+SI+1]
CMP DL,[BX+SI+4]
JC S3
EXCH:MOV DL,[BX+SI]
XCHG DL,[BX+SI+3]
MOV [BX+SI],DL
MOV DL,[BX+SI+1]
XCHG DL,[BX+SI+4]
MOV [BX+SI+1],DL
S3: NOP
ADD SI,3
LOOP S2
POP CX
LOOP S1
RET
RANK ENDP
DISPLAY PROC
LEA DX,RANKED
MOV AH,09H
INT 21H
LEA DX,DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX+2],"$"
LEA DX,DATA1
ADD DX,2
INT 21H
RET
DISPLAY ENDP
INSERTDA PROC
PUSH CX
PUSH DX
MOV AH,09H
LEA DX,INSERT
INT 21H
MOV AH,0AH
LEA DX,DATA2
INT 21H
MOV DX,OFFSET DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
LEA DX,DATA2
MOV SI,OFFSET DATA2
MOV BYTE PTR[BX+2],20H
MOV CL,[SI+2]
MOV [BX+3],CL
MOV CL,[SI+3]
MOV [BX+4],CL
MOV DX,OFFSET DATA1
MOV BX,DX
ADD BYTE PTR[BX+1],3
POP DX
POP CX
RET
INSERTDA ENDP
CODE ENDS
END START
Only two procedure calls can be used. RANK1 and RANK2
Xiaobian still doesn't know why,
It was intended to use one procedure to complete two different calls, but it failed, so it's better to use two procedures.
DATA SEGMENT DATA1 DB 40,0,40 DUP(0) STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$" RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$" INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$" DATA2 DB 10,0,10 DUP(0) DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX CALL INPUT CALL RANK1 CALL DISPLAY CALL INSERTDA MOV AH,4CH INT 21H INPUT PROC MOV SI,0 MOV AH,09H MOV DX,OFFSET STR INT 21H MOV AH,0AH MOV DX,OFFSET DATA1 INT 21H RET INPUT ENDP RANK1 PROC MOV CX,8 S1: PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,7 S2:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JA EXCH JNZ S3 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JC S3 EXCH:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S3: NOP ADD SI,3 LOOP S2 POP CX LOOP S1 RET RANK1 ENDP RANK2 PROC MOV CX,9 S6: PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,8 S4:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JA EXCH1 JNZ S5 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JC S5 EXCH1:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S5: NOP ADD SI,3 LOOP S4 POP CX LOOP S6 RET RANK2 ENDP DISPLAY PROC LEA DX,RANKED MOV AH,09H INT 21H LEA DX,DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX MOV BYTE PTR[BX+2],"$" LEA DX,DATA1 ADD DX,2 INT 21H RET DISPLAY ENDP INSERTDA PROC PUSH CX PUSH DX MOV AH,09H LEA DX,INSERT INT 21H MOV AH,0AH LEA DX,DATA2 INT 21H MOV DX,OFFSET DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX LEA DX,DATA2 MOV SI,OFFSET DATA2 MOV BYTE PTR[BX+2],20H MOV CL,[SI+2] MOV [BX+3],CL MOV CL,[SI+3] MOV [BX+4],CL MOV DX,OFFSET DATA1 MOV BX,DX ADD BYTE PTR[BX+1],3 POP DX POP CX CALL RANK2 CALL DISPLAY RET INSERTDA ENDP