找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3490|回复: 0
收起左侧

emu8086排序源程序

[复制链接]
ID:268365 发表于 2017-12-28 15:01 | 显示全部楼层 |阅读模式
在数据区存放有一个数据序列(字型还是字节型的自行确定),编写程序,该程序应该能完成以下功能:

1、(选做)数据区的数据由键盘录入;

2、程序可以按有符号数由大到小,由小到大,按无符号数由大到小,由小到大排序,编写为多分支程序,由键入不同字符或数字选择排序方法;

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

4、完成排序后的数据区显示在电脑屏幕上;

5、尽可能用调用子程序的方法来实现程序,主程序与子程序参数的传递方法自行确定。
  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                     ;输入一个数
  14.       cmp al,31h
  15.       jz next                    ;输入数等于1调用有符数大到小排序
  16.       cmp al,32h
  17.       jz next1                    ;输入数等于2调用有符数小到大排序
  18.       cmp al,33h
  19.       jz next2                    ;输入数等于3调用无符数大到小排序
  20.       cmp al,34h
  21.       jz next3                    ;输入数等于4调用无符数小到大排序
  22.       jmp WRONG                  ;输入其他值时提示错误
  23.       
  24.        WRONG: MOV   DL,0DH             ;回车
  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                  ;主程序结束  
  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                   ;有符号数从大到小
  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                       ;大于等于跳转
  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                    ;有符号数从小到大
  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                          ;小于等于跳转
  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                  ;无符号数从大到小
  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                        ;大于等于跳转
  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                    ;无符号数从小到大
  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                          ;小于等于跳转
  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                   ;数组个数给cx
  116.          mov dl,13
  117.          call out_chr                      ;回车换行
  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                        ;十进制显示al的值
  123.          mov dl,' '
  124.          call out_chr                    ;调用int 21h显示功能
  125.          inc si                         ;si值加1,指向data1的下个数
  126.          loop loop9                    ;循环
  127.          ret
  128. display endp

  129. dis proc near
  130.          pusha                        ;保护现场,所有寄存器的数存下
  131.          mov bh,al                 ;al值给bh
  132.          cmp al,128      ;大于等于128为负数,8位寄存器有符号数范围-128∽127
  133.          jb next4                    ;小于128跳转         
  134.          mov dl,'-'                        ;显示负号
  135.          call out_chr
  136.          mov al,bh                  ;上面操作时,al的值会变,现在将数组的值再给al
  137.          neg al                   ;al进行补码操作,相当于对负数al取绝对值
  138. next4:mov ah,0
  139.          mov bl,100
  140.          div bl              ;div除法,默认被除数为al,除数bl,商存在al,余数存ah
  141.          mov bh,al                  ;百位数字给bh
  142.          mov ch,ah                   ;余数给ch,以下操作会覆盖ah
  143.          cmp al,0                   ;看百位是不是0
  144.          jz next5                    ;百位为0不显示
  145.          add al,30h                   ;百位数字转成十进制
  146.          mov dl,al      
  147.          call out_chr
  148. next5:  mov ah,0
  149.          mov al,ch                   ;存在ch的余数,小于100的数字给al
  150.          mov bl,10
  151.          div bl
  152.          mov cx,ax                       ;商和余数给cx
  153.          cmp al,0                          ;十位数字是否为0
  154.          jz next7                          ;为0跳转
  155.   next6: add cl,30h                       ;十位数字转十进制
  156.          mov dl,cl
  157.          call out_chr
  158.          jmp next8
  159. next7:  cmp bh,0                        ;判断百位是否为0,确定十位是否需要显示
  160.          ja next6                         ;百位不为0,显示十位数字
  161. next8:  add ch,30h                       ;个位数字十进制
  162.          mov dl,ch
  163.          call out_chr
  164.          popa                 ;恢复现场,将子程序开始时存下的寄存器的数全部恢复
  165.          ret
  166. dis endp

  167. out_chr:
  168.     push ax
  169.     mov ah,2                 ;dos调用
  170.     int 21h
  171.     pop ax
  172.     ret
  173. code ends
  174. end start
复制代码
全部资料51hei下载地址:
LQ2.rar (1.6 KB, 下载次数: 7)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表