鱼C论坛

 找回密码
 立即注册
查看: 3042|回复: 0

[汇编作业] 课程设计1,优雅实现,欢迎交流

[复制链接]
发表于 2022-1-6 22:34:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chunhuaqiuyue 于 2022-1-10 22:05 编辑

设计思想: 函数式调用,将call理解为符号,后面作为要做的动作
  1. assume cs:code,ds:data,ss:stack

  2. data segment
  3.     ;years
  4.     db '1975','1976','1977','1978','1979','1980','1981','1982','1983'
  5.     db '1984','1985','1986','1987','1988','1989','1990','1991','1992'
  6.     db '1993','1994','1995'
  7.     ; income
  8.     dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  9.     dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
  10.     ;stuff count
  11.     dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  12.     dw 11542,14430,15257,17800
  13. data ends

  14. stack segment
  15.     dw 8 dup (0)
  16. stack ends

  17. code segment
  18. start:
  19.     call clear_screen

  20. init:
  21.     mov ax,data
  22.     mov ds,ax
  23.     mov ax,stack
  24.     mov ss,ax
  25.     mov ax,0b80ah
  26.     mov es,ax

  27.     mov bx,0 ; data address
  28.     mov bp,0 ; screen address

  29.     call output_year
  30.     call output_income
  31.     call output_stuff
  32.     call output_avg_income

  33.     mov ax,4c00h
  34.     int 21h

  35. ; =============== output years =================
  36. output_year:
  37.     mov cx,21
  38.     mov ah,2
  39.     call outputYear
  40.     ret

  41. outputYear:
  42.     mov al,[bx]
  43.     mov es:[bp],ax
  44.     mov al,[bx+1]
  45.     mov es:[bp+2*1],ax
  46.     mov al,[bx+2]
  47.     mov es:[bp+2*2],ax
  48.     mov al,[bx+3]
  49.     mov es:[bp+2*3],ax

  50.     add bx,4
  51.     add bp,160 ; add a row of position

  52.     loop outputYear
  53.     ret

  54. ; ==============================================
  55. output_avg_income:
  56.     mov di,0 ; row
  57.     mov cx,21
  58.     mov bx,84 ; skip years
  59.     mov si,168 ; skip years & income ; 21*4+21*4
  60.     call outputAvgIncome
  61.     ret

  62. outputAvgIncome:
  63.     mov ax,[bx]
  64.     mov dx,[bx+2]
  65.     mov bp,90 ; 45 cols

  66.     push cx
  67.     push bx
  68.     call _outputAvgIncome
  69.     pop bx
  70.     pop cx

  71.     add di,160
  72.     add bx,4
  73.     add si,2
  74.     loop outputAvgIncome
  75.     ret

  76. _outputAvgIncome:
  77.     mov cx,[si]
  78.     call divdw
  79.     call _print_num
  80.     ret

  81. ; ==============================================
  82. output_stuff:
  83.     mov di,0 ; row
  84.     mov cx,21
  85.     call outputStuff
  86.     ret

  87. outputStuff:
  88.     mov ax,[bx]
  89.     mov bp,60 ; 30 cols

  90.     push cx
  91.     call _outputStuff
  92.     pop cx

  93.     add di,160
  94.     add bx,2
  95.     loop outputStuff
  96.     ret

  97. _outputStuff:
  98.     mov cx,10

  99.     div cx
  100.     add dl,30h
  101.     mov dh,2
  102.     mov es:[bp+di],dx
  103.     mov dx,0
  104.     mov cx,ax
  105.     jcxz divRet
  106.     sub bp,2
  107.     jmp short _outputStuff

  108. ; ==============================================
  109. output_income:
  110.     mov di,0 ; row
  111.     mov cx,21
  112.     call outputIncome
  113.     ret

  114. outputIncome:
  115.     mov ax,[bx]
  116.     mov dx,[bx+2]
  117.     mov bp,30 ; 2*4+22*2 = 15 cols

  118.     push cx
  119.     push bx
  120.     call _print_num
  121.     pop bx
  122.     pop cx

  123.     add di,160
  124.     add bx,4
  125.     loop outputIncome
  126.     ret

  127. divRet:
  128.     ret

  129. ; ===============================================
  130. clear_screen:
  131.     mov ax,0b800h
  132.     mov es,ax
  133.     mov ax,0
  134.     mov dx,0700h
  135.     mov cx,1760

  136. clearScreen:
  137.     mov es:[bx],ax
  138.     add bx,2
  139.     loop clearScreen
  140.     ret

  141. ; ===============================================
  142. divdw:
  143.     mov bx,ax
  144.     mov ax,dx
  145.     mov dx,0

  146.     div cx

  147.     xor ax,bx
  148.     xor bx,ax
  149.     xor ax,bx

  150.     div cx

  151.     xor dx,bx
  152.     xor bx,dx
  153.     xor dx,bx

  154.     mov cx,bx
  155.     ret

  156. ; ===============================================
  157. _print_num:
  158.     ;; ax=L; dx=H
  159.     mov cx,10
  160.     mov bx,ax
  161.     mov ax,dx
  162.     mov dx,0  ;; 以上三步则是 计算 H/N, 之后ax=int(H/N), dx=rem(H/N)
  163.     div cx
  164.     ; 因为当前ax中存放的是 int(H/N),相当于存放的是高位的数据
  165.     ; 所以下面这3个 xor 操作是将高位的值放到bx中,然后再将 L 的数据放到ax中
  166.    
  167.     xor ax,bx ; 交换 ax和bx 的值
  168.     xor bx,ax ; 交换 ax和bx 的值
  169.     xor ax,bx ; 交换 ax和bx 的值
  170.     ; 交换的目的其实只是为了减少空间的使用,不使用多余的内存来存储数据
  171.     div cx
  172.     ; 这一步之后,存放的是 ax=(rem(H/N)*65536+L)/N 的结果
  173.     ;                  dx=余数
  174.     ; 将高位的结果放到dx中
  175.     xor dx,bx
  176.     xor bx,dx
  177.     xor dx,bx

  178.     mov cx,bx ; 将余数存入cx
  179.     mov ch,2
  180.     add cl,30h
  181.     mov es:[bp+di],cx
  182.     mov cx,0
  183.     or cx,dx
  184.     or cx,ax
  185.     jcxz divRet
  186.     sub bp,2
  187.     jmp short _print_num
  188. ; ===============================================

  189. code ends

  190. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-7 16:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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