当前位置: 代码迷 >> 汇编语言 >> [跪求解答]关于对中断向量表写入的有关问题
  详细解决方案

[跪求解答]关于对中断向量表写入的有关问题

热度:6185   发布时间:2013-02-26 00:00:00.0
[跪求解答]关于对中断向量表写入的问题
Assembly code
assume cs:codesg,ss:stacksgstacksg segment    db 128 dup(0)stacksg endscodesg segment;代码域start:    mov ax , stacksg    mov ss ,ax    mov sp , 0080H    mov ax , 0H    mov ds , ax    mov si , 24H;如果(0000:0200)!=0,防止第二次执行程序的时候把0000:0024H的地址写入0000:0200    mov ax , ds:[0024H]    cmp ax ,0204h    je useprogram    mov ax , 0000H    mov es , ax    mov di , 0200H    ;int 9的地址保存到0000:0200中    mov cx , 4h    cld    REP MOVSBuseprogram:;安装程序    MOV AX , 0h    MOV DS , AX;========================================================================================    mov DS:[0024H] ,0204H            ;到这里老是出现错误,说这里是无效的cpu指令    mov DS:[0024H+2h] ,0000H;========================================================================================    mov ax , cs    mov ds , ax    mov si , offset int9install    mov ax , 0000h    mov es , ax    mov di , 0204H    mov cx , offset endint9install - offset int9install    cld    rep movsb    mov cx , 0010Hs0:    call delay    loop s0        mov ax , 4c00h    int 21h;cpu空转delay:    push ax    push dx    mov dx , 1000h    mov ax , 0s1:    sub ax , 1    sbb dx , 0    cmp ax , 0    jne s1    cmp dx , 0    jne s1    pop dx    pop ax    ret;需要安装的程序int9install:    push ax    push bx    push cx    push es        in al ,60H    pushf    call dword ptr ds:[0200H]    ;调用真实的int9程序        cmp AL , 9EH    jne endint9    mov ax , 0b800H    mov es , ax    mov di , 0000H    mov cx , 0100Hs2:    mov  es:[di] , 'A'    inc di    mov  es:[di] ,  11000101B     inc di    loop s2endint9:    pop es    pop cx    pop bx    pop ax        iretendint9install:    nopcodesg endsend start


此程序为DOS中的9号中断int 9,此中断是响应键盘中断,
实现的功能为在按下A键松开后显示满屏的A
但是在往0000:0024内存地址写入的时候出现了cpu不能执行的问题【跪求解答】

------解决方案--------------------------------------------------------
在虚拟机上面测试吧
windows上面是不能这样的
------解决方案--------------------------------------------------------
在纯DOS模式下试一试。 因为保护模式下,有些内存是不允许被访问的。
------解决方案--------------------------------------------------------
学习8086汇编,装一个DOSBOX是一个不错的选择。 
http://www.dosbox.com
------解决方案--------------------------------------------------------
整体程序就没帮您看了.
个人对您程序中出现无效指令的情况的看法是这样的:
从前面的情况来看:
useprogram:之前是实现保存原INT9向量的,是没有问题的.
问题出现在这-->
useprogram:
;安装程序

MOV AX , 0h
MOV DS , AX
;========================================================================================
mov DS:[0024H] ,0204H ;到这里老是出现错误,说这里是无效的cpu指令
mov DS:[0024H+2h] ,0000H
;========================================================================================
为什么呢?
你也知道,INT9是键盘中断,只要按下键盘它就要响应的.而INT9的入口地址你也知道是存放在(DOUBLE WORD)0:24,而你在这里将0204H和0存在了INT9的向量地址,导致在这执行后INT9的向量入口地址变成了0:204H.--.我自己实践了下.我在WINXP下使用CMD,在0:204H一段是全为0,(估计一般用这段都为0,但不排除有不为0的情况).此后只要你按下键盘,可想而知,INT9一响应,就跑去0:0去执行了.你说!会出现什么情况?
顺便略微看了眼后面,我估计:
一,你是在执行DEBUG时出现T或其他命令在这两句时出现"无效指令"的情况.
二,整体执行这两句应该没问题,但此后一按键盘就出现问题.
三,建议你先把新INT9的代码复制到0:0204后再跟上改中断向量!

其他就没时间帮你看了.
你自己试改下这几句在代码中的位置.
  相关解决方案