(2011.11.04) 汇编_王爽_第13章_学习小结

来源:互联网 发布:网络推广和网络销售 编辑:程序博客网 时间:2024/06/13 22:28
 

(2011.11.04) 汇编_王爽_第13章_学习小结

本章内容:

1. 如何编写供应用程序调用的中断例程

2. 如何使用中断例程实现循环

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

一.BIOS内容补充:

1. BIOS中有许多的中断例程

2. BIOS(基本输入输出系统),主要有以下四方面的内容

  01.硬件系统的检测和初始化程序

  02.外部中断和内部中断例程

  03.用于对硬件设备进行I/O操作的中断例程

  04.其他和硬件系统相关的中断例程

 

二.开机过程中与中断例程相关的

1. 开机 -> CPU通电 -> CS:IP = 0FFFFH:0从CS:IP开始执行

2. -> 建立BIOS支持的中断向量 -> 登记安装入口

3. -> 调用int19进行操作系统引导

4. -> 中断例程装入内存

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

; 程序名称:1302_编写供应用程序调用的中断例程.asm; 程序功能:将一个全是字母,以零结尾的字符串转化为大写assume cs:codedata segmentdb 'conversation', 0data endscode segmentstart:mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcode endsend start;--------------------------------------------------------------------; 下面是中断程序 int 7ch的安装程序assume cs:codecode segmentstart:; ----------------------------------------------------------------------; 第一步:将程序代码复制到向量表中mov ax, csmov ds, axmov si, offset capitalmov ax, 0mov es, axmov di, 200hmov cx, offset capitalend - offset capitalcld rep movsb;--------------------------------------------------------------------; 第二步:设置中断向量,指定入口mov ax, 0mov es, axmov word ptr es:[7ch*4], 200hmov word ptr es:[7ch*4+2], 0mov ax, 4c00hint 21h; ----------------------------------------------------------------------; 第三步:需要在向量表执行的工作的代码capital:push cxpush sichange:mov cl, [si]mov ch, 0jcxz, okand byte ptr [si], 11011111binc sijmp short change ok:pop sipop cxiretcapitalend:nopcode endsend start


 

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

; 程序名称:1303_使用中断例程实现程序的循环.asm; 程序功能:在屏幕中间显示80个'!'assume cs:code code segmentstart: mov ax, 0b800hmov es, axmov di, 160*12mov bx, offset s - offset se; 设置从标号se到标号s的转移位置mov cx, 80s:mov byte ptr es:[di], '!'add di, 2int 7ch; 如果(cx)!= 0 ,则转移到标号s处se:nopmov ax, 4c00hint 21hcode endsend start; 7ch的中断例程:; ------------------------------------------------------------------------------------------------assume cs:codecode segmentstart:; 第一步:复制代码至中断向量表; -------------------------------------------------------------------------------------------------mov ax, csmov ds, axmov si, offset lpmov ax, 0mov es, axmov di, 200hmov cx, offset lpend - offset lpcldrep movsb; 第二步:设置中断向量表入口; -------------------------------------------------------------------------------------------------mov ax, 0mov es, axmov word ptr es:[7ch*4], 200hmov word ptr es:[7ch*4+2], 0mov ax, 4c00hint 21h; 第三步:编写需要执行的中断代码;---------------------------------------------------------------------------------------------------lp:push bp; 先将需要用到的bp放入堆栈中mov bp, sp; 将现在的sp移到bp中dec cx; cx减1,直到cx为0不再循环jcxz lpretadd [bp+2], bx; 将bp+2,因为刚刚程序开始时执行过push操作; 所以要想获取IP,则需+2,(每push一次,减2); 改变原程序中IP的值; 在程序刚刚进来中断程序前,程序隐含执行了一次; push popf 之后是 push CS 之后是 push IP 的操作; 此时IP放在堆栈中的最顶处lpret:pop bp iret; 程序返回前,从堆栈中获取地址返回; pop IP -> pop CS -> popfendlp:nop; --------------------------------------------------------------------------------------------------code endsend start


 

 

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 

; 程序名称:实验13_编写中断例程_显示字符串.asm; 程序要求:编并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处。; 程序参数:(dh) = 行号,(dl) = 列号,(cl) = 颜色,ds:si 指向字符串首地址; 原题目提供的程序:assume cs:codedata segmentdb "welcome to masm!", 0data endscode segmentstart:mov dh, 10; 行号mov dl, 10; 列号mov cl, 2; 颜色mov ax, datamov ds, axmov si, 0int 7chmov ax, 4c00hint 21hcode endsend start; 开始安装int 7ch;-------------------------------------------------------------------------------------------assume cs:codecode segment:start:push dspush bppush dxpush cxpush si; 第一步:将代码复制至中断向量表; -----------------------------------------------------------------------------------------mov ax, csmov ds, axmov si, offset showstringmov ax, 0mov es, axmov di, 200hmov cx, offset showstringend - offset showstringcldrep movsb; 第二步:在中断向量表安装地址; --------------------------------------------------------------------------------------------mov ax, 0mov es, axmov word ptr es:[7ch*4], 200hmov word ptr es:[7ch*4+2], 0mov ax, 4c00hint 21h; 第三步:编写需要执行的中断代码;---------------------------------------------------------------------------------------------------showstring:mul dh, 16; 得出行号的地址add ax, dl; 得出行列号的地址mov bx, ax; 设置bx为显示区的偏移地址mov ax, ss:[sp]; 提取原来的数据地址mov ds, axmov ax, 0b800hmov es, ax; 设置es的地址为显示缓冲区的段地址;mov ax, ss:[sp+8]; 提取需要显示的颜色mov ax, 0mov di, axshowtime:; 循环准备及判断mov ch, ds:[di]mov cl, 0jcxz showstringend; 代码执行mov al, ds:[di]mov es:[bx], al; 将字符copy过去inc bxmov es:[bx], di; 将字符属性copy过去; 循环继续及结束判断inc bxinc dijmp showtimeshowstringend:pop sipop cxpop dxpop bppop dsnopcode endsend start

原创粉丝点击