汇编网首页登录博客注册
fenglixin70953的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2008-05-03 16:05] 实验16运行弹出错,请指点哪错了

assume cs:code
code segment
start:mov ax,cs
      mov ds,ax
      mov ax,0
      mov es,ax
      mov si,offset setscreen
      mov di,200h
      mov cx,offset setscreenend-offset setscreen
      cld 
      rep movsb
      mov word ptr es:[7ch*4],200h
      mov word ptr es:[7ch*4+2],0
      
      mov ax,202h
      int 7ch
     
      mov ax,4c00h
      int 21h       
         
      
      
  setscreen:jmp short set
      table dw sub1,sub2,sub3,sub4
      set:push bx
      cmp ah,3
      ja sret
      mov bl,ah
      mov bh,0
      add bx,bx
      
      call word ptr table[bx]
  sret:pop bx
  iret

  
  
  
  
  
  sub1:push bx
       push cx
       push es
       mov bx,0b800h
       mov es,bx
       mov bx,0
       mov cx,4000
   sub1s:mov byte ptr es:[bx],' '
       add bx,2
       loop sub1s
       pop es
       pop cx
       pop bx
       ret
       
   sub2:push bx
       push cx
       push es
       mov bx,0b800h
       mov es,bx
       mov bx,1
       mov cx,4000
   sub2s:and byte ptr es:[bx],11111000b
       or es:[bx],al
       add bx,2
       loop sub2s
       pop es
       pop cx
       pop bx
       ret
       
   sub3:push bx
        push cx
        push es
        mov bx,0b800h
        mov es,bx
        mov bx,1
        mov cl,4
        shl al,cl
        mov cx,4000
    sub3s:and byte ptr es:[bx],10001111b
        or es:[bx],al
        add bx,2
        loop sub3s
        pop es
        pop cx
        pop bx
        ret
        
   sub4:push ds
        push cx
        push es
        push si
        push di
        mov si,0b800h
        mov es,si
        mov ds,si
        mov si,160
        mov di,0
        cld
        mov cx,4000
    sub4s:push cx
       mov cx,160
       rep movsb
       pop cx
       loop sub4s
       
       mov cx,80
       mov si,0
     sub4s1:mov byte ptr es:[164*24+si],' '
       add si,2
       loop sub4s1
       pop di
       pop si
       pop es
       pop cx
       pop ds
       ret  
   setscreenend:nop     
    code ends
    end start
评论次数(4)  |  浏览次数(486)  |  类型(作业) |  收藏此文  | 

[  游客   发表于  2008-05-03 18:43  ]

table dw sub1,sub2,sub3,sub4 
-------
定址表应该用偏移距离。因为你的安装程序放到了另外的内存空间,你sbu1代表的地址已经不是初始时给定的地址了。

[  游客   发表于  2008-05-03 18:48  ]

中断例程中的的call自己例程中子程序,应该是用jmp基于偏移变量跳转,而不能单纯的call,因为子程序的地址在加载的时候就形成了,而你又吧这些子程序拷贝放到其他内存空间中,地址已经变了,不再是加载时候形成的地址了,所以,你在call的时候,在新的段空间中,你的地址形成的物理地址就错了,自然找不到你的sub程序,造成错误很正常。
先把这个改了之后,再说吧。

[  游客   发表于  2008-05-04 13:55  ]

