. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  调了一天我晕,帮我看看  [待解决] 回复[ 1次 ]   点击[ 419次 ]  
huangdilei
[帖 主]   [ 发表时间:2008-08-05 23:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-07-30 14:36
;测试int 9h中断

;其实我就是想看了书以后自己想写个小东西
;自定义int9 输出一个'h'


data segment
        str dw 1,1 
data ends

code segment

        assume cs:code
        
start:
        
        
        mov ax,cs
        
        ;-------------------传送0000:200h------------------
        mov ds,ax
        ;源
        mov si,offset mycode
        ;目的
        mov ax,0
        mov es,ax
        mov di,200h
        
        mov cx,offset mycodeEnd - offset mycode
        cld
        rep movsb
        ;------------------传送结束---------------
        
        
        
        ;------------------保存源int 9h地址---------------
        mov ax,data
        mov ds,ax
        mov ax,es:[9*4]                ;偏移;0045h
        mov ds:[0],ax
        mov ax,es:[9*4+2]        ;段;1824h
        mov ds:[2],ax
        ;------------------保存结束---------------


        ;----------设置自定义中断向量int 9地址---------------
        mov word ptr es:[9*4],200h
        mov word ptr es:[9*4+2],0000h
        ;----------设置自定义中断向量int 9地址结束-----------
        
        
        mov ah,01h
        int 21h        
        
        mov ax,4c00h
        int 21h
        
mycode:
        push ax
        push bx
        push es
        mov dl,'h'
        
        mov ah,02h
        
        int 21h
        
        ;模拟int 9h
        pushf
        pushf
        pop bx
        and bh,11111100b
        push bx
        popf
        
        ;在这里执行调用时候是个错误的地址,我郁闷了
        ;程序里上面的程序我调试了N久也没发现什么问题,
        ;说实在话真的不好调试,只要一出错和死机了没区别
        call dword ptr ds:[0]  
        
        pop es
        pop bx
        pop ax
        
        iret
                
mycodeEnd:nop


code ends
end start
starrynight
[第1楼]   [ 回复时间:2008-08-08 14:51 ]   [引用]   [回复]   [ top ] 
荣誉值:98
信誉值:2
注册日期:2007-10-09 18:23
;------------------保存源int 9h地址--------------- 
    mov ax,20 
    mov ds,ax 
    mov ax,es:[9*4]        ;偏移;0045h 
    mov ds:[0],ax 
    mov ax,es:[9*4+2]    ;段;1824h 
    mov ds:[2],ax 
    ;------------------保存结束--------------- 
to楼主:
你把int 9 的原来的中断向量保存在了安装程序所被加载的内存段中,并在安装的中断例程中用“call dword ptr ds:[0]”,意在获得原来的中断向量,依据它调用原来的中断例程,会正确的实现吗?
call dword ptr ds:[0] 执行时的 ds:[0] 所指向的内容还是我们保存在 所谓的 数据段 data 处的两个字单元地址数据吗? 仔细想想想。
程序执行过程中系统中内存空间和各个寄存器是什么样的状态,而当程序返回后,回到上一级环境,再触发中断时,系统中内存空间和各个寄存器又是什么样的状态?理清思路,我想,功能一定能够实现的。呵呵,想一想,我们把原来的中断向量保存在哪里最安全,最容易访问到,进而正确执行中断程序。

    ;----------设置自定义中断向量int 9地址--------------- 
    mov word ptr es:[9*4],200h 
    mov word ptr es:[9*4+2],0000h 
    ;----------设置自定义中断向量int 9地址结束----------- 
这里最好置一下标志寄存器的中断屏蔽位,避免在执行此处时发生相关中断,产生异常。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved