首页
社区
课程
招聘
[求助]关于 改写中断入口地址 的问题。
发表于: 2008-12-3 11:26 3569

[求助]关于 改写中断入口地址 的问题。

2008-12-3 11:26
3569
在程序运行期间 修改了int9的入口地址 程序结束 恢复int9的入口地址
程序的执行从结果上看是正常的 结束后,键盘就锁住了。
以下是代码。
assume cs:codesg,ss:stacksg
stacksg segment
    db 128 dup(0)
stacksg ends
codesg        segment
    start:
    mov     ax,stacksg
    mov     ss,ax
    mov     sp,128
    mov     ax,0b800h
    mov     es,ax
    mov     di,160*12+2*40          ;第13行中间开始
    mov     cx,10
    sti                             ;允许中断
    ;
    mov     ax,0
    mov     ds,ax
    push ds:[9*4]
    push ds:[9*4+2]                 ;向量表的ip段入栈 cs入栈
    mov  word ptr    ds:[9*4],offset int9
    mov  word ptr    ds:[9*4+2],cs
    mov     al,'a'
    mov     ah,7ch                  ;颜色
    mov es:[di+1],ah
    s:
    mov es:[di],al
    call    time
    inc     al
    loop    s                        ;循环显示

    pop word ptr   ds:[9*4+2]
    pop word ptr  ds:[9*4]                   ;恢复向量表
    ;cli
    mov     ax,4c00h
    int     21h

;----------------------------------
    int9:
    mov ah,0fch
    mov byte ptr es:[di+1],ah

    iret
;----------------------------------

    ;用于延时
    time proc
         push   ax
         push   bx
         mov    bx,1000h
         mov    ax,0
         s1:
         sub    ax,1
         sbb    bx,0
         cmp    ax,0
         jne    s1
         cmp    bx,0
         jne    s1
         pop    bx
         pop    ax
         ret
    time endp
codesg        ends
end start

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 214
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
为什么 键盘不能输入了呢、、、
2008-12-3 11:27
0
雪    币: 214
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
检查了一下午   以为是程序重入问题 所以把以前用栈来保存中断地址换成内存  但是 还是不行
代码如下:
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
  db 128 dup(0)
stacksg ends
datasg segment
  int9ip dw 0
        int9cs dw 0

datasg ends
codesg        segment
    start:

    mov     ax,datasg
                mov                        ds,ax
    mov     ax,0
    mov     es,ax
                mov     si,0
                mov                        dx,es:[9*4]
    mov        word ptr  int9ip,dx
                mov                        dx,es:[9*4+2]
    mov word ptr        int9cs,dx        ;保存当前的int 9的中断向量
                ;
    mov  word ptr es:[9*4],offset int99
    mov  word ptr es:[9*4+2],cs ;设置int 9中断向量

    mov     ax,0b800h
    mov     es,ax
    mov     di,160*12+2*40          ;第13行中间开始
    mov     cx,10
                ;
    mov     al,'a'
    mov     ah,7ch                  ;颜色
    mov     es:[di+1],ah
                ;
    s:
    mov     es:[di],al
    call    time
    inc     al
    loop    s                       ;循环显示

    mov                        dx,int9ip
                mov        word ptr es:[9*4],dx
                mov                        dx,int9cs
    mov word ptr es:[9*4+2],dx      ;恢复int 9中断向量

    mov     ax,4c00h
    int     21h

;----------------------------------
    int99:                           ;到这里 CS IP 标志寄存器 已经由硬件完成入栈
    mov ah,0fch
    mov byte ptr es:[di+1],ah        ;恢复向量表
    iret
;----------------------------------

    ;用于延时
    time proc
         push   ax
         push   bx
         mov    bx,1000h
         mov    ax,0
         s1:
         sub    ax,1
         sbb    bx,0
         cmp    ax,0
         jne    s1
         cmp    bx,0
         jne    s1
         pop    bx
         pop    ax
         ret
    time endp
codesg        ends
end start

继续研究。。。
2008-12-3 17:48
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
原来那个程序的问题没看出来,不过后来这个,你恢复向量表时ES不正确。
2008-12-3 18:56
0
雪    币: 214
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恩  ES确实没有保护好
以下是改后的代码 我全贴出来吧, 复制过去,编译下就能运行
我想实现的功能是这样的, 在逐个显示字符期间, 如果有键盘按键。就改变原来的字符颜色。 并用改写int 9 中断的方式去实现。
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
  db 128 dup(0)
stacksg ends
datasg segment
  int9ip dw 0
        int9cs dw 0
datasg ends
codesg        segment
    start:

    mov     ax,datasg
                mov                        ds,ax
    mov     ax,0
    mov     es,ax
                mov     si,0
                mov                        dx,es:[9*4]
    mov        word ptr  int9ip,dx
                mov                        dx,es:[9*4+2]
    mov word ptr        int9cs,dx        ;保存当前的int 9的中断向量
                ;
    mov  word ptr es:[9*4],offset int9
    mov  word ptr es:[9*4+2],cs ;设置int 9中断向量
    push                es
    mov     ax,0b800h
    mov     es,ax
    mov     di,160*12+2*40          ;第13行中间开始
    mov     cx,10
                ;
    mov     al,'a'
    mov     ah,7ch                  ;颜色
    mov     es:[di+1],ah
                ;
    s:
    mov     es:[di],al
    call    time
    inc     al
    loop    s                       ;循环显示

    pop                        es
    mov                        dx,int9ip
                mov        word ptr es:[9*4],dx
                mov                        dx,int9cs
    mov word ptr es:[9*4+2],dx      ;恢复int 9中断向量

    mov     ax,4c00h
    int     21h

;----------------------------------
    int9:                           ;到这里 CS IP 标志寄存器 已经由硬件完成入栈
    mov ah,0fch
    mov byte ptr es:[di+1],ah        ;恢复向量表
    iret
;----------------------------------

    ;用于延时
    time proc

         push   ax
         push   bx
         mov    bx,1000h
         mov    ax,0

         s1:
         sub    ax,1
         sbb    bx,0
         cmp    ax,0
         jne    s1
         cmp    bx,0
         jne    s1
         pop    bx
         pop    ax
         ret
    time endp
codesg        ends
end start

程序运行 和第一次的结果一样, 在显示字符期间按键盘,字符颜色就改变。 但是,程序运行结束   键盘就不能用了,输入不了字符了。
另外,我在time子程序里 S标号的上一句加了 int 9让程序自身产生中断。 运行结果是,字符的颜色改变,键盘能用。 这就奇怪了直接在程序里写int 9和按键触发的int 9应该一样呀 都是是cs ip 寄存器 入栈。iret 恢复。
2008-12-4 09:33
0
雪    币: 214
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
问题 解决了。
三天。
2008-12-4 14:49
0
游客
登录 | 注册 方可回帖
返回
//