. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->外中断
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  修改向量表0000:9*8的时候为什么报错呢?  [待解决] 回复[ 10次 ]   点击[ 921次 ]  
drier
[帖 主]   [ 发表时间:2007-10-05 18:12 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38
assume cs:code
code segment
start:                  mov ax,cs
                        mov ds,ax
                        mov si,offset newInt0
                        mov ax,0
                        mov es,ax
                        mov di,200h
                        mov cx,offset int0ending-offset newInt0
                        rep movsb
                        mov es:[9*4],200h
                        mov es:[9*4+2],0         ------->运行到这里的时候的时CS:IP报错
                        int 9
                        mov ax,4c00h
                        int 21h
newInt0:                push ax
                        push es
                        push bp
                        OriginalINTAddress: db 0,0,0,0
                        mov si,offset OriginalINTAddress
                        mov ax,0
                        mov es,ax
                        push es:[9*4]
                        pop cs:[si]
                        push es:[9*4+2]
                        pop cs:[si+2]
start0:                 pushf
                        call dword ptr cs:[si]
                        in al,60h
                        cmp al,1
                        jz buffer
                        pop bp
                        pop es
                        pop ax                        
                        iret
buffer:                 mov ax,0b800h
                        mov es,ax
                        mov bp,178*21
                        mov es:[bp],'!'
                        pop bp
                        pop es
                        pop ax
                        iret
                        
int0ending:nop
code ends
end start
drier
[第1楼]   [ 回复时间:2007-10-05 18:13 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38
写了几个代码都有这个问题不知道怎么了。
sunshine
[第2楼]   [ 回复时间:2007-10-06 15:45 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
你的错误 就是没有给定数据要放的空间大小
mov es:[9*4+2],0 ---> mov word ptr es:[9*4+2],0
sunshine
[第3楼]   [ 回复时间:2007-10-06 15:45 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
每次出现错误的把错误信息贴出来,这样一看就知道什么错误了
drier
[第4楼]   [ 回复时间:2007-10-06 23:41 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38
9号向量修改报错并不是数据长度的问题啊,数据长度默认是一个字。而且其他程序就没问题,为什么这个就有问题呢?
sunshine
[第5楼]   [ 回复时间:2007-10-07 13:16 ]   [引用]   [回复]   [ top ] 
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10
mov es:[9*4],200h 
 mov es:[9*4+2],0  
你先把这两个地方该了,增加word ptr 看看还有什么错误
drier
[第6楼]   [ 回复时间:2007-10-07 16:33 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38
试过了,还有错误。
cxn
[第7楼]   [ 回复时间:2007-10-08 17:09 ]   [引用]   [回复]   [ top ] 
荣誉值:179
信誉值:6
注册日期:2007-07-09 19:18
在debug中肯定会有错误的没有错误就不正常了.
想想int9中断被改了如果此时按键程序执行到哪?
这种程序要用g命令一次吧
mov es:[9*4],200h 
mov es:[9*4+2],0
都执行完这样才行.
通常改变int9中断的程序很难跟踪出了错误就直接检查程序错误,直到改得没有错误.
楼主的程序逻辑还是有问题.再改改吧.
drier
[第8楼]   [ 回复时间:2007-10-08 17:12 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38
多谢cxn的指点!^^
dallas48
[第9楼]   [ 回复时间:2011-06-27 09:50 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:2
注册日期:2011-01-06 10:33
mov cx,offset int0ending-offset newInt0 
rep movsb 


前面也少了 cld

正向传输
wjb0001
[第10楼]   [ 回复时间:2012-03-07 20:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-07-20 08:57
assume cs:code 
code segment 
start:                  mov ax,cs 
                        mov ds,ax 
                        mov si,offset newInt0 
                        mov ax,0 
                        mov es,ax 
                        mov di,200h 
                        mov cx,offset int0ending-offset newInt0 
                        rep movsb 
                        mov es:[9*4],200h 
                        mov es:[9*4+2],0        ;前面得有word ptr ------->运行到这里的时候的时CS:IP报错 
                        int 9 
                        mov ax,4c00h 
                        int 21h 
newInt0:                push ax 
                        push es 
                        push bp ;这里是程序的代码段,下面的赋值语句可能不能执行吧
                                     ; 在这里加条jmp sss
                        OriginalINTAddress: db 0,0,0,0 
             sss:           mov si,offset OriginalINTAddress 
                        mov ax,0 
                        mov es,ax 
                        push es:[9*4]   ;你这里的es:[9*4 ]是 200
                        pop cs:[si]     ;
                        push es:[9*4+2] ;  这个是  0
                        pop cs:[si+2]   ; 这里的4句代码应该在报错的代码之前
start0:                 pushf 
                        call dword ptr cs:[si] 
                        in al,60h 
                        cmp al,1 
                        jz buffer 
                        pop bp 
                        pop es 
                        pop ax                         
                        iret 
buffer:                 mov ax,0b800h 
                        mov es,ax 
                        mov bp,178*21 
                        mov es:[bp],'!' 
                        pop bp 
                        pop es 
                        pop ax 
                        iret 
                         
int0ending:nop 
code ends 
end start
你的程序是逻辑错误 看看书上的程序怎么写的吧。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved