检测点13.1
(1)用7ch中断例程实现loop功能中所能进行的最大转移位移是多少?
例子中进行的是段内近转移,我们明白它的机理之后可以发现:
既然能用栈来修改IP,那当然可以用栈来修改CS,于是当仅修改IP时,最大位移是[-32768~32767]进行段内近转移;当同时修改CS和IP时,进行段间远转移。
(2)用7ch中断例程完成jmp short ptr s指令的功能。
如果不知道此指令功能,请参考转移指令的原理一节;
应用的代码,王老师已经写好了,我们只需要写一下实现此指令功能的中断例程即可。与loop指令的中断例程相似,只需要设置一下IP即可,如下:
jnp:
push bp
mov bp,sp
add [bp+2],bx
pop bp
iret
检测点13.2
(1)我觉得错误,如果CPU不去执行BIOS中得硬件系统检测和初始化程序,操作系统就无法取得控制权。
(2)我觉得错误,int 19h是在OS控制计算机之前就要调用的,DOS不可以提供。
实验13 编写、应用中断例程
(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
以下,为我的代码:
assume cs:code
code segment
"""
安装ch程序
"""
mov ax,cs
mov ds,ax
mov si,offset in7c ;源地址
mov ax,0
mov es,ax
mov di,200h ;目的地址
cld ;正方向
mov cx,offset in7cend-offset in7c
;长度
rep movsb ;开始传送
mov ax,0
mov es,ax
mov word ptr es:[4*7ch],200h
mov word ptr es:[4*7ch+2],0 ;设置中断向量
in7c:
push ax
push bx
push cx
push dx
push si
push di
push ds
push es
mov ax,0b800h
mov es,ax
mov al,160
mul dh
mov bx,ax
mov al,2
mul dl
mov di,ax ;使es:[bx].[di]指向显存特定位置
mov ah,cl ;先将cl保存
mostart:
mov cl,ds:[si]
mov ch,0
jcxz ok ;判断是否结束
mov al,ds:[si]
mov es:[bx].[di],al
mov es:[bx].[di+1],ah
inc si
add di,2 ;传送字符串到显存
jmp short mostart
ok:
pop es
pop ds
pop di
pop si
pop dx
pop cx
pop bx
pop ax
iret
in7cend:
nop
code ends
end start
结果如下:
debu跟踪:
我们发现在int之后,cs:ip直接指向了7ch号中断例程代码处;栈顶位置后移了3个字。即在执行int 指令后,把flag,cs,ip先入栈保存,之后根据中断向量表跳转到中断例程处。
(2)用7ch中断例程完成loop指令的功能。
安装程序和上题一致,只需更改一下in7c的功能即可。
而且在文中,王老师也给过详细介绍,此处不在注释。
如下:
in7c:
push bp
mov bp,sp
dec cx
jcxz ok
add [bp+6],bx
ok:
pop bp
iret
结果如下:
debug中的结果与上题一致。
(3)补全程序
补全如下:
mov dh,ds:[si]
mov dx,ds:[bx]
inc si
add bx,2
程序可以看成4部分组成,第一部分定义数据,第二部分完成初始化,第三部分用一个循环完成在显存上显示(10号中断的2号子程序,21h号中断的9号子程序),第四部分完成程序返回(21号中断的4ch号子程序)
还是学习思想啊!!