📄 冒泡.asm
字号:
DATA SEGMENT
DAT DB 10,-9,56,-4,-23,13,25,-35,0,37
COUNT DB 10,10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV BL,1
LP1: CMP BL,0
JE LP4
XOR BL,BL
MOV CL,COUNT
DEC CL
push cx ;新增
LEA DI,DAT ;装入有效地址
LP2:MOV AL,[DI]
CMP AL,[DI+1]
JLE LP3
XCHG [DI+1],AL
MOV [DI],AL
MOV BL,1
LP3:INC DI
LOOP LP2
pop cx
mov count,cl
JMP LP1 ;转移到LP1
;因为后面的一些大数已经排序好,无需再比较了以提高一些效率
LP4:MOV CL,10
LEA DI,DAT
SC:MOV AX,0
MOV BH,2
MOV AL,[DI] ;取数
CMP AL,0 ;如果是正数则跳
JGE NEXT
NEG AL ;如果是负数 先将AL中的负数取补转成对应的正数
push ax
MOV AH,02H ;同时显示 负数的标记 '-'
MOV DL,'-' ;这个时候 ax 的值会因为 21h中断的调用而改变; 所以先要保存起来
INT 21H ; int 21h 中断将会有一个返回值
pop ax ;某些中断之后ax会改变
NEXT:XOR AH,AH
DIV COUNT+1 ;除以 10 取 十位
MOV DH,AH ;ah 是余数 al 是商
ADD AL,30H
MOV DL,AL
MOV AH,02H
INT 21H ;显示 十位上的数值(如果只是两位数的话)
MOV AL,DH
XOR AH,AH
ADD AX,3030H
MOV DL,AL ;在显示时 判断是否是 大于 100 或者 小于 100 再根据判断结果来处理 DIV
;在这里,如果是2位数可以正确显示如果是3位则不能,所以最后的125显成了 <5
OUTP: MOV AH,2
INT 21H
DEC BH
JZ XT
MOV DL,BL ;显示个位数
JMP OUTP
XT: DEC CL
JZ DONE
INC DI
JMP SC
DONE: MOV AH,4CH
INT 21H
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -