⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 paixu.asm

📁 input sever numbers from stdin,and then output them by turn
💻 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 + -