鱼C论坛

 找回密码
 立即注册
查看: 2892|回复: 9

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

[复制链接]
发表于 2012-8-7 13:30:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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:[9*4]
    pop es:[200h]
    push es:[9*4+2]
    pop es:[202h]
    cli
    mov word ptr es:[9*4],204h                 ;DEBUG时运行到这一步时提示:NTVDM CPU 遇到无效的指令
mov word ptr es:[9*4+2],0
    sti
    mov ax,4c00h
    int 21h
int9:  push ax
       push bx
    push cx
    push es
   
    in al,60h
    pushf
    call dword ptr cs:[200h]
    cmp al,3bh
    jne int9ret
    mov ax,0b800h
    mov es,ax
    mov bx,1
    mov cx,2000
s:     inc byte ptr es:[bx]
       add bx,2
    loop s
int9ret: pop es
         pop cx
         pop bx
   pop ax
   iret
int9end:nop
code ends
end start

这个问题如何解决?是电脑问题还是编译器问题?还是程序问题?
跪求大神解惑!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-7 17:20:08 | 显示全部楼层
或许与键盘有关的中断,当你在t调式时早就已经到了int9中断,必定是这时产生了错乱。
是不是不可调式,只可运行呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-7 17:46:02 | 显示全部楼层
有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-7 18:58:55 | 显示全部楼层

有点明白了,但问题更多了,这只是个安装新的int 9h的过程,运行了EXE文件后应该是替换了旧的版本,旧版本的入口地址被移到了200H的地方,理论上安装后就不能使用键盘了(如果操作系统有保护机制,那就应该是运行出错),但实际上还可以使用,这些都是怎么回事,并且运行后按F1并不能改变屏幕颜色,这又怎么解释呢?还有,为什么会发生错乱,应该是我按下之后CPU执行了那条指令后修改INT 9H的入口地址,只是以后这个键盘就不起作用了而已,而不应该报错,这个又怎么解释呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-7 22:08:33 | 显示全部楼层
第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
这几句用G命令调试。。否则会出错
因为你在调试的时候会引发键盘中断。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-9 12:39:20 | 显示全部楼层
三田学校 发表于 2012-8-7 22:08
第1:编译和运行都在command下,而不是用cmd
第2:在DEBUG下调试
cli

我的即使是在COMMAND下编译运行后按了F1也是没有作用,只是会重复我上次在命令行输入的内容,用G命令会退出DEBUG程序,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 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:[9*4]
    pop es:[200h]
    push es:[9*4+2]
    pop es:[202h]

;设置新的int9中断向量为0:204h
    cli                                                                        ;置IF=0,CPU禁止响应外部中断
    mov word ptr es:[9*4],204h                        ;(0:9*4)=204h
    mov word ptr es:[9*4+2],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:[200h]
                
                cmp al,3bh
                jne int9ret
                
                mov ax,0b800h
                mov es,ax
                mov bx,1
                mov cx,2000
        s2:
                inc byte ptr es:[bx]
                add bx,2
                loop s2
        int9ret:
                pop es
                pop cx
                pop bx
                pop ax
                iret
        int9End:nop
code ends
end start
在运行中输入command,确定后进行编译,然后运行,
按f1即可不断的换颜色

我用的版本是masm615
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-11 16:11:59 | 显示全部楼层
谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-8-11 16:12:41 | 显示全部楼层
三田学校 发表于 2012-8-10 10:27
在运行中输入command,确定后进行编译,然后运行,
按f1即可不断的换颜色

谢了,我用了你的代码试了一下,我也用的是MASM6.15,还是不行,我用的是WIN7系统,不知道这个有没有影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-9 21:23:53 | 显示全部楼层
求同:Q。这个太伤大脑了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-8 04:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表