lll714775117 发表于 2015-6-20 08:51:07

求解实验16为何会出现这样的结果

assume cs:code

code segment

start:mov ax,0
                mov es,ax
                mov di,200h
                mov ax,cs
                mov ds,ax
                mov si,offset int7ch
                mov cx,offset int7chend - offset int7ch
                cld
                rep movsb
               
                mov word ptr es:,200h
                mov word ptr es:,0
               
                mov ax,4c00h
                int 21h

int7ch:
      jmp istart
table   dw do1,do2,do3,do4

istart: push ax
      push bx
                push dx
               
                mov bl,ah
                mov bh,0
                cmp bl,3
                ja bye                              ;提取BH中的功能号,并进行比对是否大于3,大于则跳出
                mov ah,0
                push ax
                pop dx
                add bx,bx
               
                call word ptr table             ;跳转到相应功能对应的偏移地址
               
bye:    pop dx
                pop bx
                pop ax
                iret
               
do1:    push ax
      push cx
      push es
                push di
      
            mov ax,0b800h
                mov es,ax
                mov di,0
                mov cx,2000
               
do1s:        mov byte ptr es:,' '
                add di,2
                loop do1s                           ;清屏
               
                pop di
                pop es
                pop cx
                pop ax
                ret

do2:    push ax
      push cx
                push es
                push di
               

      mov ax,0b800h
      mov es,ax
                mov di,1
                mov cx,2000
               
do2s:        and byte ptr es:,11111000b            ;先将前景色置0,再修改前景色
                or es:,dl
                add di,2
                loop do2s                                 ;修改前景色
               
                pop di
                pop es
                pop cx
                pop ax
                ret
               
do3:    push ax
      push cx
                push es
                push di
                push dx
               
                mov ax,0b800h
                mov es,ax
                mov di,1
                mov cx,4
                shl dl,cl
                mov cx,2000
               
do3s:   and byte ptr es:,10001111b
      or es:,dl
                add di,2
                loop do3s                                 ;设置背景色
               
                pop dx
                pop di
                pop es
                pop cx
                pop ax
                ret
               
do4:    push ax
                push cx
                push es
                push di
                push ds
                push si
               
                mov ax,0b800h
                mov es,ax
                mov ds,ax
                mov si,160
                mov di,0
                cld
            mov cx,24
s0:                push cx
                mov cx,160
      rep movsb
                pop cx
                loop s0
               
                mov cx,80
s1:                mov byte ptr ,' '
                add si,2
                loop s1
               
                pop si
                pop ds
                pop di
                pop es
                pop cx
                pop ax                                     ;向上滚动一行
               
int7chend:
      nop

code ends

end start

在新的INT7ch中断中,call会call到别的地址,求解为什么会出现这样的结果?

nirvana436 发表于 2016-2-4 14:06:05

自己也调试了很久,
突然发现table的地址竟然是安装程序中的偏移地址,
而非中断例程中的偏移地址。
table dw do0,do1,do2,do3中的table应当是从中断例程的20:2开始,
因为jmp占了0、1两个单元,
我自己写的安装程序中table的地址正是从2c开始的,
call word ptr table命令,
当bx=0的时候,
一直是跑到cs:的位置,即0:2c,
这就是错误的原因。
感觉也没法通过更改偏移地址来完善。
所以说,当使用直接定址表的时候,
中断例程一定要放在安装程序的最前面。
怪不得书中的例子怎么调试都会出错,呵呵。
页: [1]
查看完整版本: 求解实验16为何会出现这样的结果