📄 lt58-2.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 + -