精简后的实验七代码
本帖最后由 徒手拆高达 于 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 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 jackz007 发表于 2019-8-9 11:30
楼主的精简使用了很多固定偏移,从而显著降低了代码的可读性、灵活性和可维护性,由此带来的问题也 ...
大佬的好多命令我没学过- -尴尬{:10_266:}
菜鸡,考虑可读性灵活性和可维护性对我来说可能有点超纲了。。。。。{:10_266:}
页:
[1]