?? lt58-2.asm
字號(hào):
;例題LT58-2.ASM 與LT58-1.ASM區(qū)別:數(shù)據(jù)區(qū)數(shù)據(jù)作為有符號(hào)數(shù)對(duì)待,排序后存儲(chǔ)形式不同。
;視作有無符號(hào)完全取決 比較指令的選擇無符號(hào)比較JAE、有符號(hào)使用JGE。
;例題5.8:P174 方式二:冒泡法實(shí)現(xiàn)數(shù)據(jù)排序。無序數(shù)組實(shí)現(xiàn)由大到小排序。
;其中排序算法如書所述。題意分析:取第一個(gè)數(shù)放在AX中,和下一個(gè)的
;數(shù)比較,小的數(shù)放在下面(最高地址),大的數(shù)上升,第一個(gè)循環(huán)后,
;使最小的數(shù)排在最下面(最高地址)。
;書中有多處錯(cuò)誤,但是,使用標(biāo)志位,標(biāo)注內(nèi)層循環(huán)是否進(jìn)行數(shù)據(jù)交換,如果沒
;有交換,外層循環(huán)提前結(jié)束。
DATAREA SEGMENT; 定義數(shù)據(jù)段及數(shù)據(jù)分配。
HEAD DW 8888H,9999H,7777H,6666H,5555H,5050H,0002H,0001H;
DW 4444H,3333H,2222H,1333H,1222H,1111H,0004H, 0CCH;
;全部是無符號(hào)數(shù)。第16個(gè)數(shù)不參加排序。
DW 8 DUP (0FFFFH); 為了調(diào)試時(shí)觀察數(shù)據(jù)區(qū)方便
M_COUNT DW 15
N EQU 15
FLAG EQU SI; 理解EQU 的使用,F(xiàn)LAG靈活設(shè)置為一個(gè)寄存器
DATAREA ENDS;
PROGNAM SEGMENT; 定義程序段及程序段名。
MAIN PROC FAR
ASSUME CS:PROGNAM,DS:DATAREA; 段分配。
START:
PUSH DS; DOS調(diào)用要求。保護(hù)舊數(shù)據(jù)段DS,
SUB AX, AX; AX清零進(jìn)堆棧保護(hù),
PUSH AX;
MOV AX, DATAREA; DS數(shù)據(jù)段賦值。
MOV DS, AX;
MOV DX, M_COUNT; 數(shù)據(jù)字長(zhǎng)度即循環(huán)次數(shù)給DI
MOV CX, DX; 求實(shí)際循環(huán)次數(shù)。CX作為里層循環(huán)計(jì)算器。
DEC DX; DX作為外層循環(huán)計(jì)算器,計(jì)算器賦初值。
LOOP1:
MOV FLAG, 0
MOV CX, DX;
MOV BX, 00; BX作為數(shù)據(jù)指針,賦初值0。
LOOP2:
MOV AX, [BX+HEAD]; 取第一個(gè)數(shù)給AX。
CMP AX, [BX+HEAD+2]; AX中的內(nèi)容和下一個(gè)字比較。
JGE COTINUE; 數(shù)據(jù)區(qū)是有符號(hào)數(shù),無符號(hào)數(shù)JAE
XCHG AX, [BX+HEAD+2]; 如果小于,進(jìn)行交換,大的數(shù)放低字節(jié),
MOV [BX+HEAD], AX; 小的數(shù)放高字節(jié)。(下一個(gè)單元地址)
MOV FLAG, 1;
COTINUE:
ADD BX, 02; BX加2,指向下一個(gè)字。
DEC CX;
JNZ LOOP2; 如果CX不等于0,轉(zhuǎn)跳到LOOP2。
DEC DX; 修改外循環(huán)次數(shù)。
CMP FLAG, 0; SI=0時(shí)循環(huán)結(jié)束,與DX的值無關(guān),如此判斷
JNZ LOOP1; 循環(huán)結(jié)束,多一次循環(huán)。
RET;
MAIN ENDP;
PROGNAM ENDS;
END START;
在Debug下調(diào)試:
排序之前數(shù)據(jù)存儲(chǔ)形式:
-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 ................
排序之后數(shù)據(jù)存儲(chǔ)形式:(其中9999H、8888H 為負(fù)數(shù))
-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 ................
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -