鱼C论坛

 找回密码
 立即注册
查看: 2408|回复: 2

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

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

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

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

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

实验七课后作业,精简代码,想了想,还是没用循环嵌套(创建栈,压栈寄存CX,出栈,太麻烦了)
代码如下,多多指教。
ASSUME CS:CODE DS:DATA ES:TABLE SS:STACK
DATA SEGMENT 
                DB '1975','1976','1977','1978','1979','1980','1981','1982','1983'             
                DB '1984','1985','1986','1987','1988','1989','1990','1991','1992'
                DB '1993','1994','1995'
                ;21*4=84=54H    即年份占用0~53H
                
                DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
                DD 345980,590827,803530,1183000,184300,2759000,3753000,4649000,5937000
                ;21*4=84=54H 53H+54H=0A8 即收入占用54H~0A7H
                
                DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
                DW 11542,14430,15257,17800
                ;21*2=42=2AH 0A7H+2AH=0D1H 即雇员数量占用0A8H~0D1H
DATA ENDS

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

CODE SEGMENT
START:
                MOV AX,DATA
                MOV DS,AX
                MOV AX,TABLE
                MOV ES,AX                
                MOV SI,0
                MOV DI,0
                MOV BX,0
                MOV CX,21

S1:                
                MOV AX,DS:[BX] 
                MOV ES:[DI],AX
                MOV DX,DS:[BX+2]
                MOV ES:[DI+2],DX
                ;写入年份,一次写入16位,这样只需要4行代码。
                
                MOV AX,0A8H[SI]
                MOV ES:0AH[DI],EX
                ;写入雇员数                
                
                MOV AX,54H[BX]
                MOV DX,56H[BX]
                MOV ES:5H[DI],AX
                MOV ES:7H[DI],DX
                ;写入收入,先写入雇员数,再使用AX DX写入收入数,这样可以直接给后边除法使用AX DX寄存器
                
                DIV WORD PTR ES:0AH[DI]
                MOV ES:0DH[DI],AX
                ;计算人均收入,这里的除数无所谓从DS还是ES读入,一样的。

                ADD BX,4H
                ADD SI,2H
                ADD DI,10H

                LOOP S1
                
                MOV AX,4C00H
                INT 21H
                
CODE ENDS
END START
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-8-9 11:30:52 | 显示全部楼层
本帖最后由 jackz007 于 2019-8-9 13:30 编辑

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

DATA SEGMENT PARA PUBLIC 'DATA'
                DB '1975','1976','1977','1978','1979','1980','1981','1982','1983'             
                DB '1984','1985','1986','1987','1988','1989','1990','1991','1992'
                DB '1993','1994','1995'
                ;年份
                
                DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
                DD 345980,590827,803530,1183000,184300,2759000,3753000,4649000,5937000
                ;收入
                
                DW 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
                DW 11542,14430,15257,17800
                ;雇员数量
DATA ENDS

TABLE SEGMENT PARA PUBLIC 'TABLE'
                DB 21 DUP ('year summ ne ?? ')
TABLE ENDS

STACK SEGMENT STACK
                DW 0800H DUP(00)
STACK ENDS

CODE SEGMENT
MAIN PROC FAR
                MOV AX,DATA
                MOV DS,AX
                MOV AX,TABLE
                MOV ES,AX
                CLD           
                XOR SI,SI
                XOR BX,BX                  ; 传递年份
                MOV CX,21
 M1:             XOR DI,DI
                ADD DI,BX
                MOVSW
                MOVSW
                ADD BX,16
                LOOP M1
                XOR BX,BX                  ; 传递雇员数
                MOV CX,21
M2:             MOV DI,5
                ADD DI,BX
                MOVSW
                MOVSW
                ADD BX,16
                LOOP M2
                XOR BX,BX                  ; 传递收入
                MOV CX,21
M3:             MOV DI,10
                ADD DI,BX
                MOVSW
                ADD BX,16
                LOOP M3       
                XOR BX,BX                  ; 计算人均收入
                MOV CX,21
M4:             MOV SI,5
                ADD SI,BX
                MOV AX,ES:[SI]
                MOV DX,ES:[SI + 2]
                DIV WORD PTR ES:[SI + 5]
                MOV WORD PTR ES:[SI + 8],AX
                ADD BX,16
                LOOP M4         
                MOV AX,04C00H
                INT 021H
MAIN ENDP
CODE ENDS
END MAIN
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-12 10:38:29 | 显示全部楼层
jackz007 发表于 2019-8-9 11:30
楼主的精简使用了很多固定偏移,从而显著降低了代码的可读性、灵活性和可维护性,由此带来的问题也 ...

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

菜鸡,考虑可读性灵活性和可维护性对我来说可能有点超纲了。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-15 18:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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