8086汇编复习4 - int指令 - 使用emu8086
int指令
中断信息可以来自CPU的内部和外部;int指令引发的中断是内中断;
int n,n为中断类型码;
CPU执行int n指令,相当于引发一个n号中断的中断过程;执行过程如下:
1)取中断类型码n;
2)标志寄存器入栈,IF=0, TF=0;
3)CS、IP入栈;
4)n*4赋值给IP寄存器;(n*4+2)赋值给CS寄存器;
从此处转去执行n号中断的中断处理程序;
mov ax, 0b800h
mov es, ax
mov byte ptr es:[12*160 + 40 * 2], '!'
int 0
此程序在Win2000中的DOS方式下执行,将在屏幕中间显示一个惊叹号,然后显示"Divide overflow"后返回到系统中。
程序并没有做除法;CPU执行int 0指令,引发中断,执行0号中断处理程序,系统的0号中断处理程序的功能是显示"Divide overflow",然后返回到系统;
int和call指令类似,都是调用一段程序;
在emu8086中,int 0 中断例程位于仿真内存F4170处;程序执行完,自己弹出仿真屏幕,显示一个惊叹号;
在系统板的ROM中存放着一套程序;称为BIOS;BIOS主要包含:
1)硬件系统的检测和初始化程序;
2)外部中断和内部中断的中断例程;
3)用于对硬件设备进行I/O操作的中断例程;
4)其他和硬件系统相关的中断例程;
DOS操作系统也提供了中断例程,DOS的中断例程就是操作系统向程序员提供的编程资源;
int 10h中断例程是BIOS提供的中断例程;其中包含了多个和屏幕输出相关的子程序;
int 10h设置光标位置;
mov ah, 2 ;置光标
mov bh, 0 ;第0页
mov dh, 5 ;dh中放行号
mov dl, 12 ;dl中放列号
int 10h
ah内容为2,后面再int 10h,就调用10h号中断例程的2号子程序;后面是参数;
设置光标到第0页,第5行,第12列;
在内存地址空间中,B8000H - BFFFFH 共32kB的空间,为80*25彩色字符模式的显示缓冲区;
显示缓冲区分为8页;每页4KB,4000B;一般情况下,显示第0页内容,B8000H - B8F9FH的4000个字节;
在emu8086中,int 10h 中断例程位于仿真内存F4190处;
程序运行完,手动弹出仿真屏幕,看不到有内容;
下面尝试在显示缓冲区手动输入内容;5行12列,要设置的位置大概在B8000后60个字节,即B803C处;在B803C手动输入99;原来它的仿真屏幕是即时处理的;手动修改了,马上自动弹出仿真屏幕,显示修改的内容;99的ASCII码大概是一个问号;在屏幕显示一个问号;