. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  关于“总是出现“遇到无效指令“错误,不知道是什么原因?“的提问  [已解决] 回复[ 8次 ]   点击[ 478次 ]  
question36
[帖 主]   [ 发表时间: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 在哪儿,也不知道怎么改?
寻找其他的解决方案。
younggay
[第1楼]   [ 回复时间:2008-03-26 13:36 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
你的帖子看了,是你在设置中断向量的时候,一定要保证之间不能出现中断,否则就会出现不定的错误。你的帖子中已经有答案了。呵呵
question36
[第2楼]   [ 回复时间:2008-03-26 14:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
呵呵,可是问题就在于我在debug 中g cs:0042就应该已经屏蔽掉了中断的出现问题,即保证了两条中断向量的同时执行,但是问题依然存在。?
younggay
[第3楼]   [ 回复时间:2008-03-27 11:14 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
http://www.asmedu.net/bbs/pasteinfo.jsp?part=1&level=book&kind=1017&qkSg=2&qID=13244&readSg=1
楼主不是在这个帖子中已经明白了T单步中断时会造成的问题了么?
楼主直接运行程序也会出错么?我直接运行了楼主的程序,安装没有发现问题。
younggay
[第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的体会一下吧。
question36
[第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
question36
[第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
wdm
[第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。这样,安装程序在运行的时候就会得到正确的地址了。不应该是什么手动计算。
question36
[第8楼]   [ 回复时间:2008-03-28 18:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
此贴由 贴主 于 [ 2008-03-28 18:42 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(younggay):2分   4楼(younggay):5分   7楼(wdm):7分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved