汇编语言学习:子程序设计、子模块调用

  • 题目:

      . 已知array1字数组中存放着n个无符号数。编写子程序,分别求这n个数的平均值、最大值、最小值,并输出这n个数以及所求结果

 

  • 子程序设计

      • 分析:

     定义数据段,保存数据数组、保存数据长度、平均值、最大值、最小值;每次调用函数获得值时保存在对应的变量里面,就类似与高级语言设计中的全局变量

      • 源代码

          1  . 386
          2  data segment use16
          3    masg0 db 0ah, 0dh,  ' =====output singned numbers====== ' ,0dh,0ah, ' $ '
          4    masg1 db  ' numbers are:  $ '
          5    masg2 db 0ah, 0dh,  ' average of the numbers is:  $ '
          6    masg3 db 0ah, 0dh,  ' maximum of the numbers is:  $ '
          7    masg4 db 0ah, 0dh,  ' minimum of the numbers is:  $ '
          8    array1 dw    12 2 3 5 6 7 32767   
          9    nums   equ ($-array1)/ 2
         10    max    dw ?
         11    min    dw ?
         12    avg    dw ?
         13  data ends
         14 
         15  stack segment use16 stack
         16    db  200  dup( 0 )
         17  stack ends
         18 
         19  code segment use16
         20    assume  cs: code,  ds:  data,  ss:  stack
         21  start:
         22     ; 初始化
         23     mov  ax, data
         24     mov  ds, ax
         25     mov  ax, stack
         26     mov  ss, ax
         27    
         28     ;  输出提示
         29     lea  dx, masg0
         30     mov  ah,  9
         31     int  21h
         32    
         33     lea  dx, masg1
         34     mov  ah,  9
         35     int  21h
         36    
         37     ; 显示数字
         38     mov  cx, nums ;
         39  show:
         40     mov  si, cx
         41     dec  si
         42     add  si, si
         43     mov  ax, array1[si]
         44     call  shownumber
         45    loop show
         46    
         47     ;  输出提示
         48     lea  dx, masg2
         49     mov  ah,  9
         50     int  21h
         51     ; 计算平均值
         52     call  countaverage
         53     mov  ax, avg
         54     call  shownumber
         55    
         56     ;  输出提示
         57     lea  dx, masg3
         58     mov  ah,  9
         59     int  21h
         60     ; 计算最大值
         61     call  countmax
         62     mov  ax, max
         63     call  shownumber
         64    
         65     ;  输出提示
         66     lea  dx, masg4
         67     mov  ah,  9
         68     int  21h
         69     ; 计算最小值
         70     call  countmin
         71     mov  ax, min
         72     call  shownumber
         73    
         74     ; 退出
         75     call  exit
         76    
         77     ; 以十进制输出一个无符号字元素
         78     ;  数据在ax中
         79  shownumber  proc near
         80     pusha             ; 保存现场,
         81     mov  cx,  0
         82     countbit:         ; 一位位处理
         83       mov  dx,  0
         84       mov  bx,  10
         85       div  bx   ; 除10
         86       push  dx  ; 保存余数
         87       inc  cx   ; 位数目加一
         88       cmp  ax,  0
         89       ja  countbit   ; 商不为零跳转
         90     ; 显示
         91     showbit:
         92       pop  dx
         93       add  dl, 30h
         94       mov  ah,  2
         95       int  21h
         96      loop showbit  ; 大于零,还有位未处理跳转
         97     ; 显示空格
         98     mov  dl, 20h
         99     mov  ah,  2
        100     int  21h
        101   
        102     popa          ; 恢复现场
        103     ret           ; 返回
        104  shownumber  endp
        105 
        106     ; 计算平均值
        107     ; 使用全局的数组,和数组长度
        108     ; 把平均值保存到变量avg中
        109  countaverage proc near 
        110     pusha     ; 保存现场
        111     mov  cx, nums
        112     mov  ax,  0
        113  addnum:   
        114     mov  si, cx
        115     dec  si
        116     add  si, si
        117     mov  bx, array1[si]
        118     add  ax, bx
        119    loop addnum
        120    
        121     mov  dx,  0
        122     mov  bx, nums
        123     div  bx
        124    
        125     mov  avg, ax
        126     popa      ; 恢复现场
        127     ret       ; 返回
        128  countaverage endp
        129 
        130     ; 计算最大值
        131     ; 使用全局变量array1,和数组长度nums
        132     ; 最大值保存到max 
        133  countmax  proc near
        134     pusha     ; 保存现场
        135     mov  cx, nums
        136     mov  ax,  0
        137  next1:
        138     mov  si, cx
        139     dec  si
        140     add  si, si
        141     mov  bx, array1[si]
        142     cmp  bx, ax
        143     jna  low1
        144     mov  ax, bx
        145  low1:
        146    loop next1
        147    
        148     mov  max, ax
        149     popa      ; 恢复现场
        150     ret       ; 返回
        151  countmax  endp
        152 
        153     ; 计算最小值
        154     ; 使用全局变量
        155     ; 最小值保存到min中
        156  countmin  proc near
        157     pusha     ; 保存现场
        158    
        159     mov  cx, nums
        160     mov  si, cx
        161     dec  si
        162     add  si, si
        163     mov  ax, array1[si] 
        164     dec  cx
        165    
        166  next2:
        167     mov  si, cx
        168     dec  si
        169     add  si, si
        170     mov  bx, array1[si]
        171     cmp  bx, ax
        172     ja  high1
        173     mov  ax, bx
        174  high1:
        175    loop next2
        176    
        177     mov  min, ax
        178     popa      ; 恢复现场
        179     ret       ; 返回
        180  countmin  endp
        181    
        182     ; 退出
        183  exit  proc
        184     mov  ah, 4ch
        185     int  21h
        186  exit endp
        187    
        188  code ends
        189       end start
  • 子模块设计

      • 分析

