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

来源:互联网 发布:mac 强制关掉程序 编辑:程序博客网 时间:2024/06/10 21:36

疯狂的暑假学习之  汇编入门学习笔记 (十二)——  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,csmov ds,axmov si,offset sqrmov ax,0mov es,axmov di,200hmov cx,offset sqrend - offset sqrcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hsqr:mul axiretsqrend:nop code ends  end start


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



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

assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset changemov ax,0mov es,axmov di,200hmov cx,offset changeend - offset changecldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hchange:push cxpush sis:mov ch,0mov cl,ds:[si]jcxz okand cl,11011111bmov ds:[si],clinc sijmp short sok:pop sipop cxiretchangeend:nopcode endsend start

assume cs:codedata segmentdb 'conversation',0data endscode segmentstart:mov ax,datamov ds,axmov si,0int 7chmov ax,4c00hint 21hcode endsend start


例子3:使中断7ch实现loop指令的功能。
assume cs:codecode segmentstart:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset lpend - offset lpcldrep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0mov ax,4c00hint 21hlp:push bpmov bp,spdec cxjcxz lpretadd [bp+2],bxlpret:pop bpiretlpend:nopcode endsend start

assume cs:codecode segmentstart:mov ax,0b800hmov es,axmov di,160*12mov bx,offset s - offset semov cx,80s:mov byte ptr es:[di],'!'add di,2int 7chse:nopmov ax,4c00hint 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,2mov bh,0mov dh,5mov dl,12int 10hmov ah,9mov al,'a'mov bl,11001010bmov bh,0mov cx,3int 10hmov ax,4c00hint 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 segmentdb 'Welcome to masm!','$'data endscode segmentstart:mov ah,2mov bh,0mov dh,5mov dl,12int 10hmov ax,datamov ds,axmov dx,0    ;ds:dx指向字符串的首地址 data:0mov ah,9int 21hmov ax,4c00hint 21hcode endsend start



二、端口


     各种芯片(网卡,显卡等)都有一组可以由CPU读写的寄存器。CPU可以通过这些寄存器读取数据,或者操控芯片。CPU把这些寄存器当做端口,对这些寄存器进行统一编址。每个端口宅地址空间中都有一个地址。


1. in和out指令


访问端口用in和out

如果:

in al,60h  ; 从60h端口读取数据放到al中

注意:只能用ax或者al来存放从端口中读入的数据或要发送到端口的数据。


对0~255以内的端口进行读写时:

in al,20h

out 20h,al


对256~65535的端口进行读写时,端口号放在dx中:

mov dx,3f8h

in al.dx

ou dx,al


2. shl和shr指令


shl:左移指令,最低位补0,将移出的追后以为写入CF中


如果是移1位就:

shl  al,1


如果移动大于1位,必须将移动的位数放在cl中

mov cl,3

shl al,cl


shr是右移,其他与shl一样


3. CMOS RAM芯片


PC中有一个靠电池供电CMOS RAM芯片,它包含一个实时种和一个有128个存储单元的RAM存储器。


它有两个端口:

70h:保存要读取内存单元的地址

71h:读取内存单元


CMOS RAM中存储的时间信息


0:秒;2:分;

4:时;7:日;

8:月;9:年;


例子:在屏幕显示月份。

assume cs:codecode segmentstart:mov al,8out 70h,alin al,71hmov ah,almov cl,4shr ah,cland al,00001111badd ah,30h   ;'0' 的ASCII值add al,30hmov bx,0b800hmov es,bxmov byte ptr es:[160*12+40*2],ahmov byte ptr es:[160*12+40*2+2],almov ax,4c00hint 21hcode endsend start




0 0
原创粉丝点击