蓝色飞鸿之夜 发表于 2012-8-7 13:30:43

15.5节的一个例题,遇到ntvdm cpu 遇到无效的指令?

assume cs:code
stack 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

这个问题如何解决?是电脑问题还是编译器问题?还是程序问题?
跪求大神解惑!!!

三田学校 发表于 2012-8-7 17:20:08

或许与键盘有关的中断,当你在t调式时早就已经到了int9中断,必定是这时产生了错乱。
是不是不可调式,只可运行呢

蓝色飞鸿之夜 发表于 2012-8-7 17:46:02

有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢?

蓝色飞鸿之夜 发表于 2012-8-7 18:58:55

三田学校 发表于 2012-8-7 17:20 static/image/common/back.gif
或许与键盘有关的中断,当你在t调式时早就已经到了int9中断,必定是这时产生了错乱。
是不是不可调式,只可 ...

有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢?还有,为什么会发生错乱,应该是我按下之后CPU执行了那条指令后修改INT 9H的入口地址,只是以后这个键盘就不起作用了而已,而不应该报错,这个又怎么解释呢?

三田学校 发表于 2012-8-7 22:08:33

第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli
mov word ptr es:,204h
mov word ptr es:,0
sti
这几句用G命令调试。。否则会出错
因为你在调试的时候会引发键盘中断。。

蓝色飞鸿之夜 发表于 2012-8-9 12:39:20

三田学校 发表于 2012-8-7 22:08 static/image/common/back.gif
第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli


我的即使是在COMMAND下编译运行后按了F1也是没有作用,只是会重复我上次在命令行输入的内容,用G命令会退出DEBUG程序,

三田学校 发表于 2012-8-10 10:27:21

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

蓝色飞鸿之夜 发表于 2012-8-11 16:11:59

谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响

蓝色飞鸿之夜 发表于 2012-8-11 16:12:41

三田学校 发表于 2012-8-10 10:27 static/image/common/back.gif
在运行中输入command,确定后进行编译,然后运行,
按f1即可不断的换颜色



谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响

C开头 发表于 2012-9-9 21:23:53

求同:Q。这个太伤大脑了{:5_100:}
页: [1]
查看完整版本: 15.5节的一个例题,遇到ntvdm cpu 遇到无效的指令?