需要了解一下子模块的设计的一些规则,如name,extern,public,高级语言的多文件编译可以在汇编语言中找到实现的最明显的启示;用模块化编程实现,将主程序放在一个模块中;将平均值、最大值、最小值函数放在一个模块中;将显示输出放在另一个模块中。

      • 源代码

        主函数:
         1        name main
         2        extrn  countaverage:  near,  countmax:  near,  countmin:  near,  shownumber:  near
         3        public array1, nums, number, avg, min, max
         4  . 386
         5  data segment use16 para public  ' datas '
         6    masg0 db 0ah, 0dh,  ' =====output singned numbers====== ' ,0dh,0ah, ' $ '
         7    masg1 db  ' numbers are:  $ '
         8    masg2 db 0ah, 0dh,  ' average of the numbers is:  $ '
         9    masg3 db 0ah, 0dh,  ' maximum of the numbers is:  $ '
        10    masg4 db 0ah, 0dh,  ' minimum of the numbers is:  $ '
        11    array1 dw    1 2 3 5 6 7   
        12    nums   dw   6
        13    number dw ?
        14    max    dw ?
        15    min    dw ?
        16    avg    dw ?
        17  data ends
        18 
        19  stack segment use16 para stack  ' stack '
        20    db  200  dup( 0 )
        21  stack ends
        22 
        23  code segment use16 para public  ' code '
        24    assume  cs: code,  ds:  data,  ss:  stack
        25  start:
        26  ; 初始化
        27     mov  ax, data
        28     mov  ds, ax
        29     mov  ax, stack
        30     mov  ss, ax
        31    
        32     ;  输出提示
        33     lea  dx, masg0
        34     mov  ah,  9
        35     int  21h
        36    
        37     lea  dx, masg1
        38     mov  ah,  9
        39     int  21h
        40    
        41     ; 显示数字
        42     mov  cx, nums ;
        43  show:
        44     mov  si, cx
        45     dec  si
        46     add  si, si
        47     mov  ax, array1[si]
        48     mov  number, ax
        49     call  shownumber
        50    loop show
        51    
        52     ;  输出提示
        53     lea  dx, masg2
        54     mov  ah,  9
        55     int  21h
        56     ; 计算平均值
        57     mov  dx, ds
        58     call  countaverage
        59     mov  ax,  avg
        60     mov  number, ax
        61     call  shownumber
        62    
        63     ;  输出提示
        64     lea  dx, masg3
        65     mov  ah,  9
        66     int  21h
        67     ; 计算最大值
        68     mov  dx, ds
        69     call  countmax
        70     mov  ax,  max
        71     mov  number, ax
        72     call  shownumber
        73    
        74     ;  输出提示
        75     lea  dx, masg4
        76     mov  ah,  9
        77     int  21h
        78     ; 计算最小值
        79     mov  dx, ds
        80     call  countmin
        81     mov  ax,  min
        82     mov  number, ax
        83     call  shownumber
        84     ; 退出
        85     mov  ah, 4ch
        86     int  21h
        87 code ends

        88     end start 

        计算函数:

         1        name count
         2        extrn  nums:  word,  array1:  word,  avg: word,  min:  word,  max: word
         3        public countaverage, countmax,  countmin
         4  . 386
         5  data segment use16 para public  ' datas '
         6  data ends
         7 
         8  stack segment use16 para stack  ' stack '
         9    db  200  dup( 0 )
        10  stack ends
        11 
        12  code segment use16 para public  ' code '
        13    assume  cs: code,  ds: data,  ss:  stack
        14      ; 初始化
        15     mov  dx, data
        16     mov  ds, dx
        17     mov  dx, stack
        18     mov  ss, dx
        19     
        20   
        21     ; 计算平均值
        22     ; 数据保存在ds段中
        23     ; 把平均值保存到变量avg中
        24  countaverage proc near
        25     pusha     ; 保存现场
        26     mov  ds, dx
        27     mov  cx, nums
        28     mov  ax,  0
        29  addnum:   
        30     mov  si, cx
        31     dec  si
        32     add  si, si
        33     mov  bx, array1[si]
        34     add  ax, bx
        35    loop addnum
        36    
        37     mov  dx,  0
        38     mov  bx, nums
        39     div  bx
        40    
        41     mov  avg, ax
        42     popa      ; 恢复现场
        43     ret       ; 返回
        44  countaverage endp
        45 
        46     ; 计算最大值
        47     ; 数据保存在ds中,和数组长度nums
        48     ; 最大值保存到max 
        49  countmax  proc near
        50     pusha             ; 保存现场,
        51     mov  ds, dx
        52     mov  cx,  ds: nums
        53     mov  ax,  0
        54  next1:
        55     mov  si, cx
        56     dec  si
        57     add  si, si
        58     mov  bx,  ds: array1[si]
        59     cmp  bx, ax
        60     jna  low1
        61     mov  ax, bx
        62  low1:
        63    loop next1
        64    
        65     mov   ds: max, ax
        66     popa          ; 恢复现场
        67     ret       ; 返回
        68  countmax  endp
        69 
        70     ; 计算最小值
        71     ; 数据保存在ds中
        72     ; 最小值保存到min中
        73  countmin  proc near  
        74     pusha             ; 保存现场,
        75     mov  ds, dx
        76     mov  cx,  ds: nums
        77     mov  si, cx
        78     dec  si
        79     add  si, si
        80     mov  ax,  ds: array1[si] 
        81     dec  cx
        82    
        83  next2:
        84     mov  si, cx
        85     dec  si
        86     add  si, si
        87     mov  bx,    ds: array1[si]
        88     cmp  bx, ax
        89     ja  high1
        90     mov  ax, bx
        91  high1:
        92    loop next2
        93    
        94     mov   ds: min, ax
        95     popa          ; 恢复现场
        96     ret       ; 返回
        97  countmin  endp
        98  code ends
        99      end 

        显示函数: 

         1        name show
         2        extrn  number: word
         3        public shownumber
         4    ; 以十进制显示number中的数据
         5  . 386
         6  data segment use16 para public  ' datas '
         7  data ends
         8 
         9  stack segment use16 para stack  ' stack '
        10    db  200  dup( 0 )
        11  stack ends
        12 
        13  code segment use16 para public  ' code '
        14    assume  cs: code,  ds:  data,  ss:  stack
        15     ; 初始化
        16     mov  dx, data
        17     mov  ds, dx
        18     mov  dx, stack
        19     mov  ss, dx
        20    
        21    ; 以十进制输出一个无符号字元素
        22     ;  数据在ax中
        23  shownumber  proc near
        24     pusha             ; 保存现场,
        25     mov  ax, number
        26     mov  cx,  0
        27     countbit:         ; 一位位处理
        28       mov  dx,  0
        29       mov  bx,  10
        30       div  bx   ; 除10
        31       push  dx  ; 保存余数
        32       inc  cx   ; 位数目加一
        33       cmp  ax,  0
        34       ja  countbit   ; 商不为零跳转
        35     ; 显示
        36     showbit:
        37       pop  dx
        38       add  dl, 30h
        39       mov  ah,  2
        40       int  21h
        41      loop showbit  ; 大于零,还有位未处理跳转
        42     ; 显示空格
        43     mov  dl, 20h
        44     mov  ah,  2
        45     int  21h
        46     popa          ; 恢复现场
        47     ret           ; 返回
        48  shownumber  endp      
        49  code ends
        50    end

转载于:https://www.cnblogs.com/hustlijian/archive/2011/06/06/2073965.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值