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

📄 lt58-2.asm

📁 汇编小程序 多种方法解冒泡法排序 以masm 5.0以上版本编译运行
💻 ASM
字号:
;例题LT58-2.ASM 与LT58-1.ASM区别:数据区数据作为有符号数对待,排序后存储形式不同。
;视作有无符号完全取决 比较指令的选择无符号比较JAE、有符号使用JGE。
;例题5.8:P174 方式二:冒泡法实现数据排序。无序数组实现由大到小排序。
;其中排序算法如书所述。题意分析:取第一个数放在AX中,和下一个的
;数比较,小的数放在下面(最高地址),大的数上升,第一个循环后,
;使最小的数排在最下面(最高地址)。
;书中有多处错误,但是,使用标志位,标注内层循环是否进行数据交换,如果没
;有交换,外层循环提前结束。

DATAREA	SEGMENT;			定义数据段及数据分配。
	HEAD	DW	8888H,9999H,7777H,6666H,5555H,5050H,0002H,0001H;	
		DW	4444H,3333H,2222H,1333H,1222H,1111H,0004H,  0CCH; 
				      ;全部是无符号数。第16个数不参加排序。
		DW	8 DUP (0FFFFH);		为了调试时观察数据区方便
	M_COUNT	DW	15
	N	EQU	15
	FLAG	EQU	SI;	理解EQU	的使用,FLAG灵活设置为一个寄存器	
DATAREA	ENDS;

PROGNAM	SEGMENT;			定义程序段及程序段名。
MAIN	PROC	FAR
	ASSUME	CS:PROGNAM,DS:DATAREA;	段分配。
	
START:
	PUSH	DS;			DOS调用要求。保护旧数据段DS,
	SUB	AX,	AX;		AX清零进堆栈保护,
	PUSH	AX;
	
	MOV	AX,	DATAREA;	DS数据段赋值。
	MOV	DS,	AX;
	
	MOV	DX,	M_COUNT;	数据字长度即循环次数给DI
	MOV	CX,	DX;		求实际循环次数。CX作为里层循环计算器。
	DEC	DX;			DX作为外层循环计算器,计算器赋初值。	
LOOP1:
	MOV	FLAG,	0
	MOV	CX,	DX;		
	MOV	BX,	00;		BX作为数据指针,赋初值0。	
LOOP2:
	MOV	AX,	[BX+HEAD];	取第一个数给AX。
	CMP	AX,	[BX+HEAD+2];	AX中的内容和下一个字比较。
	JGE	COTINUE;		数据区是有符号数,无符号数JAE	
	XCHG	AX,	[BX+HEAD+2];	如果小于,进行交换,大的数放低字节,
	MOV	[BX+HEAD],	AX;	小的数放高字节。(下一个单元地址)
	MOV	FLAG,	1;
					
COTINUE:
	ADD	BX,	02;		BX加2,指向下一个字。	
	DEC	CX;			
	JNZ	LOOP2;			如果CX不等于0,转跳到LOOP2。
	
	DEC	DX;			修改外循环次数。
	CMP	FLAG,	0;		SI=0时循环结束,与DX的值无关,如此判断
	JNZ	LOOP1;			循环结束,多一次循环。
	RET;

MAIN	ENDP;
PROGNAM	ENDS;
	END	START;
	
在Debug下调试:	
排序之前数据存储形式:
-G 09
AX=13C0  BX=0000  CX=007A  DX=0000  SP=FFFC  BP=0000  SI=0000  DI=0000
DS=13C0  ES=13B0  SS=13C0  CS=13C4  IP=0009   NV UP EI PL ZR NA PE NC
13C4:0009 8B163000      MOV     DX,[0030]                          DS:0030=000F
-D DS:0
13C0:0000  88 88 99 99 77 77 66 66-55 55 50 50 02 00 01 00   ....wwffUUPP....
13C0:0010  44 44 33 33 22 22 33 13-22 12 11 11 04 00 CC 00   DD33""3.".......
13C0:0020  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................

排序之后数据存储形式:(其中9999H、8888H 为负数)
-G 39
AX=1111  BX=0014  CX=0000  DX=0009  SP=FFFC  BP=0000  SI=0000  DI=0000
DS=13C0  ES=13B0  SS=13C0  CS=13C4  IP=0039   NV UP EI PL ZR NA PE NC
13C4:0039 CB            RETF
-D DS:0
13C0:0000  77 77 66 66 55 55 50 50-44 44 33 33 22 22 33 13   wwffUUPPDD33""3.
13C0:0010  22 12 11 11 04 00 02 00-01 00 99 99 88 88 CC 00   "...............
13C0:0020  FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF   ................

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -