鱼C论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 57|回复: 2

[汇编作业] 精简后的实验七代码

[复制链接]
最佳答案
0 
发表于 2019-8-9 02:13:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 徒手拆高达 于 2019-8-9 02:14 编辑

实验七课后作业,精简代码,想了想,还是没用循环嵌套(创建栈,压栈寄存CX,出栈,太麻烦了)
代码如下,多多指教。

  1. ASSUME CS:CODE DS:DATA ES:TABLE SS:STACK
  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.                 ;21*4=84=54H    即年份占用0~53H
  7.                
  8.                 DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  9.                 DD 345980,590827,803530,1183000,184300,2759000,3753000,4649000,5937000
  10.                 ;21*4=84=54H 53H+54H=0A8 即收入占用54H~0A7H
  11.                
  12.                 DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13.                 DW 11542,14430,15257,17800
  14.                 ;21*2=42=2AH 0A7H+2AH=0D1H 即雇员数量占用0A8H~0D1H
  15. DATA ENDS

  16. TABLE SEGMENT
  17.                 DB 21 DUP ('year summ ne ?? ')
  18.                 ;21*16=150H table段占用长度150H
  19. TABLE ENDS

  20. CODE SEGMENT
  21. START:
  22.                 MOV AX,DATA
  23.                 MOV DS,AX
  24.                 MOV AX,TABLE
  25.                 MOV ES,AX               
  26.                 MOV SI,0
  27.                 MOV DI,0
  28.                 MOV BX,0
  29.                 MOV CX,21

  30. S1:               
  31.                 MOV AX,DS:[BX]
  32.                 MOV ES:[DI],AX
  33.                 MOV DX,DS:[BX+2]
  34.                 MOV ES:[DI+2],DX
  35.                 ;写入年份,一次写入16位,这样只需要4行代码。
  36.                
  37.                 MOV AX,0A8H[SI]
  38.                 MOV ES:0AH[DI],EX
  39.                 ;写入雇员数               
  40.                
  41.                 MOV AX,54H[BX]
  42.                 MOV DX,56H[BX]
  43.                 MOV ES:5H[DI],AX
  44.                 MOV ES:7H[DI],DX
  45.                 ;写入收入,先写入雇员数,再使用AX DX写入收入数,这样可以直接给后边除法使用AX DX寄存器
  46.                
  47.                 DIV WORD PTR ES:0AH[DI]
  48.                 MOV ES:0DH[DI],AX
  49.                 ;计算人均收入,这里的除数无所谓从DS还是ES读入,一样的。

  50.                 ADD BX,4H
  51.                 ADD SI,2H
  52.                 ADD DI,10H

  53.                 LOOP S1
  54.                
  55.                 MOV AX,4C00H
  56.                 INT 21H
  57.                
  58. CODE ENDS
  59. END START
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
482 
发表于 2019-8-9 11:30:52 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-9 13:30 编辑

       楼主的精简使用了很多固定偏移,从而显著降低了代码的可读性、灵活性和可维护性,由此带来的问题也很明显,逻辑线索不够清晰,代码容易出错,查找问题相对困难等等,个人认为得不偿失。
  1. ASSUME CS:CODE,DS:DATA,ES:TABLE,SS:STACK

  2. DATA SEGMENT PARA PUBLIC 'DATA'
  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.                
  8.                 DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
  9.                 DD 345980,590827,803530,1183000,184300,2759000,3753000,4649000,5937000
  10.                 ;收入
  11.                
  12.                 DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
  13.                 DW 11542,14430,15257,17800
  14.                 ;雇员数量
  15. DATA ENDS

  16. TABLE SEGMENT PARA PUBLIC 'TABLE'
  17.                 DB 21 DUP ('year summ ne ?? ')
  18. TABLE ENDS

  19. STACK SEGMENT STACK
  20.                 DW 0800H DUP(00)
  21. STACK ENDS

  22. CODE SEGMENT
  23. MAIN PROC FAR
  24.                 MOV AX,DATA
  25.                 MOV DS,AX
  26.                 MOV AX,TABLE
  27.                 MOV ES,AX
  28.                 CLD           
  29.                 XOR SI,SI
  30.                 XOR BX,BX                  ; 传递年份
  31.                 MOV CX,21
  32. M1:             XOR DI,DI
  33.                 ADD DI,BX
  34.                 MOVSW
  35.                 MOVSW
  36.                 ADD BX,16
  37.                 LOOP M1
  38.                 XOR BX,BX                  ; 传递雇员数
  39.                 MOV CX,21
  40. M2:             MOV DI,5
  41.                 ADD DI,BX
  42.                 MOVSW
  43.                 MOVSW
  44.                 ADD BX,16
  45.                 LOOP M2
  46.                 XOR BX,BX                  ; 传递收入
  47.                 MOV CX,21
  48. M3:             MOV DI,10
  49.                 ADD DI,BX
  50.                 MOVSW
  51.                 ADD BX,16
  52.                 LOOP M3      
  53.                 XOR BX,BX                  ; 计算人均收入
  54.                 MOV CX,21
  55. M4:             MOV SI,5
  56.                 ADD SI,BX
  57.                 MOV AX,ES:[SI]
  58.                 MOV DX,ES:[SI + 2]
  59.                 DIV WORD PTR ES:[SI + 5]
  60.                 MOV WORD PTR ES:[SI + 8],AX
  61.                 ADD BX,16
  62.                 LOOP M4         
  63.                 MOV AX,04C00H
  64.                 INT 021H
  65. MAIN ENDP
  66. CODE ENDS
  67. END MAIN
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
最佳答案
0 
 楼主| 发表于 2019-8-12 10:38:29 | 显示全部楼层
jackz007 发表于 2019-8-9 11:30
楼主的精简使用了很多固定偏移,从而显著降低了代码的可读性、灵活性和可维护性,由此带来的问题也 ...

大佬的好多命令我没学过- -  尴尬

菜鸡,考虑可读性灵活性和可维护性对我来说可能有点超纲了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

小甲鱼强烈推荐上一条 /1 下一条

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号

GMT+8, 2019-8-21 08:38

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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