求解实验16为何会出现这样的结果
assume cs:codecode 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到别的地址,求解为什么会出现这样的结果? 自己也调试了很久,
突然发现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]