. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  总是出现“遇到无效指令“错误,不知道是什么原因?  [已解决] 回复[ 6次 ]   点击[ 632次 ]  
question36
[帖 主]   [ 发表时间:2008-03-24 16:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
assume cs:code
stack segment
db  128 dup (0)
stack ends
code segment
    start: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
          mov cx,offset allend-offset int7ch
          cld
          rep movsb
          push es:[36]
          push es:[38]
          pop  es:[202H]
          pop  es:[200H]
          cli
          mov  word ptr es:[36],204h;调试到此总是有问题?
          mov  word ptr es:[38],0H
          sti
          mov ax,4c00h
          int 21h
  int7ch: jmp short int7chcode
          table:dw cls,setcolor,setbkcolor,scroll
int7chcode:push bx
           pushf
           call dword ptr cs:[200H]
           cmp ah,3
           ja  int7chend
           mov bl,ah
           mov bh,0
           add bx,bx
           call word ptr table[bx]
 int7chend:pop bx
           iret
      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        
code ends
 end start
ppt
[第1楼]   [ 回复时间:2008-03-24 22:27 ]   [引用]   [回复]   [ top ] 
荣誉值:56
信誉值:0
注册日期:2007-09-23 18:23
我的建议是直接用g命令运行到程序退出前.这样不会出现无效指令的问题.
至少 
         cli 
        mov  word ptr es:[36],204h;调试到此总是有问题? 
         mov  word ptr es:[38],0H 
        sti 
这四行要一次执行完.
具体原因贴主先自己想想吧.
wdm
[第2楼]   [ 回复时间:2008-03-25 09:38 ]   [引用]   [回复]   [ top ] 
荣誉值:342
信誉值:0
注册日期:2007-12-06 10:21
恍然大悟啊!昨天看了半个小时也没看出原因来!ppt一言警醒梦中人啊!!
突然更加肯定做检测点的重要性了!!
楼主如果还没有思路,回头看一下P271页的检测点15.1的第二个问题吧。保证是醍醐灌顶啊!!
PS:《汇编语言》一书中到处都是金子啊~~赶紧抓吧!!
question36
[第3楼]   [ 回复时间:2008-03-26 12:16 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
谢谢,不过问题还是存在阿。
question36
[第4楼]   [ 回复时间:2008-03-26 12:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
明白了, debug 中利用了单步中断内中断与键盘外中断与显示功能中断
         debug 中应该有sti的指令以使得debug能响应键盘外中断
         于是上面的 
        mov  word ptr es:[36],204h;调试到此总是有问题? 键盘中断向量地址 
         mov  word ptr es:[38],0H  
       指令没有一起执行,就会出现问题。
younggay
[第5楼]   [ 回复时间:2008-03-26 13:32 ]   [引用]   [回复]   [ top ] 
荣誉值:273
信誉值:0
注册日期:2008-01-23 20:23
恩。在你设置中断向量的过程中中断,那么你再按键的话就会执行一个位置的程序段了。出错就在所难免啊。
wdm说的那个检测点的题目,就点明了这个错误。做题不仅仅为了做题,出题的人果真是高手。
question36
[第6楼]   [ 回复时间:2008-03-28 18:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:6
注册日期:2008-03-19 23:11
此贴由 贴主 于 [ 2008-03-28 18:39 ] 结贴。 结贴原因:问题已解决
得分情况: 1楼(ppt):4分   2楼(wdm):3分   5楼(younggay):3分  
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved