Assembly compilation bubble sort

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

 

 

Posted by Centrek on Sat, 30 May 2020 16:54:34 -0700