实验16,看上去和书上16.4的setscreen一样,其实有一个大陷阱。;任务:一个新的int 7ch中断例程,为显示输出提供子程序
;参数: (ah) 功能号:0清屏,1设前景色,2设背景色,3上滚一行
; (al) 颜色值,0~7
assume cs:code , ds:data , ss:stack
code segment
strat:
;1.安装到内存ds:si -> es:di
;2.改向量表
;3.结束安装程序
mov ax,4c00h
int 21h
;----7ch中断例程 ----
setscreen:
jmp short main
;直接定址表
table dw sub1,sub2,sub3,sub4
main:
;用表中数据调用子程序
call word ptr table[bx]
mainiret:
sub1:
sub1s:
sub1ret:
sub2:
sub2s:
sub2ret:
sub3:
sub3s:
sub3ret:
sub4:
sub4s:
sub4ret:
setscreenend:nop
;----7ch中断例程 iret----
code ends
end start
问题就在table dw sub1,sub2,sub3,sub4 , call word ptr table[bx]这两句。在安装程序运行时,sub和table都是指在安装程序中的偏移!!!
要解决这问题,可以把程序结构改变一下,
1.将中断的代码放到start前,那么在cs段中,table ,sub 就是从0开始的偏移
2.在向量表中,让ip也从0开始,即20h:0,不用0:200h |