1. 程式人生 > >彙編基礎練習題17:綜合以上子函式,完成輸入八個數並排序重新輸出

彙編基礎練習題17:綜合以上子函式,完成輸入八個數並排序重新輸出

彙編基礎練習題17:

綜合以上子函式,完成如下操作:

(1)用提示資訊提示使用者輸入8個數,每個數輸入後換行,在下一行輸入下一個數;

(2)輸入後在新的一行顯示這8個數;

(3)然後對這8個數排序;

(4)在新的一行顯示排序後的8個數。

Please input 8 number:

23a

46c

。。。

Before sort,the 8 nunber is: 23,46,…

After sort,the 8 nunber is: …

編譯工具:Masm for Windows 整合實驗環境2012.5
(附帶一個工具下載地址https://download.csdn.net/download/qq_36931762/10825773
有需要可以去下載)
程式碼思路:

   ---------------------------------------可愛的程式碼區別線----------------------------------
DATAS SEGMENT
	NUM DW 8 DUP(0)
    SINPUT DB 'Please input 8 number:$'
    SOUT1 DB 'Before sort,the 8 nunber is:$'
    SOUT2 DB 'After sort,the 8 nunber is:$'
DATAS ENDS

STACKS SEGMENT
    ;此處輸入堆疊段程式碼
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    MOV SI,OFFSET SINPUT
    CALL COUTSTRING
    CALL COUTENTER
    MOV BX,0
ML:
	CMP BX,16
	JE MEN
    CALL PIN
    MOV SI,OFFSET NUM
    MOV [SI+BX],AX
    CALL COUTENTER
    ADD BX,2
    JMP ML
MEN: 
	MOV SI,OFFSET SOUT1
	CALL COUTSTRING
	MOV BX,0
ML2:
	CMP BX,16
	JE MEN2
    MOV SI,OFFSET NUM
    MOV AX,[SI+BX]
    CALL PRINTAX
    CMP BX,14
    JE NODOUHAO1
    MOV DL,','
    MOV AH,2
    INT 21H
NODOUHAO1:
    ADD BX,2
    JMP ML2
MEN2:
	CALL COUTENTER
	MOV SI,OFFSET SOUT2
	CALL COUTSTRING
	MOV BP,OFFSET NUM
	MOV SI,OFFSET NUM
    MOV DI,16;數字個數
	CALL SORT
	MOV BX,0
ML3:
	CMP BX,DI
	JE MEN3
    MOV AX,[NUM+BX]
    CALL PRINTAX
    CMP BX,14
    JE NODOUHAO2
    MOV DL,','
    MOV AH,2
    INT 21H
NODOUHAO2:
    ADD BX,2
    JMP ML3
MEN3:	
    MOV AH,4CH
    INT 21H

COUTSTRING PROC
	PUSH DX
COUTL:
	MOV DL,[SI]
	CMP DL,'$'
	JE COUTEN
	MOV AH,2
	INT 21H
	ADD SI,1
	JMP COUTL
		
COUTEN:	
	POP DX
	RET
	
COUTSTRING ENDP

PIN PROC

	PUSH BX
	PUSH CX
	PUSH DX
	MOV CX,0
    MOV DL,10
CIN:    
    MOV AH,1
    INT 21H
    SUB AL,48
    MOV AH,0
    MOV BX,AX
    MOV AX,CX
    CMP BX,9
    JA EN
    CMP BX,0
    JB EN
    MUL DL
    ADD AX,BX   
    MOV CX,AX
    JMP CIN
EN:
	POP DX
	POP CX
	POP BX
	RET

PIN ENDP


PRINTAX PROC
	
	PUSH BX
	PUSH CX
	PUSH DX
	
    MOV BL,10
    MOV CL,0
    CMP AX,10
    JB PRINTF
W:    
    DIV BL
    PUSH AX
    INC CL
    MOV AH,0
    CMP AX,0
    JA W 
p:
	POP DX
	DEC CL
	MOV DL,DH
	ADD DL,48
	MOV AH,2
	INT 21H
	CMP CL,0
	JNE P
	
	POP DX
	POP CX
	POP BX
	
    RET
    
PRINTF:
	MOV DL,AL
	ADD DL,48
	MOV AH,2
	INT 21H

	POP DX
	POP CX
	POP BX
	
    RET
PRINTAX ENDP  
    
COUTENTER PROC
	PUSH AX
	PUSH DX
	 ;回車換行
    MOV AH,02H
	MOV DL,0DH
	INT 21H
	MOV AH,02H
	MOV DL,0AH
	INT 21H
	POP DX
	POP AX
	RET
COUTENTER ENDP
    
SORT PROC
	PUSH SI
	PUSH BP
	PUSH DI
	PUSH DX
	PUSH CX
	PUSH BX
	SUB DI,2
	
SL1:
	CMP BP,DI
	JE SEN
	MOV AX,DI
	SUB AX,BP
	MOV BX,0
SL2:
	CMP BX,AX
	JE SSEN
	MOV CX,[SI+BX]
	MOV DX,[SI+BX+2]
	CMP CX,DX
	JNA SSSEN
	MOV [SI+BX],DX
	MOV [SI+BX+2],CX
	ADD BX,2
	JMP SL2
	
SSSEN:
	ADD BX,2
	JMP SL2
	
SSEN:
	ADD BP,2
	JMP SL1
	
SEN:	
	POP BX
	POP CX
	POP DX 
	POP DI
	POP BP
	POP SI
	RET
	
SORT ENDP   
   
    
CODES ENDS
    END START
   --------------------------------------------程式碼區別線----------------------------------

輸出結果:

看不懂歡迎提問啦,也歡迎提出我程式碼中的問題和提出程式碼優化方案,大家一起學習嘛。
原創看過隨手點個贊吧!(雖然我也不太知道點贊有啥用emmm給點鼓勵總是好的)嘻嘻