鱼C论坛

 找回密码
 立即注册
查看: 5014|回复: 1

[汇编作业] 课程设计1

[复制链接]
发表于 2020-8-11 09:39:54 | 显示全部楼层 |阅读模式

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

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

x
感觉写得有点粗糙,看过的大佬也分享一下你们的写法
  1. assume cs:codesg

  2. data segment

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

  14. table segment
  15.        
  16.         db 21 dup('year summ ne ?? ')
  17.        
  18. table ends

  19. codesg segment
  20.        
  21.         start:mov ax,data
  22.         mov ds,ax
  23.         mov ax,0b800h
  24.         mov es,ax
  25.         mov di,0
  26.         mov si,0
  27.         mov bx,0
  28.         mov cx,21
  29.         s:push cx
  30.         call showstr
  31.         add si,14h
  32.         mov ax,054h[di]
  33.         mov dx,054h[di].2
  34.         call dtoc
  35.         add si,14h
  36.         mov ax,0a8h[bx]
  37.         mov dx,0
  38.         call dtoc
  39.         add si,14h
  40.         push bx
  41.         mov ax,054h[di]
  42.         mov dx,054h[di].2
  43.         mov bx,0a8h[bx]
  44.         call divdw
  45.         call dtoc
  46.         pop bx
  47.         add si,64h
  48.         add di,4
  49.         add bx,2
  50.        
  51.         pop cx
  52.         loop s
  53.         mov ax,4c00h
  54.         int 21h
  55.        
  56.         showstr:mov ax,[di]
  57.         mov es:[si],al
  58.         mov es:[si].2,ah
  59.         mov ax,[di].2
  60.         mov es:[si].4,al
  61.         mov es:[si].6,ah
  62.         ret
  63.        
  64.         dtoc:
  65.         push bx
  66.         mov cx,0
  67.         push cx
  68.         s0:mov bx,10
  69.         call divdw
  70.         jcxz checklow
  71.         s2:pop cx
  72.         inc cx
  73.         add bx,30h
  74.         push bx
  75.         push cx
  76.         mov cx,10
  77.         loop s0
  78.        
  79.         divdw:push ax
  80.         mov ax,dx
  81.         mov dx,0
  82.         div bx
  83.         mov cx,ax
  84.         pop ax
  85.         div bx
  86.         mov bx,dx
  87.         mov dx,cx
  88.         ret
  89.        
  90.         checklow:mov cx,ax
  91.         jcxz showdw
  92.         mov cx,0
  93.         jcxz s2
  94.        
  95.         showdw:pop cx
  96.         inc cx
  97.         add bx,30h
  98.         push bx
  99.         mov bx,0
  100.         s1:pop ax
  101.         mov es:[si][bx],al
  102.         add bx,2
  103.         loop s1
  104.         pop bx
  105.         ret
  106.        
  107. codesg ends

  108. end start


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

使用道具 举报

发表于 2021-3-23 14:46:58 | 显示全部楼层
对比楼主的代码加上注释,还加上了个人的理解(看了一天了有的地方还是不理解。。。)。
  1. assume cs:codesg

  2. a segment
  3. dw 1975,1976,1977,1978,1979,1980,1981,1982,1983
  4. dw 1984,1985,1986,1987,1988,1989,1990,1991,1992
  5. dw 1993,1994,1995  ;42

  6. dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  7. dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000        ;84

  8. dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  9. dw 11542,14430,15257,17800        ;42

  10. ;dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,224,239,260
  11. ;dw 304,333        ;42

  12. a ends

  13. codesg segment
  14. start:
  15.         mov ax,a
  16.         mov ds,ax                                 ;a段数据段地址做ds
  17.         mov ax,0b800h                         ;显存地址做es
  18.         mov es,ax

  19.         mov si,0                                ;显存偏移
  20.         mov di,0                                ;字符偏移(收入)
  21.         mov bx,0                                ;字符偏移

  22.         mov cx,21

  23. ls:        push cx
  24.         mov ax,[bx]                         ;第一组字符(年份),低16位
  25.         mov dx,0                                 ;清零高16位
  26.         call dtoc

  27.         add si,14h
  28.         mov ax,[di+42]                        ;第二组字符(收入),低16位
  29.         mov dx,[di+44]                        ;高16位
  30.         call dtoc

  31.         add si,14h
  32.         mov ax,[bx+126]                ;第三组字符(人数),低16位
  33.         mov dx,0                                ;清零高16位
  34.         call dtoc

  35.         push bx                                 ;因为要用到所以保存
  36.         add si,14h
  37.         mov ax,[di+42]                        ;第二组字符(收入),低16位
  38.         mov dx,[di+44]                        ;高16位
  39.         mov bx,[bx+126]                ;人数字符
  40.         call divdw                                ;除法
  41.         call dtoc
  42.         pop bx
  43.         add si,100                                ;显存换行写入
  44.         add bx,2                                ;下一个字符
  45.         add di,4                                ;下一个收入字符
  46.         pop cx
  47.         loop ls

  48.         mov ax,4c00h
  49.         int 21h

  50. dtoc:
  51.         push bx                                ;保存bx要用作之后用做被除数
  52.         mov cx,0                               ;初始化cx   
  53.     push cx                                        ;保存cx做计次用

  54. s0:       
  55.         mov bx,10                         ;除法的被除数
  56.         call divdw                                ;跳转到除法
  57.         jcxz checklow                        ;divdw代码结束时才会回到这里,cx=0跳转checklow
  58. s2:        pop cx                                ;恢复计次
  59.         inc cx                                ;计次
  60.         add bx,30h                        ;余,ascll码
  61.         push bx                                 ;保存字符ascll码
  62.         push cx                                 ;保存计次
  63.         ;mov cx,10                        
  64.         ;loop s0
  65.         jmp short s0

  66. divdw:                                        ;除法
  67.         push ax                                ;保存ax,先除dx
  68.         mov ax,dx                                ;dx的值给ax
  69.         mov dx,0                                ;清零,余(dx)
  70.         div bx                                ;ax除以bx,高16位/10
  71.         mov cx,ax                                 ;商给cx
  72.         pop ax                                  ;还原ax
  73.         div bx                                 ;ax/bx = 低16位/10
  74.         mov bx,dx                         ;余给bx
  75.         mov dx,cx                                 ;第一次除法的商给dx
  76.         ret

  77. checklow:                                         ;当divdw段代码执行完成时,到jcxz checklow并且cx=0时跳转到这
  78.         mov cx,ax                                 ;ax是divdw子程序的商
  79.         jcxz showdw                             ;当除法,商=0时跳转
  80.         jmp short s2                        ;计算下一个 ,1975 →197
  81.         ;mov cx,0
  82.         ;jcxz s2

  83. showdw:                                         ;做字符ascll码
  84.         pop cx                                ;把保存的次数拿出来
  85.         inc cx                                ;加上一次循坏(最后余的)
  86.         add bx,30h                        ;divdw 的余,第一位数(1975的1)
  87.         push bx                                 ;把每个数字的ascll保存在栈
  88.         mov bx,0                                 ;清零bx s1要用做显存的偏移变量

  89. s1:        pop ax                                 ;把数字的ascll码拿出来
  90.         mov es:[si+bx],al                 ;bx是定位下一个显存字符的变量,(00 00 00 = [bx] 00 [bx])
  91.         add bx,2                                 ;下一组显存数据(00 00 00 = 00 00 [bx])
  92.         loop s1
  93.         pop bx

  94.         ret
  95. codesg ends
  96. end start
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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