int指令---汇编学习笔记

#int指令
int指令可以引发中断


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

CPU执行int n指令,相当于引发一个n号中断的中断过程,执行过程如下。

  1. 取中断类型码n
  2. 标志寄存器入栈,IF=0、TF=0
  3. CS、IP入栈
  4. ( I P ) = ( n ∗ 4 ) , ( C S ) = ( n ∗ 4 + 2 ) (IP)=(n*4),(CS)=(n*4+2) (IP)=(n4),(CS)=(n4+2)

###13.2 编写供应用程序调用的中断例程
很简单的例子自己看。


###13.3 对int、iret和栈的深入理解
用int 7ch来模拟loop指令,挺复杂的。

大致步骤如下:

  1. int引发中断的过程,将CS、IP入栈
  2. 将栈中的 ( I P ) = ( I P ) − ( l o o p 指 令 位 置 − l o o p 标 号 位 置 ) (IP)=(IP)-(loop指令位置-loop标号位置) (IP)=(IP)(looploop)
  3. 执行iret指令,将CS、IP弹出

例子:
这里写图片描述

这里写图片描述

将上面的例子简单概括一下:

  1. int 7ch引发中断,将CS、IP入栈
  2. 7ch中断例程中的add [bp+2],bx是将入栈后的IP改为s标号处的IP
  3. iret指令执行后,将CS、IP弹出,将指令执行位置重新定位到s标号处
  4. 如果cx等于0,那么将不会执行add [bp+2],bx,这样程序将向下继续执行

检测点 13.1
(1)在上面的内容中,我们用7ch中断例程实现loop的功能,则上面的7ch中断例程所能进行的最大转移位移是多少?
答:必须在1个字所能存储的范围以内,也就是0000~FFFF,容量大小是65536。
(2)用7ch中断例程完成jmp near ptr s指令的功能,用bx向中断例程传送转移位移。
应用举例:在屏幕的第12行,显示data段中以0结尾的字符串。

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
		mov al,[si]
		mov es:[di],al
		inc si
		add di,2
		mov bx,offset s-offset ok
		int 7ch
		
	ok:
		mov ax,4c00h
		int 21h
		
code ends
end start

int 7ch中断例程及安装

assume cs:code

code segment
	start:
		mov ax,cs
		mov ds,ax
		mov si,offset s
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset se-offset s
		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
	
	s:
		push bp
		mov bp,sp
		add [bp+2],bx
		pop bp
		iret

	se:
		nop
		
code ends
end start

完整程序:

assume cs:code
data segment
	db 'conversation',0
data ends


code segment
	start:
		mov ax,cs
		mov ds,ax
		mov si,offset s
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset se-offset s
		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,data
		mov ds,ax
		mov si,0
		mov ax,0b800h
		mov es,ax
		mov di,12*160
	s1:
		cmp byte ptr [si],0
		je ok
		mov al,[si]
		mov es:[di],al
		inc si
		add di,2
		mov bx,offset s1-offset ok
		int 7ch
		
	ok:
		mov ax,4c00h
		int 21h
	
	s:
		push bp
		mov bp,sp
		add [bp+2],bx
		pop bp
		iret
	se:
		nop
	
code ends
end start

###13.4 BIOS和DOS所提供的中断例程
BIOS中主要包括以下几部分内容。

  1. 硬件系统的检测和初始化程序
  2. 外部中断和内部中断的中断例程
  3. 用于对硬件设备进行I/O操作的中断例程
  4. 其他和硬件系统相关的中断例程

操作系统DOS也提供了中断例程,从操作系统的角度来看,DOS的中断例程就是操作系统向程序员提供的编程资源。

BIOS和DOS在所提供的中断例程中包含了许多子程序,这些子程序实现了程序员在编程的时候经常需要用到的功能。程序员在编程的时候,可以用int指令直接调用BIOS和DOS提供的中断例程,来完成某些工作。

和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。


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

  1. 开机后,CPU一加电,初始化(CS)=0FFFFH,(IP)=0,自动从FFFF:0单元开始执行程序。FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
  2. 初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中。注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。
  3. 硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交由操作系统控制。
  4. DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

检测点 13.2
判断下面说法的正误:
(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
答:不行,因为BIOS的中断例程是ROM(只读)。
(2)int 19h中断例程,可以由DOS提供。
答:不行,因为int 19h是用来启动DOS的。而DOS不能在没被启动的情况下提供int 19h。


###13.6 BIOS中断例程应用
自行阅读,略过。


###13.7 DOS中断例程应用
这里说明一个内容,其他自行阅读,略过。

mov ah,4c	;程序返回
mov al,0	;返回值
int 21h

##实验13 编写、应用中断例程
(1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。
参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址。

assume cs:code
data segment
	db 'welcome to masm!',0
data ends
code segment
	start:
		mov dh,10
		mov dl,10
		mov cl,2
		mov ax,data
		mov ds,ax
		mov si,0
		int 7ch
		mov ax,4c00h
		int 21h
code ends
end start

7ch中断例程编写及其安装

assume cs:code
code segment
	start:
		mov ax,cs
		mov ds,ax
		mov si,offset s
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset se-offset s
		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	
		
		
	s:
		mov ax,0b800h
		mov es,ax
		mov ax,160
		mul dh
		mov di,ax
		mov ax,2
		mul dl
		add di,ax
		
	sl:
		mov al,ds:[si]
		mov ah,0
		cmp ah,al
		je	ok
		mov ah,cl
		mov es:[di],ax
		inc si
		add di,2
		jmp sl
	
	ok:
		iret
		
	se:
		nop
	
		
code ends
end start

实验结果:
这里写图片描述
(2)编写并安装int 7ch中断例程,功能为完成loop指令的功能。
参数:(cx)=循环次数,(bx)=位移。

assume cs:code
code segment
	start:
		mov ax,0b800h
		mov es,ax
		mov di,160*12
		mov bx,offset s-offset se
		mov cx,80
	s:
		mov byte ptr es:[di],'!'
		add di,2
		int 7ch
	se:
		nop
		mov ax,4c00h
		int 21h
code ends
end start

7ch中断例程及其安装:

assume cs:code
code segment
	start:
		mov ax,cs
		mov ds,ax
		mov si,offset s
		mov ax,0
		mov es,ax
		mov di,200h
		mov cx,offset se-offset s
		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	
		
		
	s:
		push bp
		mov bp,sp
		dec cx
		jcxz ok
		add [bp+2],bx
		
	ok:
		pop bp
		iret
		
	se:
		nop
	
		
code ends
end start

实验结果:
这里写图片描述
(3)下面的程序,分别在屏幕的第2、4、6、8行显示4句英文诗,补全程序。

assume cs:code
code segment
	s1:
		db 'Good,better,best,','$'
	s2:
		db 'Never let it rest,','$'
	s3:
		db 'Till good is better,','$'
	s4:
		db 'And better,best.','$'
	s:
		dw offset s1,offset s2,offset s3,offset s4
	row:
		db 2,4,6,8
	start:
		mov ax,cs
		mov ds,ax
		mov bx,offset s
		mov si,offset row
		mov cx,4
	ok:
		mov bh,0
		mov dh,
		mov dl,0
		mov ah,2
		int 10h

		mov dx,
		mov ah,9
		int 21h
		
		
		loop ok
		mov ax,4c00h
		int 21h
code ends
end start

实验结果:
这里写图片描述

<think>好的,用户需要关于IBM-PC汇编语言的学习笔记或教程。首先,我要回顾提供的引用内容,看看是否有相关信息。引用1提到学习汇编语言要直接对硬件编程,引用2详细介绍了汇编语言的基础知识,如CPU与存储器的交互。引用3指出IBM PC使用8088芯片,开启了微机时代。引用4则涉及字符串表示和计算机发展史。 接下来,我需要将这些信息组织成结构清晰的回答。用户可能需要了解IBM-PC汇编的核心概念、硬件基础、指令集和参考资料。根据引用2,汇编指令是核心,涉及CPU的地址、控制、数据信息。引用3提到的8088芯片是关键,应强调其重要性。 然后,生成相关问题。要考虑用户可能想深入学习的方面,比如开发环境搭建、指令系统、实际应用案例等。确保问题覆盖学习路径的不同阶段,从基础到应用。 最后,检查是否符合用户要求:使用中文,LaTeX格式正确,添加引用标识。确保回答真实可靠,引用来源准确。</think>根据您对IBM-PC汇编语言学习资料的需求,结合站内参考资料整理如下结构化学习路径: ### 一、IBM-PC汇编语言核心要素 1. **硬件基础** - 8088/8086处理器架构是IBM-PC的核心,采用16位寄存器组(AX,BX,CX,DX等)和分段内存管理机制[^3] - CPU与存储器交互的三类信息: $$ 地址总线(20位) \rightarrow 1MB寻址空间 $$ $$ 控制总线 \rightarrow 读/写信号 $$ $$ 数据总线(16位) \rightarrow 字传输 $$ 2. **指令系统特性** - 采用机器指令助记符格式,如: ```assembly MOV AX, 0FFFFH ; 立即数传送 ADD BX, CX ; 寄存器相加 ``` - 支持直接硬件操作:端口I/O、中断处理、DMA控制等[^1] ### 二、推荐学习框架 1. **开发环境搭建** - 建议使用MASM 5.0+DOSBox模拟器 - 基础程序结构示例: ```assembly .MODEL SMALL .STACK 100H .DATA MSG DB 'Hello, IBM-PC!$' .CODE START: MOV AX, @DATA MOV DS, AX LEA DX, MSG MOV AH, 09H INT 21H MOV AH, 4CH INT 21H END START ``` 2. **重点学习模块** - 内存分段机制:代码段(CS)、数据段(DS)、堆栈段(SS) - BIOS/DOS中断调用(INT 21H系统功能) - 混合编程:与C语言的接口技术 ### 三、经典参考资料 1. **《IBM-PC汇编语言程序设计(第2版)》**(沈美明著) - 涵盖DEBUG工具使用、接口编程等实践内容 2. **Intel 8086程序员手册** - 指令集详细说明:包括寻址方式、标志位操作等[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值