|
主题 : : 关于“总是出现“遇到无效指令“错误,不知道是什么原因?“的提问 [已解决] |
回复[ 8次 ]
点击[ 478次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-03-26 12:43 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
由于ppt提供的建议,我重新利用断点试了一下g cs:0042(在我的内存中为mov ax,4c00H的地址,即结束地址)
可是错误依然存在。然后我又在纯dos中调试,给出以下错误信息:an internal stack overflow has caused this session to be halted
change the stacks setting in your config.sys file .and then try again.
可是我不知道config.sys 在哪儿,也不知道怎么改?
寻找其他的解决方案。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-03-26 13:36 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
你的帖子看了,是你在设置中断向量的时候,一定要保证之间不能出现中断,否则就会出现不定的错误。你的帖子中已经有答案了。呵呵 | | |
|
|
|
|
[第2楼]
[ 回复时间:2008-03-26 14:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
呵呵,可是问题就在于我在debug 中g cs:0042就应该已经屏蔽掉了中断的出现问题,即保证了两条中断向量的同时执行,但是问题依然存在。? | | |
|
|
|
|
[第3楼]
[ 回复时间:2008-03-27 11:14 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
|
|
|
|
|
[第4楼]
[ 回复时间:2008-03-27 11:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23 |
首先,你修改的是int 9h键盘中断的向量表,所以,T单步跟踪的时候,在设置向量表的时候中断,再按键调用的int9h中断例程必然错误的。楼主可以将你的中断做成int 7ch的,去修改相应的中断向量表,这个时候你在T单步跟踪就不会出错了。
其次,真的不知道楼主是想做int9还是int7ch?代码表现出了两个意向。呵呵。不过,根本上确实是修改的int 9的向量表。
建议楼主先做一下int 7ch的体会一下吧。 | | |
|
|
|
|
[第5楼]
[ 回复时间:2008-03-27 11:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
安装并没有问题,但是中断中出现了问题,不过现在已经解决,谢谢了。解决方法在
http://www.asmedu.net/bbs/pasteinfo.jsp?
part=1&level=book&kind=1219&qkSg=2&qID=1502&readSg=1
中。主要错误是call word ptr table[bx]造成的。
因为此指令将CS:[bx+table]中的内容直接修改ip
然而在中断中ip指向了204H并不是零,所以table[bx]并没有指向table 所在的地址,需要加上一个
idata,call word ptr table[bx+idata];idata需要自己算出,
还有在table表中:table dw cls,setcolor,setbkcolor,scroll
table中存放的仅仅是原程序中的标号的偏移地址,是相对于start标号的,并不是相对于int7ch标号的,
所以也要加上idata
table dw cls+iata,setcolor+iata,setbkcolor+iata,scroll+iata | | |
|
|
|
|
[第6楼]
[ 回复时间:2008-03-27 11:44 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
修改例:
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:jmp near ptr programstart
int7ch: jmp short int7chcode
table dw cls+201H, setcolor+201H, setbkcolor+201H, scroll+201H
int7chcode:push bx
push ax
;pushf
;in al,60H
;cmp al,1H
;je reoper
;call dword ptr cs:[200H]
cmp ah,3
ja int7chend
mov bl,ah;ah
mov bh,0
add bx,bx
pop ax
call word ptr table[bx+201H];修改ip的方式不同,造成的。
int7chend:pop bx
iret
reoper:mov ax,4c00H
int 21H
cls:push ax
push es
push di
push cx
mov ax,0b800h
mov es,ax
mov di,0
mov cx,2000
loopcls:mov byte ptr es:[di],' '
inc di
inc di
loop loopcls
pop cx
pop di
pop es
pop ax
ret
setcolor:push es
push di
push cx
push ax
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
pop ax
loopsetc:and byte ptr es:[di],11111000B
or byte ptr es:[di],al
add di,2
loop loopsetc
pop cx
pop di
pop es
ret
setbkcolor:push es
push di
push cx
push ax
mov ax,0b800h
mov es,ax
mov di,1
mov cx,2000
pop ax
shl al,1
shl al,1
shl al,1
shl al,1
loopsetbkc:and byte ptr es:[di],10001111B
or byte ptr es:[di],al
add di,2
loop loopsetbkc
pop cx
pop di
pop es
ret
scroll:push ax
push es
push di
push ds
push si
mov ax,0b800h
mov es,ax
mov ds,ax
mov di,0
mov si,160
mov cx,24
loopscroll:push cx
mov cx,160
cld
rep movsb
pop cx
loop loopscroll
mov cx,80
mov si,0
scrolllast:mov byte ptr [160*24+si],' '
add si,2
loop scrolllast
pop si
pop ds
pop di
pop es
pop ax
ret
allend:nop
programstart : mov ax,stack
mov ss,ax
mov sp,128
mov ax,code
mov ds,ax
mov si,offset int7ch
mov ax,0
mov es,ax
mov di,204H
cld
mov cx,offset allend-offset int7ch
rep movsb
push es:[7ch*4]
pop es:[200H]
push es:[7cH*4+2]
pop es:[202H]
cli
mov word ptr es:[7ch*4],200h;
mov word ptr es:[7ch*4+2],0H
sti
mov al,2
mov ah,1
call delay
call delay
int 7ch
call delay
call delay
call delay
call delay
mov al,5
mov ah,2
call delay
call delay
int 7ch
call delay
call delay
call delay
call delay
mov al,2
mov ah,3
call delay
call delay
int 7ch
call delay
call delay
call delay
call delay
mov al,2
mov ah,0
call delay
call delay
int 7ch
call delay
call delay
call delay
call delay
mov ax,4c00h
int 21h
delay:push ax
push dx
mov dx,1000h
mov ax,0
s1:sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
code ends
end start | | |
|
|
|
|
[第7楼]
[ 回复时间:2008-03-27 22:22 ]
[引用]
[回复]
[ top ] | |
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21 |
table dw cls+iata,setcolor+iata,setbkcolor+iata,scroll+iata
=============
table中的数据应该使用相对偏移量,比如说cls-int 7ch。这样,安装程序在运行的时候就会得到正确的地址了。不应该是什么手动计算。 | | |
|
|
|
|
[第8楼]
[ 回复时间:2008-03-28 18:42 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11 |
此贴由 贴主 于 [ 2008-03-28 18:42 ] 结贴。 结贴原因:问题已解决 | | |
|