⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 汇编实现输输数 排序 显示.txt

📁 用汇编语言来实现数据的输入和排序并显示结果
💻 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 + -