该题需要把 21个 年份year 收入sume 公司人数ne 以及平均收入?? 存放至TABLE段的 'YEAR SUME NE ?? '中 对应存储
不允许使用变量命名
(话说看上去这么简单的题汇编做起来怎么就这么难呢)
最终钻研了一小时得到这么个程序 最后有一点小瑕疵 没能将SUME NE ??这三个段从 16进制转化成可读的ASCII码(大失败)
DATAS 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'
;year
dd 11542,11542,11542,11542,11542,11542,11542,11542,11542,11542
dd 11542,11542,11542,11542,11542,11542,11542,11542,11542,11542,11542
;sume
dw 456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456,456
dw 456,456,456,456
;ne
DATAS ENDS
TABLE SEGMENT
DB 21 DUP('YEAR SUME NE ?? ')
TABLE ENDS
STACKS SEGMENT
DB 128 DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS,ES:TABLE
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,STACKS
MOV SS,AX
MOV AX,TABLE
MOV ES,AX
MOV CX,21
MOV SI,0
changeWord:
PUSH CX
MOV DI,SI ;取year这里year应该是4位一个,这里应该按照4位的方式,拆成两个放
ADD DI,DI ;di=si*2
ADD DI,DI ;di=si*4
MOV CX,DS:[DI]
MOV AX,DS:[DI+2]
ADD DI,DI ;di=si*8
ADD DI,DI ;di=si*16
MOV ES:[DI],CX ;es:di = 077E:si*16
MOV ES:[DI+2],AX ;es:di = 077E:si*16+2
MOV DI,SI ;取sume这里sume是4位一个
ADD DI,DI ;di=si*2
ADD DI,DI ;di=si*4
MOV AX,DS:[DI+84] ;开始的year 4位一个,所以开始占用了84个位置
MOV CX,AX
;ADD CX,30H ;转ascii
MOV DX,DS:[DI+86] ;取高位+2
ADD DI,DI ;di=si*8
ADD DI,DI ;di=si*16即一排
MOV ES:[DI+7],CX ;es:[di+7]=0770:si*16+7即第si行的第七个位置
MOV CX,DX ;因为cx是取的sume的低位 所以放在后面
;ADD CX,30H ;这里把sume的高位转ascii
MOV ES:[DI+5],CX ;并放入字符串高位
MOV DI,SI
ADD DI,DI ;di=si*2 最后的ne是两位一个
MOV BX,DS:[DI+84+84];这里的84+84是指year与sume所占用的位置
MOV CX,BX ;同理把ne拿出来
;ADD CX,30H ;转ascii
ADD DI,DI
ADD DI,DI ;di=si*8
ADD DI,DI ;di=si*16
MOV ES:[DI+10],CX ;并把ascii放入第10位(ne)
DIV BX ;做除法 求得??的数值
MOV ES:[DI+13],AX ;把最终的商放进第13位??的位置
inc SI
POP CX ;把cx从栈中拿出 继续循环
loop changeWord
MOV AH,4CH
INT 21H
CODES ENDS
END START
这里最终的后面那一串就分别对应了SUME NE以及?? 不知道怎么转成ASCII来显示
放弃ing