读书人

[]汇编DEBUG的G命令有关问题

发布时间: 2012-08-30 09:55:54 作者: rapoo

[求助]汇编DEBUG的G命令问题



TITLE TABLE
.MODEL SMALL
.STACK 64
.DATA
YEARDB'1975','1976','1977','1978','1979','1980','1981','1982','1983','9184'
DB'1985','1986','1987','1988','1989','1990','1991','1992','1993','1994','1995'
SUMEDD16,22,382,1356,2390,8000,16000,24486,50065,97479,140417
DD197514,345980,590827,803530,1183000,1843000,3759000,3753000,4649000,5937000
EMPLdw3,7,9,13,28,38,130,220,476,778,1001
dw1442,2258,3793,4037,5635,8226,11542,14430,15257,17800

TABLEDB 21 DUP('YEAR SUME NE ?? ')
.CODEMAINPROCFAR

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
;--------------------------------------------

SETDATAPROCNEAR

CMP CX,21
JEA20

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

DIVIPROCNEAR

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 有问题吧,在子程里应该恢复实际的数据个数的,否则采用简洁段定义时,处理数据超范围了,会将后面的堆栈内容覆盖,从而导致子程的返回地址错误。

读书人网 >汇编语言

热点推荐