实验16 编写包含多个功能子程序的中断例程

本实验是本书的第二个精华的实验。到此可以总结,汇编的重点在于跳转,这里的跳转包括jmp,call(调用),int(中断),这反映到操作系统上就是调用,线程、进程的切换,跳转的本质是任务的切换,CPU的并行就是通过指令切换完成的,所以汇编是操作系统的基础。再说跳转,那就涉及到程序放在哪里,怎样把指令指到想执行的程序上?分为两种情况:一是不安装程序,这种情况比较好办,通过offset直接可以定位到程序的位置,然后通过jmp或者call找到位置执行;二是安装程序,本实验就是第二种情况。

1,安装代码

assume cs:code


code segment
start:	
	mov ax, cs    
	mov ds, ax    
	mov si, offset setscreen     ;设置ds:si指向源地址    
	mov ax, 0    
	mov es, ax              
	mov di, 200h            ;设置es:si指目的地址    

	mov cx, offset setscreenend - offset setscreen  ;设置cx传输长度    
	cld    
	rep movsb 


	mov ax, 0       ;设置中断向量表    
	mov es, ax    
	mov word ptr es:[7ch*4], 200h    
	mov word ptr es:[7ch*4+2], 0 

	mov ax, 4c00h
	int 21h


;----------------
setscreen:
	jmp short set
	table dw offset sub1 - offset setscreen + 200h,offset sub2 - offset setscreen + 200h,offset sub3 - offset setscreen + 200h,offset sub4 - offset setscreen + 200h
set:	push bx
	push es

	mov bx, 0
	mov es, bx
	cmp ah, 3
	ja sret
	mov bl, ah
	xor bh, bh
	add bx, bx
	add bx, offset table - offset setscreen + 200h
	call word ptr es:[bx]
sret:	pop es
	pop bx
	iret
	
sub1: 
        push bx 
        push cx 
        push es 
        mov bx,0b800h 
        mov es,bx 
        mov bx,0 
        mov cx,2000 
sub1s:        
	mov byte ptr es:[bx],' ' 
        add bx,2 
        loop sub1s 
        pop es 
        pop cx 
        pop bx 
        ret 

sub2:   push bx 
        push cx 
        push es 
        mov bx,0b800h 
        mov es,bx 
        mov bx,1 
        mov cx,2000 
sub2s:        
	and byte ptr es:[bx],11111000b 
        or es:[bx],al 
        add bx,2 
        loop sub2s 
         
        pop es 
        pop cx 
        pop bx 
        ret 
 
sub3:        
	push bx 
        push cx 
        push es 
        mov cl,4 
        shl al,cl 
        mov bx,0b800h 
        mov es,bx 
        mov bx,1 
        mov cx,2000 
sub3s:        
	and byte ptr es:[bx],al 
        or es:[bx],al 
        add bx,2 
        loop sub3s 
        pop es 
        pop cx 
        pop bx 
        ret 

sub4:        
	push cx 
        push si 
        push di 
        push es 
        push ds 
         
        mov si,0b800h 
        mov es,si 
        mov ds,si 
        mov si,160 
        mov di,0 
        cld 
        mov cx,24 
         
sub4s:        
	push cx 
        mov cx,160 
        rep movsb 
        pop cx 
        loop sub4s 
         
        mov cx,80 
        mov si,0 
sub4s1:        
	mov byte ptr [160*24+si],' ' 
        add si,2 
        loop sub4s1 
         
        pop ds 
        pop es 
        pop di 
        pop si 
        pop cx 
        ret 
setscreenend:
	nop



code ends
end start







2,应用代码(t2)

assume cs:code


code segment
start:	
	mov ah, 1
	mov al, 2
	int 7ch

	mov ax, 4c00h
	int 21h

code ends
end start

3,实验结果:

t1.exe

masm t2.asm

link t2.obj

t2.exe

4,实验体会

jmp,loop这类指令,编译后后面跟的是两个指令的距离,所以包含它们俩的代码无论是复制还是安装,都可以正常的运行;offset这个指令后得到的指令正在运行的程序所在的段的偏移地址,一旦复制安装到其它地方一般就会出错,所以在写中断例程时,一定要考虑中断例程在0段下的偏移地址,而不是在安装程序中的偏移地址。这段话结合上面的程序不难理解。

这段程序费了我两天时间,有两个问题,一是包含offset的中断例程应该怎样处理,这一点和loop,jmp混在一起了;二是往上有个老师说程序放在0:7e00处,但是我在dosbox出现了奇怪的问题,老师讲的没错,他是在winxp上运行的,应该可以吧,但是在dosbox是确定不行的。








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值