张狂的暑假学习之 汇编入门学习笔记 (十二)—— 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 mov bh,0 mov dh,5 mov dl,12 int 10h mov ax,data mov ds,ax mov dx,0 ;ds:dx指向字符串的首地址 data:0 mov ah,9 int 21h mov ax,4c00h int 21h code 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