谢谢楼上改下面这样可以成功,但用直接定址表如何实现拷贝后子程序中sub标号的定位呢。没想出来。
assume cs:code 
code segment 
start:mov ax,cs 
      mov ds,ax 
      mov ax,0 
      mov es,ax 
      mov si,offset setscreen 
      mov di,200h 
      mov cx,offset setscreenend-offset setscreen 
      cld  
      rep movsb 
      mov word ptr es:[7ch*4],200h 
      mov word ptr es:[7ch*4+2],0 
       
      mov ax,202h 
      int 7ch 
      
      mov ax,4c00h 
      int 21h        
          
       
       
  setscreen:
      set:push bx 
      cmp ah,3 
      ja sret 
      cmp ah,0
      je sub1
      cmp ah,1
      je sub2
      cmp ah,2
      je sub3
      cmp ah,3
      je sub4
  sret:pop bx 
   iret

   
   
   
   
   
  sub1:push bx 
       push cx 
       push es 
       mov bx,0b800h 
       mov es,bx 
       mov bx,0 
       mov cx,4000 
   sub1s:mov byte ptr es:[bx],' ' 
       add bx,2 
       loop sub1s 
       pop es 
       pop cx 
       pop bx 
       jmp short sret
       
        
   sub2:push bx 
       push cx 
       push es 
       mov bx,0b800h 
       mov es,bx 
       mov bx,1 
       mov cx,4000 
   sub2s:and byte ptr es:[bx],11111000b 
       or es:[bx],al 
       add bx,2 
       loop sub2s 
       pop es 
       pop cx 
       pop bx 
       jmp short sret
        
        
   sub3:push bx 
        push cx 
        push es 
        mov bx,0b800h 
        mov es,bx 
        mov bx,1 
        mov cl,4 
        shl al,cl 
        mov cx,4000 
    sub3s:and byte ptr es:[bx],10001111b 
        or es:[bx],al 
        add bx,2 
        loop sub3s 
        pop es 
        pop cx 
        pop bx 
        
      jmp short sret
         
   sub4:push ds 
        push cx 
        push es 
        push si 
        push di 
        mov si,0b800h 
        mov es,si 
        mov ds,si 
        mov si,160 
        mov di,0 
        cld 
        mov cx,4000 
    sub4s:push cx 
       mov cx,160 
       rep movsb 
       pop cx 
       loop sub4s 
        
       mov cx,80 
       mov si,0 
     sub4s1:mov byte ptr es:[164*24+si],' ' 
       add si,2 
       loop sub4s1 
       pop di 
       pop si 
       pop es 
       pop cx 
       pop ds 
       jmp near ptr sret  
   setscreenend:nop      
    code ends 
    end start

[  fenglixin70953   发表于  2008-05-06 18:41  ]

看了论坛的贴子,终于会了
assume cs:code
code segment
    
         
      
      
  setscreen:jmp short set
      dw sub1,sub2,sub3,sub4
      set:push bx
      push dx
      cmp ah,3
      ja sret
      mov bl,ah
      mov bh,0
      add bx,bx
      
      mov dx,cs:[bx+202h]
      add dx,200h
      call dx
  sret:pop dx
      pop bx
      iret

  
  
  
  
  
  sub1:push bx
       push cx
       push es
       mov bx,0b800h
       mov es,bx
       mov bx,0
       mov cx,4000
   sub1s:mov byte ptr es:[bx],' '
       add bx,2
       loop sub1s
       pop es
       pop cx
       pop bx
       ret
       
   sub2:push bx
       push cx
       push es
       mov bx,0b800h
       mov es,bx
       mov bx,1
       mov cx,4000
   sub2s:and byte ptr es:[bx],11111000b
       or es:[bx],al
       add bx,2
       loop sub2s
       pop es
       pop cx
       pop bx
       ret
       
   sub3:push bx
        push cx
        push es
        mov bx,0b800h
        mov es,bx
        mov bx,1
        mov cl,4
        shl al,cl
        mov cx,4000
    sub3s:and byte ptr es:[bx],10001111b
        or es:[bx],al
        add bx,2
        loop sub3s
        pop es
        pop cx
        pop bx
        ret
        
   sub4:push ds
        push cx
        push es
        push si
        push di
        mov si,0b800h
        mov es,si
        mov ds,si
        mov si,160
        mov di,0
        cld
        mov cx,4000
    sub4s:push cx
       mov cx,160
       rep movsb
       pop cx
       loop sub4s
       
       mov cx,80
       mov si,0
     sub4s1:mov byte ptr es:[164*24+si],' '
       add si,2
       loop sub4s1
       pop di
       pop si
       pop es
       pop cx
       pop ds
       ret  
   setscreenend:nop 
   
   start:mov ax,cs
      mov ds,ax
      mov ax,0
      mov es,ax
      mov si,0
      mov di,200h
      mov cx,offset setscreenend-offset setscreen
      cld 
      rep movsb
      mov word ptr es:[7ch*4],200h
      mov word ptr es:[7ch*4+2],0
      
      mov ax,202h
      int 7ch
     
      mov ax,4c00h
      int 21h      
    code ends
    end start

 
 请输入验证码  (提示:点击验证码输入框,以获取验证码