關於匯編冒泡排序法。
小編在編的時候,因為定義的是字節類型的數據,MOV數據的時候卻用的AX,導致發生錯誤(好久都沒找出來哪里的問題)。
鍵盤輸入十個十六進制字節數據,存入給定的存儲單元中,用冒泡排序法將數據按從大到小的順序排列好,在屏幕上顯示出來.
這里,我們采用兩個字節分別存儲16進制的兩位,以空格間隔每個數據。
DATA SEGMENT DATA1 DB 40,0,40 DUP(0) COUNT EQU 10 STR DB 0DH,0AH,"Please input 10 number:",0DH,0AH,"$" RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$" DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX CALL INPUT CALL RANK CALL DISPLAY MOV AH,4CH INT 21H INPUT PROC MOV SI,0 MOV AH,09H MOV DX,OFFSET STR INT 21H MOV AH,0AH MOV DX,OFFSET DATA1 INT 21H RET INPUT ENDP RANK PROC MOV CX,COUNT S1:PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,COUNT-1 S2:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JC EXCH JNZ S3 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JNC S3 EXCH:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S3: NOP ADD SI,3 LOOP S2 POP CX LOOP S1 RET RANK ENDP DISPLAY PROC LEA DX,RANKED MOV AH,09H INT 21H LEA DX,DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX MOV BYTE PTR[BX+2],"$" LEA DX,DATA1 ADD DX,2 INT 21H RET DISPLAY ENDP CODE ENDS END START
已知數據為: 41H, 70H, 03H, 53H, 88H, 16H, 8EH, 3FH,用冒泡排序法將數據按從小到大的順序排列好,再由鍵盤鍵入75H, 將它插入這組數據中,並保持從小到大的順序不變. 將插入數據后的數組在屏幕上顯示出來.
小編對上面的程序做了些修改。插入過程的入口參數為COUNT,需要重新定義。
根據書上面的用“=”偽指令定義的常量,可以重復賦值,但是小編在程序中,並未實現~~~
無奈,哭了,在emu8086運行=偽指令不起作用.
小編想的是,可u哦手動輸入8個數據進行排序,然后再輸入另一個值插入排序。但是emu8086‘=’賦值只針對第一次起作用,而dosbox只針對最后一次起作用。
所以dosbox運行會產生第一個數據為00的現象。(以下代碼 理論上應該沒有問題的)
但是運行結果不對!!!!!
DATA SEGMENT
DATA1 DB 40,0,40 DUP(0)
STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$"
RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$"
INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$"
DATA2 DB 10,0,10 DUP(0)
COUNT=8
DATA ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START:MOV AX,DATA
MOV DS,AX
CALL INPUT
MOV CX,COUNT
CALL RANK
CALL DISPLAY
CALL INSERTDA
COUNT=COUNT+1
MOV CX,COUNT
CALL RANK
CALL DISPLAY
MOV AH,4CH
INT 21H
INPUT PROC
MOV SI,0
MOV AH,09H
MOV DX,OFFSET STR
INT 21H
MOV AH,0AH
MOV DX,OFFSET DATA1
INT 21H
RET
INPUT ENDP
RANK PROC
MOV AH,02H
MOV DL,COUNT
ADD DL,30H
INT 21H
S1: PUSH CX
MOV SI,0
MOV BX,OFFSET DATA1
ADD BX,2
MOV CX,COUNT-1
S2:MOV DL,[BX+SI]
CMP DL,[BX+SI+3]
JA EXCH
JNZ S3
MOV DL,[BX+SI+1]
CMP DL,[BX+SI+4]
JC S3
EXCH:MOV DL,[BX+SI]
XCHG DL,[BX+SI+3]
MOV [BX+SI],DL
MOV DL,[BX+SI+1]
XCHG DL,[BX+SI+4]
MOV [BX+SI+1],DL
S3: NOP
ADD SI,3
LOOP S2
POP CX
LOOP S1
RET
RANK ENDP
DISPLAY PROC
LEA DX,RANKED
MOV AH,09H
INT 21H
LEA DX,DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
MOV BYTE PTR[BX+2],"$"
LEA DX,DATA1
ADD DX,2
INT 21H
RET
DISPLAY ENDP
INSERTDA PROC
PUSH CX
PUSH DX
MOV AH,09H
LEA DX,INSERT
INT 21H
MOV AH,0AH
LEA DX,DATA2
INT 21H
MOV DX,OFFSET DATA1
MOV CL,DATA1+1
XOR CH,CH
ADD DX,CX
MOV BX,DX
LEA DX,DATA2
MOV SI,OFFSET DATA2
MOV BYTE PTR[BX+2],20H
MOV CL,[SI+2]
MOV [BX+3],CL
MOV CL,[SI+3]
MOV [BX+4],CL
MOV DX,OFFSET DATA1
MOV BX,DX
ADD BYTE PTR[BX+1],3
POP DX
POP CX
RET
INSERTDA ENDP
CODE ENDS
END START
只能采用兩個過程調用了。RANK1和RANK2
小編至此還是不知道原因在哪里,
本來打算用一個過程完成兩次不同調用,失敗了,所以還是用兩個過程好了。
DATA SEGMENT DATA1 DB 40,0,40 DUP(0) STR DB 0DH,0AH,"Please input 8 number:",0DH,0AH,"$" RANKED DB 0DH,0AH,'Ordered numbers:',0dh,0ah,"$" INSERT DB 0DH,0AH,"Please input a number you want to insert:",0DH,0AH,"$" DATA2 DB 10,0,10 DUP(0) DATA ENDS CODE SEGMENT ASSUME DS:DATA,CS:CODE START:MOV AX,DATA MOV DS,AX CALL INPUT CALL RANK1 CALL DISPLAY CALL INSERTDA MOV AH,4CH INT 21H INPUT PROC MOV SI,0 MOV AH,09H MOV DX,OFFSET STR INT 21H MOV AH,0AH MOV DX,OFFSET DATA1 INT 21H RET INPUT ENDP RANK1 PROC MOV CX,8 S1: PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,7 S2:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JA EXCH JNZ S3 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JC S3 EXCH:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S3: NOP ADD SI,3 LOOP S2 POP CX LOOP S1 RET RANK1 ENDP RANK2 PROC MOV CX,9 S6: PUSH CX MOV SI,0 MOV BX,OFFSET DATA1 ADD BX,2 MOV CX,8 S4:MOV DL,[BX+SI] CMP DL,[BX+SI+3] JA EXCH1 JNZ S5 MOV DL,[BX+SI+1] CMP DL,[BX+SI+4] JC S5 EXCH1:MOV DL,[BX+SI] XCHG DL,[BX+SI+3] MOV [BX+SI],DL MOV DL,[BX+SI+1] XCHG DL,[BX+SI+4] MOV [BX+SI+1],DL S5: NOP ADD SI,3 LOOP S4 POP CX LOOP S6 RET RANK2 ENDP DISPLAY PROC LEA DX,RANKED MOV AH,09H INT 21H LEA DX,DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX MOV BYTE PTR[BX+2],"$" LEA DX,DATA1 ADD DX,2 INT 21H RET DISPLAY ENDP INSERTDA PROC PUSH CX PUSH DX MOV AH,09H LEA DX,INSERT INT 21H MOV AH,0AH LEA DX,DATA2 INT 21H MOV DX,OFFSET DATA1 MOV CL,DATA1+1 XOR CH,CH ADD DX,CX MOV BX,DX LEA DX,DATA2 MOV SI,OFFSET DATA2 MOV BYTE PTR[BX+2],20H MOV CL,[SI+2] MOV [BX+3],CL MOV CL,[SI+3] MOV [BX+4],CL MOV DX,OFFSET DATA1 MOV BX,DX ADD BYTE PTR[BX+1],3 POP DX POP CX CALL RANK2 CALL DISPLAY RET INSERTDA ENDP