x86基础实验-冒泡排序
2018-05-18 本文已影响0人
cxzzzz
简介:
用x86实现冒泡排序,是课本上的一个例题,但课本上原本是从小到大的冒泡排序,现在改为从大到小的排序。
程序运行结果:
(运行前内存情况)(红色部分为水印)(直接把学号传到网上会不会出问题....)
image.png
(运行后内存情况)
image.png
(运行结果)
image.png
源代码:
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $-STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
TABLE_LEN DW 16
TABLE DW 200,300,400,10,20,0,1,8 ;要排序的数据
DW 41H,20,42H,50,60,0FFFFH,2,3
DATA1 ENDS
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA1,SS:STACK1
MAIN PROC FAR
MOV AX,STACK1 ;初始化寄存器
MOV SS,AX
MOV SP,STACK_BTM
MOV AX,DATA1
MOV DS,AX
LP1: MOV BX,1
MOV CX,TABLE_LEN
DEC CX
MOV SI,OFFSET TABLE
LP2: MOV AX,[SI]
CMP AX,[SI+2]
;JBE CONTINUE ; 从低到高排序
JAE CONTINUE ;从高到低排序
XCHG AX,[SI+2]
MOV [SI],AX
MOV BX,0
CONTINUE: ADD SI,2
LOOP LP2
CMP BX,1
JZ EXIT
JMP SHORT LP1
EXIT:
MOV AX,OFFSET TABLE
MOV CX,TABLE_LEN
MAIN_OUTPUT_LOOP:
PUSH AX
CALL OUTPUT
ADD AX,2
LOOP MAIN_OUTPUT_LOOP
MOV AX,4C00H
INT 21H
MAIN ENDP
OUTPUT PROC NEAR ;输出排序后的数组,[SP+2]为数组首地址
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BX,SP
MOV BX,SS:[BX+10]
MOV BX,DS:[BX]
MOV CX,4
OUTPUT_LOOP:
MOV DL,BH
SHR DL,1
SHR DL,1
SHR DL,1
SHR DL,1
CMP DL,10
JB OUTPUT_NUM
ADD DL,41H
SUB DL,10
JMP OUTPUT_FIN
OUTPUT_NUM:
ADD DL,30H
OUTPUT_FIN:
MOV AH,02H
INT 21H
PUSH CX
MOV CL,4
SHL BX,CL
POP CX
LOOP OUTPUT_LOOP
MOV DL,09H ;HORIZONTAL TAB
MOV AH,02H
INT 21H
POP DX
POP CX
POP BX
POP AX
RET 2
OUTPUT ENDP
CODE1 ENDS
END MAIN