📄 paixu.asm
字号:
;实验4_3将数组A中元素从大小到小排序后输出。
DATA SEGMENT ; 定义数据段
A DW 1000,6,64,1,888,79,65535 ;初值
S1 DB 0AH,0DH,'The max =$'
s2 DB 0AH,0DH,'The min =$'
BJ DB ? ;设标记=0,即未输出过有效的数
FAC DW 10000,1000,100,10,1 ;输出用因子:万、千;、百 ;、十、个
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR ;主过程定义开始
START: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
;开始排序的处理
mov cx,7 ;因有7个数要处理
dec cx ;个数减1
k1: lea bx,a ;BX指向数组开始
mov si,cx ;SI作为内循环次数
K3: mov ax,[bx] ;取一个数
cmp ax,2[bx];与下一个数比较
ja k2 ;作为无符号数处理所以用了JA ` ; k,即大转
xchg ax,2[bx] ;二数换位置即把小的往后放,
mov [bx],ax, ;保证在数组中也得到实际交换。AX ;中已为大数
k2: add bx,2 ;修改指针,使BX指向下一数
dec si ;一遍比完了吗:
jnz k3 ;未完则再去比
loop k1 ;最小的数已在最后,6遍比完了吗
;排序结束
LEA DX,S1
MOV AH,9
INT 21H ;输出提示字符
MOV BX,OFFSET A ;BX指向数组始址
MOV SI,[BX] ;取一个数欲输出的数 ;送SI中。因子程序约定输出SI中的数
CALL OUT10 ;调输出子程序
;修改指针,以能取到A ;数组中下一个 ;的间隔
LEA DX,S2
MOV AH,9
INT 21H ;输出提示字符
MOV SI,12[BX]
CALL OUT10
RET ;返回系统
MAIN ENDP ;主程序结束
OUT10 PROC ;定义子程序,名为OUT10
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI ;子程序中用到的寄存器内容 ;入栈保存
LEA BX,FAC ;BX指向因子的始址,开始指向万
MOV BJ,0
MOV CX,5 ;每个数有万千百十个共5位要输出
L1: MOV AX,SI ;欲输出的数送AX
MOV DX,0 ;被除数高16位清零
MOV SI,[BX] ;取一个因子,第一次为10000
DIV SI ;除法
PUSH DX ;余数入栈
MOV DL,AL ;商送DL,准备输出一位
ADD DL,30H ;将商变为ASCII。第一次即万位上的个数
CMP BJ,0 ;有过非0的数码输出吗?
JNZ L2 ;已有过则直接转输出
CMP DL,'0' ;还没有,则问当前数码是0吗?
JZ L3 ;是0,则转即不需输出
MOV BJ,1 ;非0,标记置1,以后的数码都要输 ;出
L2: MOV AH,2
INT 21H ;输出一位
L3: POP SI ;将余数压入到SI,作为下次 ;欲输出的数
ADD BX,2 ;修改指针,以取到下一个因子
LOOP L1 ;循环控制:5次未完需再循环
POP SI ;循环结束,保留在栈中信息 ;恢复
POP DX
POP CX
POP BX
POP AX ;恢复保留在堆栈的寄 ;存器中内容
RET ;从子程序返回到调用程序
OUT10 ENDP ;子程序定义到此结束
CODE ENDS ;代码段结束
END START ;整个程序到此结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -