汇编语言 拓展实验 对中断的深入理解

实验要求:

编写两个源程序。两个源程序负责的工作分别是:
1、1.asm,负责重装1号中断。
2、2.asm,负责计算2的8次方,结果以十六进制显示在屏幕中央。
这两个源程序执行中,配合实现以下功能:
执行1.exe,重装的1号中断进入内存,相应的中断向量指向新的中断处理程序,此中断处理程序在2.exe执行过程中为其打印IP地址提供支持。
执行2.exe,执行的过程中,随着每一条指令的执行,屏幕上都显示其IP地址,并且最终实现2.asm本身的功能:计算2的8次方并显示。
所以,在重装1号中断的基础上,2.exe将实现两个功能:
1、随着程序的执行,十六进制显示每一条指令的IP。
2、十六进制显示2的8次方的运算结果。

提示:
1、思考1号中断的机制。
2、显示IP是1.exe实现的,2.exe执行中自动调用,不是要在2.asm中写这个功能。
3、尽量精简代码。

先上代码

1.asm

;重装一号中断
assume cs:code
code segment
	start:	
		mov ax,cs
		mov ds,ax
		mov si,offset re_one
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset one_end-offset re_one
		cld
		rep movsb
		
		mov ax,0
		mov es,ax
		mov word ptr es:[1*4],200h
		mov word ptr es:[1*4+2],0
	
		mov ax,4c00h
		int 21h
		
	re_one:
		push bp
		push ax
		push bx
		push cx
		
		mov byte ptr es:[di],'I'
		mov byte ptr es:[di+1],3
		mov byte ptr es:[di+2],'P'
		mov byte ptr es:[di+3],3
		mov byte ptr es:[di+4],'='
		mov byte ptr es:[di+5],3
		mov bp,sp
		mov ax,[bp+8]		;ip
		mov bx,ax
		and ah,0f0h		;取高位高四位
		mov cl,4
		shr ah,cl
		add ah,30h
		mov es:[di+6],ah
		mov byte ptr es:[di+7],3
		and bh,0fh		;取高位低四位
		add bh,30h
		mov es:[di+8],bh
		mov byte ptr es:[di+9],3
		and al,0f0h		;取低位高四位
		shr al,cl
		add al,30h
		mov es:[di+10],al
		mov byte ptr es:[di+11],3
		and bl,0fh		;取低位低四位
		cmp bl,0ah
		ja letter
		add bl,30h
		jmp short s0
	letter:
		add bl,37h
	s0:	mov es:[di+12],bl
		mov byte ptr es:[di+13],3
		mov byte ptr es:[di+14],'H'
		mov byte ptr es:[di+15],3
		
		add di,160
		pop cx
		pop bx
		pop ax
		pop bp
		iret
	one_end:
		nop
code ends
end start`

2.asm

assume cs:code
code segment
	start:
		mov ax,0b800h
		mov es,ax
		mov di,160*3+2*60
	
		pushf
		pop bx
		or bh,00000001b		;置tf位为1
		push bx		
		popf
		
		mov ax,2		;不会显示这条指令的ip 因为执行单步中断的时候ip已经指向了下一条指令
		mov cx,3
	s:	mul ax
		loop s			;2^8
		
		pushf
		pop bx
		and bh,00000000b		;置tf位为0
		push bx		
		popf
		
		mov dh,3		;颜色
		mov bx,ax
		mov bp,160*12+2*10
		mov byte ptr es:[bp],'2'
		mov byte ptr es:[bp+1],dh
		mov byte ptr es:[bp+2],'^'
		mov byte ptr es:[bp+3],dh
		mov byte ptr es:[bp+4],'8'
		mov byte ptr es:[bp+5],dh
		mov byte ptr es:[bp+6],'='
		mov byte ptr es:[bp+7],dh
		
		
		mov ax,bx
		and ah,0f0h		;取高位高四位
		mov cl,4
		shr ah,cl
		add ah,30h
		mov es:[bp+8],ah
		mov es:[bp+9],dh
		and bh,0fh		;取高位低四位
		add bh,30h
		mov es:[bp+10],bh
		mov es:[bp+11],dh
		and al,0f0h		;取低位高四位
		shr al,cl
		add al,30h
		mov es:[bp+12],al
		mov es:[bp+13],dh
		and bl,0fh		;取低位低四位
		add bl,30h
		mov es:[bp+14],bl
		mov es:[bp+15],dh
		mov byte ptr es:[bp+16],'H'
		mov byte ptr es:[bp+17],dh
		
		mov ax,4c00h
		int 21h
code ends
end start

结果

在这里插入图片描述

关键点

重装一号中断之后,执行2.exe会自动调用一号中断,如果只用int指令就需要在每一条指令之前都加上int指令才可以实现显示每一条指令的IP,所以这里可以用到之前写的一个子程序:置标志寄存器的TF位为一。只需在2.asm开始将TF位置为一,在2.exe执行过程中TF位始终为一,也就实现了单步中断。
实验中一定要注意寄存器的保存和恢复!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值