汇编语言(王爽版)学习笔记 第十三章 int指令


中断信息可以来自CPU的内部和外部,当CPU内部有需要处理的事情发生的时候,将产生需要马上处理的中断信息,引发中断过程。这一章中,我们讲解另一种重要的内中断,由int指令引发的中断。

13.1 int指令

int指令的格式为:int n,n为中断类型码,它的功能是引发中断过程。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


13.2 编写供应用程序调用的中断例程

问题1:编写、安装中断7ch的中断例程
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装程序如下:

assume cs:code
	code segment
		start: mov ax,cs
			   mov ds,ax
			   mov si,offset sqr	;设置ds:si指向源地址
			   mov ax,0
			   mov es,ax
			   mov di,200h			;设置es:di指向目的地址
			   mov cx,offset sqrend - offset sqr		;设置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
			   
			sqr: mul ax
				iret
		sqrend:nop
		
	code ends
end start

在这里插入图片描述
问题二:编写、安装中断7ch的中断例程。
在这里插入图片描述
在这里插入图片描述
安装程序:

assume cs:code
	code segment
		start: mov ax,cs
			   mov ds,ax
			   mov si,offset capital	;设置ds:si指向源地址
			   mov ax,0
			   mov es,ax
			   mov di,200h			;设置es:di指向目的地址
			   mov cx,offset capitalend - offset capital		;设置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
			   
		capital:  push cx
				  push si
		change: mov cl,[si]
			   mov ch,0
			   jcxz ok 
			   and byte ptr [si],11011111b
			   inc si
			   jmp short change
				
			ok: pop si
				pop cx
				iret
		
		capitalend:nop
	code ends
end start

在中断例程capital中用到了寄存器si和cx,编写中断例程和编写子程序的时候具有同样的问题,就是要避免寄存器的冲突。应该注意例程中用到的寄存器的值的保存和恢复。


13.3 对int、iret和栈的深入理解

问题:用7ch中断例程完成loop指令的功能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

检测点 13.1

在这里插入图片描述

如果从loop的指令角度上看,loop就是个段内短转移,它的范围是-128~127,也就是说最大转移位移是128.
如果从例程中bx变量来说,先搞定bx存储二进制补码数据的表示范围。对于16位来说它表示的范围是(-32768~32767),最大位移是32768

在这里插入图片描述

assume cs:code

data segment

     db 'conversation',0

data ends

code segment

start:

     mov ax,data

     mov ds,ax

     mov si,0

     mov ax,0b800h

     mov es,ax

     mov di,12*160

s:   cmp byte ptr [si],0

     je ok	;如果是0跳出循环

     mov al,[si]

     mov es:[di],al

     inc si

     add di,2

     mov bx,offset s-offset ok		;设置从标号ok到标号s的转移位移

     int 7ch		;转移到标号s处

ok:  mov ax,4c00h

     int 21h

code ends

end start
assume cs:code

code segment

start:      ;7cH中断例程的安装程序

            mov ax, cs

            mov ds, ax

            mov si, offset lp   ;将ds:si指向源地址(captial的机器码)

            mov ax, 0000H

            mov es, ax

            mov di, 200H        ;将es:di指向目的地址(0:200H向量表中)

            mov cx, offset lpend - offset lp    ;设置传输长度

            cld             ;传输方向为正

            rep movsb       ;字节传输

            ;设置中断向量表,使7cH条目中断向量指向0000:200H

            mov ax, 0000H

            mov es, ax

            mov word ptr es:[7cH*4], 200H

            mov word ptr es:[7cH*4+2], 0000H

           

            mov ax, 4c00H

            int 21H

;-------

;装载的例程:7cH

;功能:int 7cH实现和jmp near ptr s指令相同的功能

;入口参数:bx相对地址偏移量

;返回值:无

;-------   

lp:    push bp         ;将bp这个ss栈的偏址保存

        mov bp, sp      ;将当前栈顶指针值送入到bp

        add [bp+2], bx  ;修改ss栈中的从栈顶向下第2个单元的值

lpret: pop bp          ;恢复bp值

        iret            ;返回到调用处。

   

lpend:  nop             ;代码段结尾,便于计算7cH例程的长度。   

code ends

end start

13.4 BIOS和DOS所提供的中断例程

在这里插入图片描述


13.5 BIOS和DOS中断例程的安装过程

BIOS和DOS提供的中断例程是如何安装到内存中的呢?

在这里插入图片描述

检测点 13.2

在这里插入图片描述

(1)错误。由于FFFF:0处的指令是无法改变的,只读的。
(2)错误。中断例程19h是主板上的ROM中固化的例程,是由BIOS提供的。不是由DOS提供的。


13.6 BIOS中断例程应用

在这里插入图片描述
在这里插入图片描述

编程:在屏幕的5行12列显示3个红底高亮闪烁绿色的’a’。

在这里插入图片描述
注意,闪烁的效果必须在全屏DOS方式下才能看到。


13.7 DOS中断例程应用

在这里插入图片描述
在这里插入图片描述

编程:在屏幕的5行12列显示字符串"Welcome to masm!"

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值