徒手拆高达 发表于 2019-8-9 02:13:16

精简后的实验七代码

本帖最后由 徒手拆高达 于 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:
                MOV ES:,AX
                MOV DX,DS:
                MOV ES:,DX
                ;写入年份,一次写入16位,这样只需要4行代码。
               
                MOV AX,0A8H
                MOV ES:0AH,EX
                ;写入雇员数               
               
                MOV AX,54H
                MOV DX,56H
                MOV ES:5H,AX
                MOV ES:7H,DX
                ;写入收入,先写入雇员数,再使用AX DX写入收入数,这样可以直接给后边除法使用AX DX寄存器
               
                DIV WORD PTR ES:0AH
                MOV ES:0DH,AX
                ;计算人均收入,这里的除数无所谓从DS还是ES读入,一样的。

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

                LOOP S1
               
                MOV AX,4C00H
                INT 21H
               
CODE ENDS
END START

jackz007 发表于 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:
                MOV DX,ES:
                DIV WORD PTR ES:
                MOV WORD PTR ES:,AX
                ADD BX,16
                LOOP M4         
                MOV AX,04C00H
                INT 021H
MAIN ENDP
CODE ENDS
END MAIN

徒手拆高达 发表于 2019-8-12 10:38:29

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

大佬的好多命令我没学过- -尴尬{:10_266:}

菜鸡,考虑可读性灵活性和可维护性对我来说可能有点超纲了。。。。。{:10_266:}
页: [1]
查看完整版本: 精简后的实验七代码