. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->直接定址表
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验16中复制安装中断例程后,无法正确定位调用子程序的原因。请看中间的一段注释  [已解决] 回复[ 2次 ]   点击[ 280次 ]  
g3109
[帖 主]   [ 发表时间:2010-10-29 21:07 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38
;*mov word ptr es:[7ch*4],0;;;;;;;;;;;;;;;;;;;;
;*mov word ptr es:[7ch*4+2],20h
assume cs:code,ds:data

data segment
    str1 db 'loveChina','$'
    str2 db '2love','$'
data ends

code segment
   
    set_screen: jmp set
          table dw sub1+200h,sub2+200h,sub3+200h,sub4+200h;
            ;table dw sub1,sub2,sub3,sub4;
          set: push bx
               cmp ah,3
               ja set_end              
               mov bl,ah
               mov bh,0
               add bx,bx
               ;*编译器是将编译后的指令复制安装到0:200处,故一些偏移地址是照搬不动地复制过去
           ;*假设table dw sub1+200h这里没有加200h,编译安装后table处的值是该代码段中sub1的偏移地址
           ;*并非复制安装后的sub1的偏移地址,因为该代码段的set_screen的偏移地址为0,而复制安装后的set_screen的
           ;*偏移地址为200h故table处定值表中每个子程序入口地址都应加200h
           ;*故安装后的table处的值应该为sub1+200h,sub2+200h,sub3+200h,sub4+200h;
               ;*同理,call word ptr table[bx+200h]如果仅是table[bx]的话,那么执行call指令则会使IP=cs:[bx]
           ;*复制安装后的中断例程起始地址为200h,即table定址表中的子程序入口地址比原来多了200h,故call时应加多200h
                 call word ptr table[bx+200h]
          set_end: 
                   pop bx
                   iret

    sub1: push ax
          push es
          push si
          push cx
          mov ax,0b800h
          mov es,ax
          mov si,0
          mov cx,2000

    sub1s: mov es:[si],' '
           add si,2
           loop sub1s
           pop cx
           pop si
           pop es
           pop ax
           ret

   sub2: push ax
         push bx
         push es
         push si
         mov bx,0b800h
         mov es,bx
         mov cx,2000
         mov si,1
   sub2s: and byte ptr es:[si],11111000b
          or es:[si],al
          add si,2
          loop sub2s
          pop si
          pop es
          pop bx
          pop ax
          ret

  sub3:  push bx
         push ax
         push es
         push si
         push cx
         mov bx,0b800h
         mov es,bx
         mov si,1
         mov cl,4
         shl al,cl
         mov cx,2000
         
  sub3s: and byte ptr es:[si],10001111b
         or es:[si],al
         add si,2
         loop sub3s
         pop cx
         pop si
         pop es
         pop ax
         pop bx
         ret 

   sub4: push cx
         push es
         push si
         push ds
         push ax
         mov ax,0b800h
         mov ds,ax
         mov si,160
         mov es,ax
         mov di,0
         mov cx,24*160
         cld
         rep movsb
         mov cx,80
  clr24: mov es:[di],' '
         add di,2
         loop clr24
         pop ax
         pop ds
         pop si
         pop es
         pop cx
         ret
    set_nop:nop
    
    
     start:            
           mov ax,cs
           mov ds,ax
           mov si,offset set_screen
           mov ax,0
           mov es,ax
           mov di,200h
           mov cx,offset set_nop - offset set_screen
           cld
           rep movsb
           cli
           ;mov word ptr es:[7ch*4],0;;;;;;;;;;;;;;;;;;;;
           ;mov word ptr es:[7ch*4+2],20h;;;;;;;;;;
             mov word ptr es:[7ch*4],200h;;;;;;;;;;;;;;;;;;;;
           mov word ptr es:[7ch*4+2],0;;;;;;;;;;
           sti
        mov ax,set_screen;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
           mov ax,data
           mov ds,ax
           lea dx, str1 ;;;;;
           mov ah,9
           int 21h;显示第一个字符串
           mov ah,02
           mov bh,0
           mov dh,1
           mov dl,0
           int 10h;光标移至第二行
           mov ax,data
           mov ds,ax
           lea dx,str2 ;;;;;
           mov ah,9
           int 21h

           mov ah,2
           mov al,100b
           int 7ch
           
           
           mov ax,4c00h
           int 21h

code ends
end start
g3109
[第1楼]   [ 回复时间:2010-10-30 22:13 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38
.........   ;*编译器是将编译后的指令复制安装到0:200处,故一些偏移地址是照搬不动地复制过去 
           ;*假设table dw sub1+200h这里没有加200h,编译安装后table处的值是该代码段中sub1的偏移地址 
           ;*并非复制安装后的sub1的偏移地址,因为该代码段的set_screen的偏移地址为0,而复制安装后的set_screen的 
           ;*偏移地址为200h故table处定值表中每个子程序入口地址都应加200h 
           ;*故安装后的table处的值应该为sub1+200h,sub2+200h,sub3+200h,sub4+200h; 
               ;*同理,call word ptr table[bx+200h]如果仅是table[bx]的话,那么执行call指令则会使IP=cs:[bx] 
           ;*复制安装后的中断例程起始地址为200h,即table定址表中的子程序入口地址比原来多了200h,故call时应加多200h 
                 call word ptr table[bx+200h]
g3109
[第2楼]   [ 回复时间:2010-10-30 22:13 ]   [引用]   [回复]   [ top ] 
荣誉值:4
信誉值:0
注册日期:2010-09-24 16:38
此贴由 贴主 于 [ 2010-10-30 22:13 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved