微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 汇编入门学习笔记 (十二)—— int指令、端口

汇编入门学习笔记 (十二)—— int指令、端口

时间:11-09 来源:互联网 点击:
疯狂的暑假学习之 汇编入门学习笔记 (十二)—— int指令端口

参考: 《汇编语言》 王爽 第13、14章

一、int指令

1. int指令引发的中断

int n指令,相当于引发一个n号中断。

执行过程相当于:

(1)取中断类型吗n。

(2)标志寄存器入栈;设置IF=0,TF=0。

(3)CS,IP入栈

(4)(IP)=(n*4),(CS)=(n*4+2)

例子1:编写、安装中断7ch,实现求一个word型数据的平方,用ax存放这个数据。

assume cs:code code segment start: mov ax,cs mov ds,ax mov si,offset sqr mov ax,0 mov es,ax mov di,200h mov cx,offset sqrend - offset sqr 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 iretsqrend: nop code ends end start

assume cs:codecode segmentstart: mov ax,3 int 7ch mov ax,4c00h int 21hcode endsend start

例子2:编写、安装7ch中断,实现将data段中的字符串转化为大写。

assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset change mov ax,0 mov es,ax mov di,200h mov cx,offset changeend - offset change 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 21hchange: push cx push sis: mov ch,0 mov cl,ds:[si] jcxz ok and cl,11011111b mov ds:[si],cl inc si jmp short sok: pop si pop cx iretchangeend: nop code endsend start

assume cs:codedata segment db conversation,0data endscode segmentstart: mov ax,data mov ds,ax mov si,0 int 7ch mov ax,4c00h int 21h code endsend start

例子3:使中断7ch实现loop指令的功能。

assume cs:codecode segmentstart: mov ax,cs mov ds,ax mov si,offset lp mov ax,0 mov es,ax mov di,200h mov cx,offset lpend - offset lp 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 21hlp: push bp mov bp,sp dec cx jcxz lpret add [bp+2],bxlpret: pop bp iretlpend: nop code endsend start

assume cs:codecode segmentstart: mov ax,0b800h mov es,ax mov di,160*12 mov bx,offset s - offset se mov cx,80s: mov byte ptr es:[di],! add di,2 int 7chse: nop mov ax,4c00h int 21hcode endsend start

2. BIOS和DOS的中断例程

BIOS中主要包含:

(1)硬件系统的检测和初始化程序

(2)外部中断和内部中断的中断例程

(3)用于对硬件设备进行I/O操作的中断例程

(4)其他和硬件系统相关的中断例程

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

(1)开机,初始化CS=0FFFFH,IP=0,执行FFFF:0程序。FFFF:0程序有一条跳转指令,执行完后,CPU会去执行BIOS中的硬件系统检测和初始化程序。

(2)初始化程序将建立BIOS所支持的中断向量,即将BIOS中提供的中断例程的入口地址登记在中断向量表中。注意:BIOS所提供的中断例程,只需要将入口地址登记在中断向量表中即可,因为它们是固化在ROM中的。

(3)硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。从此将计算机交给操作系统控制

(4)DOS启动后,除了完成其他工作外,还将他所提供的中断例程装入内存中,并建立相应的中断向量。

一般来说,一个中断例程包含了多个子程序,用ah来传递内部子程序的编号

int 10h中断

它是BIOS提供的中断例程,其中包含了多个和屏幕输出有关的子程序

ah=2 设置光标位置,此时bh存放 第几页;dh存放行号;dl存放列号

ah=9 在光标位置显示字符,此时al存放字符;bl存放颜色属性;bh存放第几页;cx存放这个字符重复显示几

例子:

assume cs:codecode segmentstart: mov ah,2 mov bh,0 mov dh,5 mov dl,12 int 10h mov ah,9 mov al,a mov bl,11001010b mov bh,0 mov cx,3 int 10h mov ax,4c00h int 21hcode endsend start

int 21h中断

它是DOS提供的中断例程,包含了DOS提供给程序员在编程时调用的子程序。

前面我们一直用下面的代码返回

mov ax,4c00hint 21h

其实这是用了21号中断例程的4ch号子程序,al是用来存放程序返回值的,上面的代码即0

本质就是:

mov ah,4chmov al,0int 21h

21h号中断例程的9号子程序功能是在光标位置显示字符串,用ds:dx指定字符串的首地址,字符串要以‘$’结尾

例子:

assume cs:codedata segment db Welcome to masm!,$data endscode segmentstart: mov ah,2 mo

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top