TITLE TABLE
.MODEL SMALL
.STACK 64
.DATA
YEAR DB '1975','1976','1977','1978','1979','1980','1981','1982','1983','9184'
DB '1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
SUME DD 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417
DD 197514,345980,590827,803530,1183000,1843000,3759000,3753000,4649000,5937000
EMPL dw 3,7,9,13,28,38,130,220,476,778,1001
dw 1442,2258,3793,4037,5635,8226,11542,14430,15257,17800
TABLE DB 21 DUP('YEAR SUME NE ?? ')
.CODEMAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
LEA SI,YEAR
LEA DI,TABLE
MOV CX,21*2
CALL SETDATA
LEA SI,SUME
LEA DI,TABLE
ADD DI,5
MOV CX,21*2
CALL SETDATA
LEA SI,EMPL
LEA DI,TABLE
ADD DI,10
MOV CX,21
CALL SETDATA
LEA SI,SUME
LEA DI,EMPL
LEA BX,TABLE
ADD BX,13
MOV CX,21
CALL DIVI
MOV AX,4C00H
INT 21H
MAIN ENDP
;--------------------------------------------
SETDATA PROC NEAR
CMP CX,21
JE A20
A10: MOV AX,[SI] ;YEAR和SUME调用这段
MOV [DI],AX
ADD SI,2
MOV AX,[SI]
MOV [DI+2],AX
ADD SI,2
ADD DI,16
LOOP A10
RET
A20: MOV AX,[SI] ;EMPL调用这段
MOV [DI],AX
ADD SI,2
ADD DI,16
LOOP A20
RET
SETDATA ENDP
DIVI PROC NEAR
B10: MOV DX,[SI+2] ;SUME/EMPL,商保存在table段中,忽略余数
MOV AX,[SI]
DIV WORD PTR [DI]
MOV [BX],AX
ADD SI,2
ADD DI,2
ADD BX,16
LOOP B10
RET
DIVI ENDP
END MAIN
------解决方案--------------------------------------------------------
程序开始处的 MOV CX,21*2 有问题吧,在子程里应该恢复实际的数据个数的,否则采用简洁段定义时,处理数据超范围了,会将后面的堆栈内容覆盖,从而导致子程的返回地址错误。