15.5节的一个例题,遇到ntvdm cpu 遇到无效的指令?
assume cs:codestack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,0
push cs
pop ds
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cldt
rep movsb
push es:
pop es:
push es:
pop es:
cli
mov word ptr es:,204h ;DEBUG时运行到这一步时提示:NTVDM CPU 遇到无效的指令
mov word ptr es:,0
sti
mov ax,4c00h
int 21h
int9:push ax
push bx
push cx
push es
in al,60h
pushf
call dword ptr cs:
cmp al,3bh
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s: inc byte ptr es:
add bx,2
loop s
int9ret: pop es
pop cx
pop bx
pop ax
iret
int9end:nop
code ends
end start
这个问题如何解决?是电脑问题还是编译器问题?还是程序问题?
跪求大神解惑!!!
或许与键盘有关的中断,当你在t调式时早就已经到了int9中断,必定是这时产生了错乱。
是不是不可调式,只可运行呢 有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢? 三田学校 发表于 2012-8-7 17:20 static/image/common/back.gif
或许与键盘有关的中断,当你在t调式时早就已经到了int9中断,必定是这时产生了错乱。
是不是不可调式,只可 ...
有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢?还有,为什么会发生错乱,应该是我按下之后CPU执行了那条指令后修改INT 9H的入口地址,只是以后这个键盘就不起作用了而已,而不应该报错,这个又怎么解释呢? 第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli
mov word ptr es:,204h
mov word ptr es:,0
sti
这几句用G命令调试。。否则会出错
因为你在调试的时候会引发键盘中断。。 三田学校 发表于 2012-8-7 22:08 static/image/common/back.gif
第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli
我的即使是在COMMAND下编译运行后按了F1也是没有作用,只是会重复我上次在命令行输入的内容,用G命令会退出DEBUG程序, assume cs:code,ss:stack
stack segment
db 128 dup (0) ;定义128个字节空间,用于中转数据
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
;安装中断例程到0:204
push cs
pop ds ;设置ds为代码段
mov ax,0
mov es,ax ;设置附加段
mov si,offset newInt9 ;设置ds:si指向源地址
mov di,204h ;设置es:di指向目的地址0:204h
mov cx,offset int9end - offset newInt9 ;设置cx为传输长度
cld ;设置传输方向为正
rep movsb ;安装自定义的int9中断例程
;保存旧的int9中断向量到0:200h-203h
push es:
pop es:
push es:
pop es:
;设置新的int9中断向量为0:204h
cli ;置IF=0,CPU禁止响应外部中断
mov word ptr es:,204h ;(0:9*4)=204h
mov word ptr es:,0 ;(0:9*4+2)=0
sti
mov ax,4c00h
int 21h
newInt9:
push ax
push bx
push cx
push es
in al,60h
call dword ptr cs:
cmp al,3bh
jne int9ret
mov ax,0b800h
mov es,ax
mov bx,1
mov cx,2000
s2:
inc byte ptr es:
add bx,2
loop s2
int9ret:
pop es
pop cx
pop bx
pop ax
iret
int9End:nop
code ends
end start在运行中输入command,确定后进行编译,然后运行,
按f1即可不断的换颜色
我用的版本是masm615 谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响 三田学校 发表于 2012-8-10 10:27 static/image/common/back.gif
在运行中输入command,确定后进行编译,然后运行,
按f1即可不断的换颜色
谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响 求同:Q。这个太伤大脑了{:5_100:}
页:
[1]