?? 匯編實現輸輸數 排序 顯示.txt
字號:
源程序代碼如下: (附注釋)
.model small ;define memory model
.stack 16 ;define stack segment
.data ;define data segment
SPACE DB 1000 DUP (' ') ;定義一個空格,并重復一千次
PATTERN db 'byebye bye bye byebyebyebye' ;定義字符串
db 'bye bye bye bye bye '
db 'bye bye bye bye '
db 'byebye bye byebyebye '
db 'bye bye bye bye '
db 'bye bye bye bye '
db 'byebye bye byebyebyebye'
zhou1 db 0dh,0ah,'the number you have input is:','$' ;定義回車,換行,和字符串
zhou2 db 0dh,0ah,'the average of the array is:','$' ;定義回車,換行,和字符串
keyorder db 0dh,0ah,'1 key : order the array from max to min',0dh,0ah
db '2 key : turn the array from min to max',0dh,0ah
db '3 key : show the numbers you have input',0dh,0ah
db 'z key : get the average',0dh,0ah
db 'x key : get the time',0dh,0ah
db 'c key : exit',0dh,0ah
db 'xingming: meng jian hua',0dh,0ah
db 'xuehao:0905050607',0dh,0ah
db 'banji:tongxin0506','$' ;設計屏幕界面顯示(一系列字符串)
enter db 0dh,0ah,'please enter the arrary:',0dh,0ah,'$' ;定義字符串,回車,換行
pwait db 'wait for a second please',0dh,0ah,'$' ;定義字符串,回車,換行
disp db 'result is below',0dh,0ah,'$' ;定義字符串,回車,換行
;---------------------------------
nub db 0
buf db 10 dup (?) ;定義10個存儲空間用于存儲數據
DBUFFER DB 8 DUP (':') ;定義冒號并重復8次
aver db 0
.code ;define code segment
org 100h ;偽指令,定義起始地址為100h
;---------------------------------------------------
;主過程
main proc near ;main part of program
mov ax,@data;數據段附加段初始化
mov ds,ax
mov es,ax
MOV AX,0001H ;(ah)=00h
INT 10H ;設置顯示方式,(al=01h) 40*25 16色文本
;------------------------------------------
;初始化程序
MOV BP,OFFSET SPACE ;得到SPACE的便宜地址,存入基址指針寄存器
MOV DX,0B00H ;dh/dl=起始行/列
MOV CX,1000 ;(ch)=字符串長度
MOV BX,00c0H ;頁號以及背景顏色和字體顏色的設置
MOV AX,1300H ;(ah)=13h
INT 10H ;顯示字符串
;------------------
;將buf中的所有空間清零以便后面跳回來
back: mov cx,000ah
lea bx,buf ;取得buf的偏移地址
mov al,00h ;把00h賦給al用于后面清零
loop1: mov [bx],al
inc bx
loop loop1 ;所有存儲空間全部清零
;------------------
mov ah,09h ;顯示字符串
lea dx,keyorder ;取得keyorder的偏移地址
int 21h ;顯示keyorder標號處定義的字符串
keyin: mov ah,02h ;顯示輸出
mov dl,0dh
int 21h ;輸出回車
mov ah,02h
mov dl,0ah
int 21h ;輸出換行
mov ah,01h ;鍵盤輸入并回顯
int 21h
;把從鍵盤輸入的數與1,2,3,z,c,x進行比較
cmp al,'1'
je maxtomin ;如果輸入的是1則跳轉到maxtomin
cmp al,'2'
je mintomax ;如果輸入的是2則跳轉到mintomax
cmp al,'3'
je shownub ;如果輸入的是3則跳轉到shownub
cmp al,'z'
je showaver ;如果輸入的是z則跳轉到showzver
cmp al,'c'
je byebye ;如果輸入的是c則跳轉到byebye
cmp al,'x'
je gettime ;如果輸入的是x則跳轉到gettime
jmp keyin ;子程序調用結束后重新從鍵盤輸入數據
showaver:
call showaverp ;調用求平均值子程序
jmp back ;返回到back
shownub:
call shownubp ;調用求輸入數字的個數子程序
jmp back ;返回到back
maxtomin:
call maxtominp ;調用從大到小排序子程序
jmp back ;返回到back
mintomax:
call mintomaxp ;調用從小到大排序子程序
jmp back ;返回到back
gettime:
call TIME ;調用系統時間子程序
jmp back ;返回到back
;---------------------------------------------------
byebye: mov ah,09h
int 21h
MOV BP,OFFSET PATTERN ;取得PATTERN的偏移地址,存入基址指針寄存器
MOV DX,0B00H ;dh/dl=起始行/列
MOV CX,280 ;(ch)=字符串長度
MOV BX,005EH ;頁號以及背景顏色和字體顏色的設置
MOV AX,1301H ;(ah)=13h
INT 10H ;顯示字符串
MOV AH,02H ;(ah)=02h
MOV DX,1801H ;dh/dl=行/列
MOV BH,0 ;定義頁號
INT 10H ;置光標位置
mov ax,4c00h ;(ah)=4ch
int 21h ;帶返回碼中止,(al)=返回碼
main endp
;---------------------------------------------------
;接受數據子過程
rec proc near
mov di,0 ;附加段偏移地址為0
lea bx,buf ;取得buf的偏移地址
newchar: mov ax,0100h ;(ah)=01h
int 21h ;調用輸入中斷
;輸入的字符于空格,回車,和數值進行比較
cmp al,20h
je save ;輸入的是空格則跳到保存數據save
cmp al,0dh
je exit ;輸入的是回車則跳出子過程
sub al,30h ;輸入數據則轉換成16進制
xchg al,dl ;交換al與dl,即(al)清零
mov cl,0ah ;(cl)=0ah
mul cl ;(ax)=(al)*(cl)
xchg al,dl
add dl,al
jmp newchar ;跳回輸入
save: inc ch
mov [bx],dl
add di,word ptr [bx]
inc bx
mov dx,0000h
jmp newchar
exit: inc ch
mov [bx],dl
add di,word ptr [bx]
mov ax,di
div ch
mov aver,al
mov [aver+1],ah
mov ah,02h
mov dl,0ah
int 21h
mov nub,ch
xor ch,ch
ret
rec endp
;-----------------------------------------
;排序子過程
paixu proc near
MOV Cl,nub
mov ch,0
one: lea bx,buf
PUSH CX
two: MOV AX,[BX]
CMP AL,AH
JC four
three: INC BX
LOOP two
POP CX
LOOP one
ret
four: XCHG AL,AH
MOV [BX],AX
JMP three
paixu endp
;----------------------------------------------------
paixu2 proc near
MOV Cl,nub
mov ch,0
one2: lea bx,buf
PUSH CX
two2: MOV AX,[BX]
CMP AL,AH
Jae four2
three2: INC BX
LOOP two2
POP CX
LOOP one2
ret
four2: XCHG AL,AH
MOV [BX],AX
JMP three2
paixu2 endp
;----------------------------------------------------
;把buf的內容按10進制顯示
disply proc near
mov cx,10 ;循環10次
lea bx,buf
loop2: mov al,[bx]
cmp al,0 ;是0就不必考慮了
je isz
;是小與9的數字就不要考慮100與10位的數字
cmp al,9
jbe only0
jmp next
only0: mov ah,al
jmp only1
next: mov ah,00h
;--------------------------
;百位數輸出
mov dh,100
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
cmp dl,30h;為0跳過輸出
je a1
int 21h
;--------------------------
;十位數輸出
a1: pop ax
xchg ah,al
and ax,00ffh
mov dh,10
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
int 21h
;---------------------------
;個位數輸出
a2: pop ax
only1: add ah,30h
mov dl,ah
mov ah,02h
int 21h
;---------------------------
mov ah,02h
mov dl,' '
int 21h
isz: inc bx
and ax,0000h;對ax清零
loop loop2
ret
disply endp
;----------------------------------
showaverp proc near
mov ah,09h
lea dx,zhou2
int 21h
mov dl,aver
mov al,dl
cmp al,9 ;如果al小于等于9,則跳轉
jbe only0p
jmp nextp ;如果al小于等于9,則跳轉
only0p: mov ah,al
jmp only1p
nextp: mov ah,00h
;--------------------------
;百位數輸出
mov dh,100
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
cmp dl,30h;為0跳過輸出
je a1p
int 21h
;--------------------------
;十位數輸出
a1p: pop ax
xchg ah,al
and ax,00ffh
mov dh,10
div dh
push ax
add al,30h
mov ah,02h
mov dl,al
int 21h
;---------------------------
;個位數輸出
a2p: pop ax
only1p: add ah,30h
mov dl,ah
mov ah,02h
int 21h
;---------------------------
mov ah,02h
mov dl,' '
int 21h
iszp: and ax,0000h ;對ax清零
ret
showaverp endp
;------------------------------------
shownubp proc near
mov ah,09h
lea dx,zhou1
int 21h
mov ah,02h
mov dl,nub
add dl,30h
int 21h
ret
shownubp endp
;------------------------------------
mintomaxp proc near
mov ax,0900h ;提示輸入
lea dx,enter
int 21h
;------------------
mov dl,00h
call rec ;調用接收子過程
;------------------
mov dx,offset pwait
mov ax,0900h ;提示等待
int 21h
;------------------
call paixu2 ;調用排序子過程
;-------------------
mov ax,0900h ;提示輸出正確順序
lea dx,disp
int 21h
call disply
;-------------------
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h ;回車換行
;-------------------
ret
mintomaxp endp
maxtominp proc near
mov ax,0900h ;提示輸入
lea dx,enter
int 21h
;------------------
mov dl,00h
call rec ;調用接收子過程
;------------------
mov dx,offset pwait
mov ax,0900h ;提示等待
int 21h
;------------------
call paixu ;調用排序子過程
;-------------------
mov ax,0900h ;提示輸出正確順序
lea dx,disp
int 21h
call disply
;-------------------
mov ah,02h
mov dl,0dh
int 21h
mov ah,02h
mov dl,0ah
int 21h ;回車換行
;-------------------
ret
maxtominp endp
;-------------------
;顯示時間子程序
TIME PROC NEAR
DISPLAY1:MOV SI,0
MOV BX,100
DIV BL
MOV AH,2CH ;取時間
INT 21H
MOV AL,CH
CALL BCDASC ;將時間換成ASCII碼
INC SI
MOV AL,CL
CALL BCDASC
INC SI
MOV AL,DH
CALL BCDASC
MOV BP,OFFSET DBUFFER
MOV DX,180DH
MOV CX,8
MOV BX,004EH
MOV AX,1301H
INT 10H
MOV AH,02H
MOV DX,1801H
MOV BH,0
INT 10H
MOV BX,0018H
RE: MOV CX,0FFFFH
REA: LOOP REA
DEC BX
JNZ RE
MOV AH,01H
INT 16H
JE DISPLAY1
JMP back
MOV AX,4C00H
INT 21H
RET
TIME ENDP
BCDASC PROC NEAR ;時間換成ASCII碼
PUSH BX
CBW
MOV BL,10
DIV BL
ADD AL,'0'
MOV DBUFFER[SI],AL
INC SI
ADD AH,'0'
MOV DBUFFER[SI],AH
INC SI
POP BX
RET
BCDASC ENDP
end main
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -