王爽老师汇编语言中实验十五的一个问题

assume cs:code

stack segment

db 128 dup (0)

stack ends

code segment

start: mov ax,stack

mov ss,ax

mov sp,128

push cs

pop ds

mov ax,0

mov es,ax

mov si,offset int9 ;设置ds:si指向源地址

mov di,204h ;设置es:di指向目标地址

mov cx,offset int9end-offset int9 ;设置cx为传输长度

cld ;设置传输方向为正

rep movsb

;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中

push es:[9*4]

pop es:[200h]

push es:[9*4+2]

pop es:[202h]

;在中断向量表中设置新的int 9中断例程的入口地址

cli ;设置IF=0屏蔽中断

mov word ptr es:[9*4],204h

mov word ptr es:[9*4+2],0

sti ;设置IF=1不屏蔽中断

;结束

mov ax,4c00h

int 21h

;新的int 9中断例程

int9: push ax

push bx

push cx

push es

in al,60h ;从端口60h读出键盘输入

;对int指令进行模拟,调用原来的int 9中断例程

pushf ;标志寄存器入栈

call dword ptr cs:[200h] ;CS,IP入栈,(IP)=cs:[200h],(CS)=0

;如果是A断码,改变当前屏幕的显示字符

cmp al,9eh ;和A的断码(1eh+80h)比较

jne int9ret ;不等于A时转移

mov ax,0b800h

mov es,ax

mov bx,0

mov cx,2000

s: mov byte ptr es:[bx],41h ;将A的ASCII码写入,改变字符

add bx,2

loop s

int9ret:pop es

pop cx

pop bx

pop ax

iret

int9end:nop

code ends

end start

上面安装新的int 9中断例程的代码中,为什么要 call dword ptr cs:[200h],为什么要是CS:[200h]呢?我用debug看过cs:[200h]所对应的数据是00 00 00 00 00 00 00。。。。因此,它应该跳转到0:0的地址中执行除法溢出的中断例程啊,为什么解释是只把(CS)=0呢??
求解啊

其实可以不 call dword ptr cs:[200]的,对本程序而言并无影响,原 int 9中断还要完成一些硬件上的东西,为了简单,新的int 9中断直接调用了原中断,还新增了新的功能,但在此处不调用原中断也无影响;
你运行此程序后,在debug下应该用0:[200]看对应的数据,因为cs此时可能是默认的其他值。cs:[200h]是新中断程序运行时要用到的,那时的cs才是0。
不行的话,就是安装程序有问题。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-11
显示指定段地址
相似回答