|
主题 : : 修改向量表0000:9*8的时候为什么报错呢? [待解决] |
回复[ 10次 ]
点击[ 921次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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 | | |
|
|
|
|
[第1楼]
[ 回复时间:2007-10-05 18:13 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38 |
|
|
|
|
|
[第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 | | |
|
|
|
|
[第3楼]
[ 回复时间:2007-10-06 15:45 ]
[引用]
[回复]
[ top ] | |
荣誉值:106
信誉值:0
注册日期:2007-06-26 15:10 |
每次出现错误的把错误信息贴出来,这样一看就知道什么错误了 | | |
|
|
|
|
[第4楼]
[ 回复时间:2007-10-06 23:41 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38 |
9号向量修改报错并不是数据长度的问题啊,数据长度默认是一个字。而且其他程序就没问题,为什么这个就有问题呢? | | |
|
|
|
|
[第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 看看还有什么错误 | | |
|
|
|
|
[第6楼]
[ 回复时间:2007-10-07 16:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38 |
|
|
|
|
|
[第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中断的程序很难跟踪出了错误就直接检查程序错误,直到改得没有错误.
楼主的程序逻辑还是有问题.再改改吧. | | |
|
|
|
|
[第8楼]
[ 回复时间:2007-10-08 17:12 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:0
注册日期:2007-09-01 15:38 |
|
|
|
|
|
[第9楼]
[ 回复时间:2011-06-27 09:50 ]
[引用]
[回复]
[ top ] | |
荣誉值:4
信誉值:2
注册日期:2011-01-06 10:33 |
mov cx,offset int0ending-offset newInt0
rep movsb
前面也少了 cld
正向传输 | | |
|
|
|
|
[第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
你的程序是逻辑错误 看看书上的程序怎么写的吧。 | | |