📄 lt57-2.asm
字号:
;例题5.7 LT57-2.ASM程序基本框架同书中P172,书中以下错误:无数据区,N?,JGE使用。
;冒泡法实现数据排序。无序数组实现由大到小排序。
;题意分析:取第一个数放在AX中,和下一个的数比较,小的数放在下面,
;大的数上升,第一个循环后,使最小的数排在最下面。
;同理进行第二次循环,查找的数据长度减一。
;
DATAREA SEGMENT; 定义数据段及数据分配。
HEAD DW 11H,22H,44H,66H,55H,0FFFFH,02H,03H; 有符号数
DW 88H,04H,33H,77H,99H,12H,13H, 0CCH; 第16个数不参加排序。
DW 8 DUP (0FFFFH); 为了调试时观察数据区方便
M_COUNT DW 15
N EQU 15
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 CX, N; 数据字长度即循环次数给DI
DEC CX; 求实际循环次数。(MOV CX,N-1);
LOOP1:
MOV DI, CX; DI保存CX的值,数组长度(数据个数)。
MOV BX, 00; BX作为数据指针,赋初值0。
LOOP2:
MOV AX, [BX+HEAD]; 取第一个数给AX。
CMP AX, [BX+HEAD+2]; AX中的内容和下一个字比较。
JGE COTINUE; 数据区是有符号数,有符号数使用JGE。
XCHG AX, [BX+HEAD+2]; 如果小于,进行交换,大的数放低字节,
MOV [BX+HEAD], AX; 小的数放高字节。
COTINUE:
ADD BX, 02; BX加2,指向下一个字。
;DEC CX;
;JNZ LOOP2;
LOOP LOOP2; CX-1,如果CX不等于0,内循环,转跳到LOOP2。
MOV CX, DI; 外层循环次数给CX,(因为使用LOOP命令)
;DEC CX;
;JNZ LOOP1;
LOOP LOOP1; CX-1,如果CX不等于0,同时修改外循环次数。
RET; 进行外循环,转跳到LOOP1。
MAIN ENDP;
PROGNAM ENDS;
END START;
-G 09
AX=13C0 BX=0000 CX=006E 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 B90F00 MOV CX,000F
-D DS:0
13C0:0000 11 00 22 00 44 00 66 00-55 00 01 00 02 00 03 00 ..".D.f.U.......
13C0:0010 88 00 04 00 33 00 77 00-99 00 12 00 13 00 CC 00 ....3.w.........
13C0:0020 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................
-G 2D
AX=0099 BX=0002 CX=0000 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0001
DS=13C0 ES=13B0 SS=13C0 CS=13C4 IP=002D NV UP EI PL NZ NA PO NC
13C4:002D CB RETF
-D DS:0
13C0:0000 99 00 88 00 77 00 66 00-55 00 44 00 33 00 22 00 ....w.f.U.D.3.".
13C0:0010 13 00 12 00 11 00 04 00-03 00 02 00 FF FF 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 + -