int指令
格式:int n (n为中断类型码)
功能:引发中断过程
执行过程:
- 取出中断类型码n
- 标志寄存器入栈,IF=0,TF=0
- CS、IP入栈
- (IP)=(n*4)、(CS)=(n*4+2)
int可以调用任何中断程序。
int指令的最终功能和call类似,都是调用一段程序。
系统将一些具有一定功能的子程序以中断处理程序的方式提供给应用程序调用。
调用供应用程序调用的中断例程
assume cs:code
code segment
start : mov ax,3456
int 7ch
add ax,ax
mov ax,4cooh
int 21h
code ends
end start
安装中断7ch中断例程
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:[7cg*4+2],0
mov ax,4c00h
int 21h
sqr: mul ax
iret
sqrend: nop
code ends
end start
对int,iret和栈的深入理解
用7ch中断例程完成loop指令的功能
loop执行需要两个信息:循环次数和到s的位移
用cx存放循环次数,用bx存放位移
7ch例程应具有的功能
- dec cx
- 如果(cx=0,转到s处执行,否则向下执行)
中断例程如何得到标号s的段地址和偏移地址?
使用栈。
用iret指令,我们可以将栈中的se的偏移地址加上bx的转移位移,最终得到s的偏移地址。
lp: push bp
mov bp,sp
dec cx
jcxz lpret
add [bp+2],bx
lpret: pop bp
iret
端口
CPU可以直接读写3个地方的数据:
- CPU内部寄存器
- 内存单元
- 端口
端口的读写
in和out指令
in(CPU<--端口) out (CPU-->端口)
访问端口
例:in al,60h
执行时操作:
- CPU通过地址线将地址信息60h发出
- CPU通过控制线发出端口读命令,选中端口所在的芯片。
- 60h端口数据通过数据线送入CPU
注意:在in和out指令中,只能使用ax或al来存放读写数据。
shl和shr指令
shl 逻辑左移指令
功能:
- 将一个寄存器或内存单元中的数据向左位移
- 将最后移出的一位写入CF中
- 最低位用0补充
例:
shl al,cl
将x逻辑左移一位,相当于执行x=x*2
shr指令和shl相反。
CMOS RAM中存储的时间信息
秒 | 00h |
分 | 02h |
时 | 04h |
日 | 07h |
月 | 08h |
年 | 09h |
以BCD码方式存放 (0~9)