NTVDM CPU 遇到无效的指令
时间:2011-04-23
来源:互联网
DATAS SEGMENT
dw 2 dup (0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,0
MOV ES,AX
MOV AX,ES:[4*9]
MOV DS:[0],AX
MOV AX,ES:[4*9+2]
MOV DS:[2],AX
;保存原9号中断向量
MOV AX,CS
MOV DS,AX
MOV SI,OFFSET New_Int9
MOV AX,0
MOV ES,AX
MOV DI,200H
MOV CX,OFFSET Int9_End - OFFSET New_Int9
CLD
REP MOVSB
cli
MOV WORD PTR ES:[4*9],200H
MOV WORD PTR ES:[4*9+2],0
sti
;存入新9号中断向量
MOV CX,30
MOV DX,2000h
MOV AX,0
Latency:
CALL Delay
LOOP Latency
MOV AX,DS:[0]
MOV ES:[4*9],AX
MOV AX,DS:[2]
MOV ES:[4*9+2],AX
Delay:
SUB AX,1
SBB DX,0
CMP AX,0
JNZ Delay
CMP DX,0
JNZ Delay
ret
New_Int9:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
No_A:
IN AL,60H
PUSHF
CALL DWORD PTR DS:[0]
CMP AL,9E
JNZ No_A
MOV AH,2
MOV BH,0
MOV DH,0
MOV DL,0
INT 10H
MOV AH,9
MOV AL,'A'
MOV BL,7
MOV BH,0
MOV CX,4000
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
Int9_End:
NOP
MOV AH,4CH
INT 21H
CODES ENDS
END START
我们先不说这个程序是否正确。运行时不会提示“NTVDM CPU遇到无效的指令”,而在用DEBUG调试到MOV WORD PTR ES:[4*9],200H 时就会出现NTVDM CPU这个错误,MOV WORD PTR ES:[4*9],200H 是用于修改9号中断向量表,是不是因为系统保护的原因,如果是要怎么才能修改这个中断向量。
dw 2 dup (0)
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV AX,0
MOV ES,AX
MOV AX,ES:[4*9]
MOV DS:[0],AX
MOV AX,ES:[4*9+2]
MOV DS:[2],AX
;保存原9号中断向量
MOV AX,CS
MOV DS,AX
MOV SI,OFFSET New_Int9
MOV AX,0
MOV ES,AX
MOV DI,200H
MOV CX,OFFSET Int9_End - OFFSET New_Int9
CLD
REP MOVSB
cli
MOV WORD PTR ES:[4*9],200H
MOV WORD PTR ES:[4*9+2],0
sti
;存入新9号中断向量
MOV CX,30
MOV DX,2000h
MOV AX,0
Latency:
CALL Delay
LOOP Latency
MOV AX,DS:[0]
MOV ES:[4*9],AX
MOV AX,DS:[2]
MOV ES:[4*9+2],AX
Delay:
SUB AX,1
SBB DX,0
CMP AX,0
JNZ Delay
CMP DX,0
JNZ Delay
ret
New_Int9:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
No_A:
IN AL,60H
PUSHF
CALL DWORD PTR DS:[0]
CMP AL,9E
JNZ No_A
MOV AH,2
MOV BH,0
MOV DH,0
MOV DL,0
INT 10H
MOV AH,9
MOV AL,'A'
MOV BL,7
MOV BH,0
MOV CX,4000
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET
Int9_End:
NOP
MOV AH,4CH
INT 21H
CODES ENDS
END START
我们先不说这个程序是否正确。运行时不会提示“NTVDM CPU遇到无效的指令”,而在用DEBUG调试到MOV WORD PTR ES:[4*9],200H 时就会出现NTVDM CPU这个错误,MOV WORD PTR ES:[4*9],200H 是用于修改9号中断向量表,是不是因为系统保护的原因,如果是要怎么才能修改这个中断向量。
作者: fjyangzb 发布时间: 2011-04-23
中断向量是4个字节,你一次改两个字节,要是中间正好发生了键盘中断,那肯定是跳到天知道什么地方去了,你要么一次改4个字节,要么用CLI先关掉中断
作者: Areslee 发布时间: 2011-04-23
我不是已经关了吗,中断向量
作者: fjyangzb 发布时间: 2011-04-23
那就是NTVDM的BUG了,这东西BUG不少,你直接改成mov dword ptr es:[4*90],xxxx吧
作者: Areslee 发布时间: 2011-04-23
New_Int9:前面要org 200h
产生键盘中断时,DS的值是未知的,不能直接CALL DWORD PTR DS:[0],这样程序就不知道跳到哪去了,所以会执行到无效指令。
产生键盘中断时,DS的值是未知的,不能直接CALL DWORD PTR DS:[0],这样程序就不知道跳到哪去了,所以会执行到无效指令。
作者: cnzdgs 发布时间: 2011-04-23
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28