找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3870|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

emu8086排序源程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:268365 發(fā)表于 2017-12-28 15:01 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在數(shù)據(jù)區(qū)存放有一個(gè)數(shù)據(jù)序列(字型還是字節(jié)型的自行確定),編寫(xiě)程序,該程序應(yīng)該能完成以下功能:

1、(選做)數(shù)據(jù)區(qū)的數(shù)據(jù)由鍵盤(pán)錄入;

2、程序可以按有符號(hào)數(shù)由大到小,由小到大,按無(wú)符號(hào)數(shù)由大到小,由小到大排序,編寫(xiě)為多分支程序,由鍵入不同字符或數(shù)字選擇排序方法;

3、排序方法自定,可以用不同的方法排序;

4、完成排序后的數(shù)據(jù)區(qū)顯示在電腦屏幕上;

5、盡可能用調(diào)用子程序的方法來(lái)實(shí)現(xiàn)程序,主程序與子程序參數(shù)的傳遞方法自行確定。
  1. data segment
  2.     data1 db -78,24,-8,94,-109,128,0
  3.     count equ $-data1  
  4.     HINT   DB  'wrong
  5. [/color][/font][/align]

  6. data ends
  7. code segment
  8.     assume cs:code,ds:data
  9. main proc near
  10. start:mov ax,data
  11.       mov ds,ax
  12.       mov ah,1
  13. input:  int 21h                     ;輸入一個(gè)數(shù)
  14.       cmp al,31h
  15.       jz next                    ;輸入數(shù)等于1調(diào)用有符數(shù)大到小排序
  16.       cmp al,32h
  17.       jz next1                    ;輸入數(shù)等于2調(diào)用有符數(shù)小到大排序
  18.       cmp al,33h
  19.       jz next2                    ;輸入數(shù)等于3調(diào)用無(wú)符數(shù)大到小排序
  20.       cmp al,34h
  21.       jz next3                    ;輸入數(shù)等于4調(diào)用無(wú)符數(shù)小到大排序
  22.       jmp WRONG                  ;輸入其他值時(shí)提示錯(cuò)誤
  23.       
  24.        WRONG: MOV   DL,0DH             ;回車(chē)
  25.         MOV   AH,02H
  26.         INT   21H
  27.         MOV   DL,0AH             ;換行
  28.         MOV   AH,02H
  29.         INT   21H
  30.         MOV   DX,OFFSET HINT   ;提示‘wrong’
  31.         MOV   AH,09H
  32.         INT   21H
  33.         MOV   AH,4CH
  34.         INT   21H   
  35.         HLT                  ;主程序結(jié)束  
  36.          
  37. next:call signe_ltos
  38.       jmp play
  39. next1:call signe_stol
  40.       jmp play
  41. next2:call unsigne_ltos
  42.       jmp play
  43. next3:call unsigne_stol
  44. play:call display
  45.       mov ax,4c00h
  46.       int 21h
  47. main endp

  48. signe_ltos proc near                   ;有符號(hào)數(shù)從大到小
  49.       mov cx,count
  50.       dec cx
  51. loop1:lea si,data1
  52.       mov di,cx
  53. loop2:mov al,data1[si]
  54.       cmp al,data1[si+1]
  55.       jge ltos                       ;大于等于跳轉(zhuǎn)
  56.       xchg al,data1[si+1]
  57.       mov data1[si],al      
  58. ltos:inc si
  59.       loop loop2
  60.       mov cx,di
  61.       loop loop1
  62.        ret
  63. signe_ltos endp

  64. signe_stol proc near                    ;有符號(hào)數(shù)從小到大
  65.       mov cx,count
  66.       dec cx
  67. loop3:lea si,data1
  68.       mov di,cx
  69. loop4:mov al,data1[si]
  70.       cmp al,data1[si+1]
  71.       jle stol                          ;小于等于跳轉(zhuǎn)
  72.       xchg al,data1[si+1]
  73.       mov data1[si],al      
  74. stol:inc si
  75.       loop loop4
  76.       mov cx,di
  77.       loop loop3
  78.        ret
  79. signe_stol endp
  80.    
  81. unsigne_ltos proc near                  ;無(wú)符號(hào)數(shù)從大到小
  82.       mov cx,count
  83.       dec cx
  84. loop5:lea si,data1
  85.       mov di,cx
  86. loop6:mov al,data1[si]
  87.       cmp al,data1[si+1]
  88.       jae ultos                        ;大于等于跳轉(zhuǎn)
  89.       xchg al,data1[si+1]                ;否則交換
  90.       mov data1[si],al      
  91. ultos:inc si
  92.       loop loop6
  93.       mov cx,di
  94.       loop loop5  
  95.         ret
  96. unsigne_ltos endp  

  97. unsigne_stol proc near                    ;無(wú)符號(hào)數(shù)從小到大
  98.       mov cx,count
  99.       dec cx
  100. loop7:lea si,data1
  101.       mov di,cx
  102. loop8:mov al,data1[si]
  103.       cmp al,data1[si+1]
  104.       jbe ustol                          ;小于等于跳轉(zhuǎn)
  105.       xchg al,data1[si+1]                  ;否則交換
  106.       mov data1[si],al      
  107. ustol:inc si
  108.       loop loop8
  109.       mov cx,di
  110.       loop loop7  
  111.         ret
  112. unsigne_stol endp
  113.    
  114. display proc near
  115.          mov cx,count                   ;數(shù)組個(gè)數(shù)給cx
  116.          mov dl,13
  117.          call out_chr                      ;回車(chē)換行
  118.          mov dl,10
  119.          call out_chr
  120.          lea si,data1                     ;si指向data1的首地址
  121. loop9:  mov al,data1[si]                  ;data1的值給al
  122.          call dis                        ;十進(jìn)制顯示al的值
  123.          mov dl,' '
  124.          call out_chr                    ;調(diào)用int 21h顯示功能
  125.          inc si                         ;si值加1,指向data1的下個(gè)數(shù)
  126.          loop loop9                    ;循環(huán)
  127.          ret
  128. display endp

  129. dis proc near
  130.          pusha                        ;保護(hù)現(xiàn)場(chǎng),所有寄存器的數(shù)存下
  131.          mov bh,al                 ;al值給bh
  132.          cmp al,128      ;大于等于128為負(fù)數(shù),8位寄存器有符號(hào)數(shù)范圍-128∽127
  133.          jb next4                    ;小于128跳轉(zhuǎn)         
  134.          mov dl,'-'                        ;顯示負(fù)號(hào)
  135.          call out_chr
  136.          mov al,bh                  ;上面操作時(shí),al的值會(huì)變,現(xiàn)在將數(shù)組的值再給al
  137.          neg al                   ;al進(jìn)行補(bǔ)碼操作,相當(dāng)于對(duì)負(fù)數(shù)al取絕對(duì)值
  138. next4:mov ah,0
  139.          mov bl,100
  140.          div bl              ;div除法,默認(rèn)被除數(shù)為al,除數(shù)bl,商存在al,余數(shù)存ah
  141.          mov bh,al                  ;百位數(shù)字給bh
  142.          mov ch,ah                   ;余數(shù)給ch,以下操作會(huì)覆蓋ah
  143.          cmp al,0                   ;看百位是不是0
  144.          jz next5                    ;百位為0不顯示
  145.          add al,30h                   ;百位數(shù)字轉(zhuǎn)成十進(jìn)制
  146.          mov dl,al      
  147.          call out_chr
  148. next5:  mov ah,0
  149.          mov al,ch                   ;存在ch的余數(shù),小于100的數(shù)字給al
  150.          mov bl,10
  151.          div bl
  152.          mov cx,ax                       ;商和余數(shù)給cx
  153.          cmp al,0                          ;十位數(shù)字是否為0
  154.          jz next7                          ;為0跳轉(zhuǎn)
  155.   next6: add cl,30h                       ;十位數(shù)字轉(zhuǎn)十進(jìn)制
  156.          mov dl,cl
  157.          call out_chr
  158.          jmp next8
  159. next7:  cmp bh,0                        ;判斷百位是否為0,確定十位是否需要顯示
  160.          ja next6                         ;百位不為0,顯示十位數(shù)字
  161. next8:  add ch,30h                       ;個(gè)位數(shù)字十進(jìn)制
  162.          mov dl,ch
  163.          call out_chr
  164.          popa                 ;恢復(fù)現(xiàn)場(chǎng),將子程序開(kāi)始時(shí)存下的寄存器的數(shù)全部恢復(fù)
  165.          ret
  166. dis endp

  167. out_chr:
  168.     push ax
  169.     mov ah,2                 ;dos調(diào)用
  170.     int 21h
  171.     pop ax
  172.     ret
  173. code ends
  174. end start
復(fù)制代碼
全部資料51hei下載地址:
LQ2.rar (1.6 KB, 下載次數(shù): 7)



評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表