求大神指教,汇编运行程序出错
本来,在学校电脑上运行时可以得到完整的结果,但是,回到家用win7的本本运行时就显示THE NTVDM CPU has encountered an illegal instrution,后面还显示一串cs,ip等值。程序是求输入输入一串字符,再输入一个字符x,通过长调用的方式,求出字符x的个数。源代码如下:DATA SEGMENT
STRN DB 50
N DB 0
DB 50 DUP(?)
M DB 00H
AA DB 0AH,0DH,'$'
DATA ENDS
STACK1 SEGMENT STACK
DB 100 DUP(?)
STACK1 ENDS
CODE SEGMENT
ASSUME DS:DATA,CS:CODE
START: MOV AX,DATA
MOV DS,AX
LEA DX,STRN
MOV AH,0AH
INT 21H
LEA DX,AA
MOV AH,09
INT 21H
MOV AH,01H
INT 21H
PUSH AX
LEA DX,AA
MOV AH,09
INT 21H
LEA SI,STRN
ADD SI,02H
MOV CL,N
MOV DL,M
PUSH SI
PUSH CX
PUSH DX
CALL FAR PTR TJGS
POP DX
MOV M,DL
LEA DX,AA
MOV AH,09
INT 21H
POP AX
MOV DL,AL
MOV AH,02H
INT 21H
LEA SI,M
MOV AL,[SI]
CALL HEXASC
MOV AH,4CH
INT 21H
HEXASC PROC NEAR ;定义子程序为近过程(同一代码段)
MOV DL,AL ;通过寄存器AL,把主程序的参数
;(两位16进制数XY)送到子程序
PUSH CX ;保存计数器当前值(SHR要用CL)
MOV CL,4 ;设移位4次
SHR DL,CL ;移位后,DL=0X
POP CX ;恢复计数器当前值
PUSH AX ;保存XY
CMP DL,9 ;16进制数X与9比较
JBE NEXT ;小于或等于9,转NEXT
ADD DL,7 ;大于9,先加7
NEXT: ADD DL,30H ;再加30H. 小于等于9,只加30H
MOV AH,2 ;已把X转换为ASCII码,
INT 21H ; 调DOS 2号功能在屏幕上显示X
POP AX ;恢复AX内的XY
MOV DL,AL ;DL=XY
AND DL,0FH ;DL=0YH
CMP DL,9 ;Y与9比较
JBE NEXT1 ;小于等于9,转NEXT1
ADD DL,7 ;大于9,先加7
NEXT1: ADD DL,30H ;再加30H.小于等于9,只加30H
MOV AH,2 ;显示Y
INT 21H
RET ;返回主程序
HEXASC ENDP
CODE ENDS
CODE1 SEGMENT
ASSUME CS:CODE1
TJGS PROC FAR
POP BP
POP DX
POP CX
POP SI
POP AX
PUSH AX
AS1: MOV BL,[SI]
CMP AL,BL
JNE AS2
INC SI
INC DL
LOOP AS1
AS2: INC SI
LOOP AS1
PUSH DX
PUSH BP
RET
TJGS ENDP
CODE1 ENDS
END START