版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
汇编语言程序设计将程序分段、采用子程序或宏结构都是进行模块化程序设计;本节介绍开发大型程序时采用的方法:源程序文件的包含目标模块连接4.6模块化程序设计例题将键盘输入的数据按升序输出汇编语言程序设计把源程序分放在几个文本文件中,在汇编时通过包含伪指令INCLUDE结合成一体INCLUDE文件名可将常用的子程序形成.ASM汇编语言源文件可将常用的宏定义存放在.MAC宏库文件中可将常量定义、声明语句组织在.INC包含文件中例①宏库文件②主程序文件③子程序文件4.6.1源程序文件的包含1汇编语言程序设计dispchar macrochar ;显示char字符
movdl,char movah,2 int21h endmdispmsg macromessage ;显示message字符串
movdx,offsetmessage movah,9 int21h endm汇编语言程序设计
... dispmsgmsg1 ;提示输入数据
movbx,offsetbuf callinput ;数据输入
cmpcx,0 jestart4 ;没有输入数据则退出
movcount,cx ... ;显示输入的数据
... ;数据排序
... ;显示经排序后的数据start4: .exit0 end汇编语言程序设计子程序源文件有3个子程序ALdisp ;显示2位16进制数子程序(例)sorting ;排序子程序(例)input ;键盘输入子程序还包含一个宏convert ;;将DX两位ASCII码转换为两位16进制数让我们重点分析键盘输入子程序input汇编语言程序设计input proc ;键盘输入子程序
pushax ;入口参数:ds:bx=存放数据的缓冲区
pushdx ;出口参数:cx=数据个数
xorcx,cx ;数据个数清0input01: xordx,dx ;输入字符清0input02: movah,1 ;键盘输入一个字符
int21hinput之一继续:input之二汇编语言程序设计input10: cmpal,0dh jeinput30 ;是回车,结束整个数据的输入
cmpal,’’ jeinput20 ;是空格和逗号,确认输入了一个数据
cmpal,’,’ jeinput20 cmpal,08h jeinput17 ;是退格,丢弃本次输入的数据,出错input之二继续:input之三汇编语言程序设计
cmpal,’0’ ;有效数字判断部分(图)
jbinput17 ;小于’0’,不是有效数字,出错
cmpal,’f’ jainput17 ;大于’f’,不是有效数字
cmpal,’a’ jbinput11 subal,20h ;小写’a’~’f’转换成大写’A’~’F’ jmpinput12input11: cmpal,’F’ jainput17 ;字符小于’a’、大于’F’,非法字符
cmpal,’A’ jaeinput12 ;是大写’A’~’F’,有效字符
cmpal,’9’ jainput17 ;是’0’~’9’,有效字符input之三input之四汇编语言程序设计input12: cmpdl,0 ;输入有效字符的处理部分
jneinput13 movdl,al ;dl=0,输入了一个数据的低位,则dl←al jmpinput02 ;转到字符输入input13: cmpdh,0 jneinput17 ;dl≠0,dh≠0输入3位数据,出错
movdh,dl ;dl≠0,dh=0输入了一个数据的高位
movdl,al ;dh←dl,dl←al jmpinput02 ;转到字符输入input之四继续:input之五汇编语言程序设计input17: movdl,7 ;输入错误处理,响铃和显示问号
movah,2 int21h movdl,'?' movah,2 int21h jmpinput01 ;转到输入一个数据input之五继续:input之六汇编语言程序设计input20: convert ;转换正确的输入数据(图)
jmpinput01 ;转到输入一个数据input30: convert popdx popax ret ;子程序返回,出口参数已经设定input endpinput之六继续:convert之一汇编语言程序设计;;将DX两位ASCII码转换为两位16进制数(图)convert macro localinput21,input22 localinput24,input25 cmpdl,0 ;;dl=0,没有要转换的数据,退出
jeinput25convert之一继续:convert之二汇编语言程序设计
cmpdl,'9' jbeinput21 subdl,7 ;;是字符A~F(41h~46h),则减7input21: anddl,0fh ;;转换低位
cmpdh,0 ;;dh=0,没有高位数据
jeinput24 cmpdh,'9' jbeinput22 subdh,7input22: shldh,1 shldh,1 shldh,1 shldh,1 ;;转换高位
ordl,dh ;;合并高、低位convert之二继续:convert之三汇编语言程序设计源文件包含的操作步骤:①分别编辑生成各个文件②汇编、连接主程序文件input24: mov[bx],dl ;;存入数据缓冲区
incbx inccx ;;数据加1input25: endmconvert之三汇编语言程序设计把常用子程序写成独立的源程序文件,单独汇编,形成子程序的目标文件.OBJ;主程序也经过独立汇编之后形成目标文件;连接程序将所有目标文件连接起来,最终产生可执行文件。需要遵循的原则:①声明共用的变量、过程等②实现正确的段组合③处理好参数传递问题4.6.2目标代码文件的连接2汇编语言程序设计声明共用的变量、过程各个模块间共用的变量、过程等要用伪指令说明PUBLIC标识符[,标识符...];定义标识符的模块使用EXTERN标识符:类型[,标识符:类型...];调用标识符的模块使用其中标识符是变量名、过程名等;类型是byte/word/dword(变量)或near/far(过程)。在一个源程序中,public/extern语句可以有多条。各模块间的public/extern伪指令要互相配对,并且指明的类型互相一致。汇编语言程序设计实现正确的段组合子程序文件必须定义在代码段中,也可以具有局部的数据变量。采用简化段定义格式,只要采用相同的存储模式,容易实现正确的近或远调用。完整段定义格式中,为了实现模块间的段内近调用(near类型),各自定义的段名、类别必须相同,组合类型都是public。实际的程序开发中,各个模块往往由不同的程序员完成,不易实现段同名或类别相同,所以索性定义成远调用(far类型)。定义数据段时,同样也要注意这个问题。当各个模块的数据段不同时,要正确设置数据段DS寄存器的段基地址。汇编语言程序设计处理好参数传递问题少量参数可用寄存器或堆栈直接传送数据本身;大量数据可以安排在缓冲区,用寄存器或堆栈传送数据的存储地址;还可利用变量传递参数,但是要采用public/extern声明为公共(全局)变量。这些也是子程序间的参数传递方法。另外,第6章混合编程介绍了更好的堆栈传递参数方法,可以采用。汇编语言程序设计例主程序并入宏定义子程序文件,要加上段定义语句、声明语句等,但不需要起始点和结束点模块连接的操作步骤:①分别编辑生成各个文件②分别汇编各个文件③连接各个目标文件,形成 可执行文件汇编语言程序设计 ... ;宏定义
.code publiccount ;定义count共用
externALdisp:near,sorting:near,input:far ;声明其他模块中的子程序
.startup ... .exit0;去掉(中的)包含语句
end汇编语言程序设计 .modelsmall ;定义同样的存储模式
externcount:word ;在其他模块定义了字变量count .code ;子程序在代码段中
publicaldisp,sorting,input ;3个子程序是共用的Aldisp proc ;仍然作为近调用sorting proc ;仍然作为近调用input procfar ;修改为远调用
... movcount,cx ;提供出口参数
...input endp end ;结束汇编汇编语言程序设计把常用子程序写成独立的源文件,单独汇编形成OBJ文件后,存入子程序库;主程序也单独汇编形成OBJ文件;主程序连接时,调入子程序库中的子程序模块,产生最终的可执行文件。例①主程序文件②子程序文件③子程序文件④子程序文件4.6.3子程序库的调入3汇编语言程序设计子程序库子程序库文件(.LIB)是子程序模块的集合,其中存放着各子程序的名称、目标代码以及有关定位信息。存入库的子程序的编写与目标文件连接方法中的要求一样,只是为方便调用,更加严格。例如各个子程序的参数传递方法要一致;子程序类型最好一样(都为FAR或NEAR),都采用相同的存储模式;采用一致的寄存器保护措施和可能需要的堆栈平衡措施等等。子程序文件编写完成后,汇编形成目标文件;然后利用库管理工具程序,把子程序目标模块逐一加入到库中。LIB库文件名+子程序目标文件名库管理程序LIB帮助创建、组织和维护子程序模块库,例如增加、删除、替换、合并库文件等。汇编语言程序设计 ... ;宏定义
.code externALdisp:near,sorting:near,input:near ;声明其他模块中的子程序
.startup ... .exit0 end汇编语言程序设计
.modelsmall .code publicaldispAldisp proc ...Aldisp endp end汇编语言程序设计
.modelsmall .code publicsortingsorting proc ...sorting endp end汇编语言程序设计
.modelsmall .code publicinputinput proc ...input endp end库文件调入的操作步骤:①分别编辑生成各个文件②分别汇编各个文件③用库管理文件,将子程序模块添加到库文件(.LIB)中④连接主程序,提供库文件, 形成可执行文件汇编语言程序设计输入输出程序设计是针对输入输出设备(外设)的程序设计。实际上,处理器是通过I/O接口电路实现与外设的数据交换的,而与外设交换数据只能采用输入输出指令,针对外设端口进行操作。处理器与外设的数据传送方式有主要由软件程序控制的直接、查询和中断方法,还有主要由硬件完成的DMA和I/O处理机方法。本节讨论如何利用I/O程序实现主机与外设的数据传送。4.7输入输出程序设计汇编语言程序设计接口
电路程序员看见的接口电路,是三类可编程寄存器:数据寄存器——它保存处理器与外设间交换的数据;控制寄存器——处理器通过它对外设进行控制;状态寄存器——外设的当前工作状态通过它向处理器提供。在涉及外设操作的输入输出程序中,各种寄存器以I/O地址(端口)体现;对应三类寄存器分别被称为数据端口、控制端口和状态端口。图示I/O接口电路是处理器与外设间的一个桥梁,是协调两者数据传送的逻辑电路。汇编语言程序设计示图
程序员需要理解外设占用哪些端口,各个端口交换什么信息;更进一步需要掌握I/O接口电路的工作原理。返回I/O接口电路的桥梁作用汇编语言程序设计输入
指令输入指令将外设数据传送给CPU内的AL/AXINAL,i8 ;字节输入:AL←I/O端口(i8直接寻址)INAL,DX ;字节输入:AL←I/O端口(DX间接寻址)INAX,i8 ;字输入:AX←I/O端口(i8直接寻址)INAX,DX ;字输入:AX←I/O端口(DX间接寻址)I/O端口具有两种寻址方式直接寻址和DX间接寻址汇编语言程序设计;例:用直接寻址字节输入指令
inal,21h movah,al inal,20h;例:用直接寻址字输入指令
inax,20h;例:用DX间接寻址字输入指令
movdx,20h inax,dx例从端口20H和21H输入一个字量数据汇编语言程序设计输出
指令输出指令将CPU内的AL/AX数据传送给外设OUTi8,AL ;字节输出:I/O端口(i8直接寻址)←ALOUTDX,AX ;字节输出:I/O端口(DX间接寻址)←ALOUTi8,AX ;字输出:I/O端口(i8直接寻址)←AXOUTDX,AX ;字输出:I/O端口(DX间接寻址)←AXI/O端口具有两种寻址方式直接寻址和DX间接寻址汇编语言程序设计例将字节数据80H送到3fcH端口movdx,3fchmoval,80houtdx,al汇编语言程序设计端口
寻址8086用于寻址外设端口的地址线为16条,端口最多为216=65536个(64K),端口号为0000H~FFFFH。直接寻址只用于寻址前256个端口(00H~FFH),操作数i8即为端口号。DX寄存器间接寻址可用于寻址全部64K端口,DX的值就是端口号。对于大于FFH的端口只能采用间接寻址方式。每个端口用于传送外设的一个字节数据。字数据传送实际上利用了连续的两个端口地址。返回端口即I/O地址,是呈现给程序员的外设汇编语言程序设计对于一些工作速度较慢、接口电路较简单的外设,程序中只要执行输入IN或输出OUT指令就可以实现数据传送。这就是所谓的程序直接控制输入输出,也称为无条件传送方式。PC微机的扬声器就可以采用程序直接控制图:扬声器控制接口电路例:扬声器声音的控制4.7.1程序直接控制输入输出汇编语言程序设计示图
返回扬声器发声由PB0和PB1两位控制汇编语言程序设计.modeltiny.code.startupcallspeaker_on ;打开扬声器声音movah,1 ;等待按键int21hcallspeaker_off ;关闭扬声器声音.exit0例主程序:响,按键,停汇编语言程序设计speaker_onproc ;扬声器开子程序
pushax inal,61h ;读取原来控制信息
oral,03h ;D1D0=PB1PB0=11b,其他位不变
out61h,al ;直接控制发声
popax retspeaker_onendp发声扬声器开子程序汇编语言程序设计speaker_offproc ;扬声器关子程序
pushax inal,61h ;读取原来控制信息
andal,0fch ;D1D0=PB1PB0=00b,其他位不变
out61h,al ;直接控制闭音
popax retspeaker_offendp闭音扬声器关子程序汇编语言程序设计处理器不断地主动查询外设的状态,在确信外设可以提供或接受数据时,处理器再进行数据的输入输出。实际的输入输出程序可以规定一个超时参数;以免由于故障等原因而陷入死循环。PC微机的打印机就可以采用程序查询方式例:打印机输出的控制4.7.2程序查询输入输出汇编语言程序设计 movcx,(sizeofokmsg)-1 ;获取打印字符数
movsi,offsetokmsg ;获取打印字符首地址prnbegin: movdx,378h ;打印机基地址
movbx,100 ;超时参数,可视情况设置
moval,[si] ;打印字符
callprintchar ;调用字符打印子程序
jcprnerr ;返回CF=1,打印出错
incsi ;返回CF=0,打印正常
loopprnbegin ;继续例主程序:提供打印基地址、字符和超时参数子程序汇编语言程序设计printcharproc pushcx outdx,al ;向数据端口输出打印字符
incdx ;基地址加1成为状态端口地址print0: subcx,cxprint1: inal,dx ;查询状态端口
testal,80h ;最高位D7反映打印机状态
jnzprint2 ;D7=1,打印机可以接收打印数据
loopprint1 ;D7=0,打印机不能接收打印数据
decbl ;超时参数减1 jnzprint0 ;循环检测查询查询状态端口,最高位D7反映打印机状态原理汇编语言程序设计
stc ;设置出错标志CF=1 jmpprint3 ;退出打印print2: incdx ;基地址再加1成为控制端口地址
moval,0dh ;使最低位D0=1 outdx,al nop ;延时
moval,0ch ;使最低位D0=0 outdx,al ;将打印字符送入打印机
clc ;设置正常标志CF=0print3: popcx ret ;返回printcharendp打印一个字符的打印,返回CF=1打印出错原理汇编语言程序设计打印
原理要打印的字符首先提供给数据端口;然后查询状态端口,确定打印机是否可以接受这个数据;如果打印机还没有准备好接受数据,则继续检测一个固定时间;一旦打印机能够接受数据,处理器利用控制端口将数据提供给打印机。返回打印机占用3个I/O端口:数据、状态和控制汇编语言程序设计外设主动采用中断请求向处理器提出要求;这时,处理器执行事先设计好的中断服务程序,在中断服务程序当中实现数据交换,这就是程序中断输入输出方式。中断是处理器的一个重要技术。8086支持多种中断类型,用0~255向量号区别。中断服务程序在主存的位置,安排在中断向量表中。对程序员来说,关键是编写中断服务程序;让我们由浅而深逐渐展开。4.7.3中断服务程序汇编语言程序设计中断
过程返回中断是由处理器内部或外部原因引起的主程序IRET中断服务程序断点中断请求汇编语言程序设计中断
类型⒈外部中断——来自CPU之外的原因引起的中断可屏蔽中断:可由CPU的中断允许标志IF控制非屏蔽中断:不受CPU的中断允许标志IF控制⒉内部中断——CPU内部执行程序引起的中断除法错中断:执行除法指令,结果溢出产生的0号中断;指令中断:执行中断调用指令INTi8产生的i8号中断;断点中断:用于断点调试(INT3)的3号中断;溢出中断:执行溢出中断指令,OF=1产生的4号中断;单步中断:TF=1在每条指令执行后产生的1号中断。返回外设采用外部可屏蔽中断实现数据交换汇编语言程序设计中断
向量中断向量表存放中断服务程序的起始地址。中断向量表设置在主存的最低1KB区域内,物理地址000H~3FFH。中断向量表从0开始,每4个字节(双字)对应一个中断向量:低字存放中断服务程序的偏移地址IP,高字存放其段地址CS。图示中断向量是指中断服务程序的起始地址向量号n的中断服务程序存放在4×n的物理地址处汇编语言程序设计表返回中断向量表设置在主存的最低1KB区域内向量号n的中断服务程序存放在4×n的物理地址处00000H向量号0的段基地址向量号0的偏移地址00004H向量号1的段基地址向量号1的偏移地址003FCH向量号255的段基地址向量号255的偏移地址物理地址汇编语言程序设计中断服务内部中断服务程序驻留中断服务程序可屏蔽中断服务程序中断开放中断返回过程定义汇编语言程序设计内部中断服务程序中断服务程序采用过程定义伪指令定义,开始通常要执行STI指令开放可屏蔽中断,最后执行IRET指令返回。内部中断服务程序通常采用寄存器传递参数。主程序通过中断调用指令INTn执行内部中断服务程序。主程序在调用内部中断服务程序之前,必须在中断向量表中设置中断服务程序的入口地址。汇编语言程序设计例2.24a—1:中断向量获取;获取中断80h的原入口地址movax,3580hint21hmovintoff,bx ;保存偏移地址movintseg,es ;保存段基地址DOS功能调用INT21H的获取中断向量功能入口参数:AH=35H,AL=中断向量号出口参数:ES:BX=段基地址:偏移地址汇编语言程序设计例2.24a—2:中断向量设置;设置中断80h的新入口地址pushdsmovdx,offsetnewint80hmovax,segnewint80hmovds,axmovax,2580hint21hpopdsDOS功能调用INT21H的设置中断向量功能入口参数:AH=25H,AL=中断向量号;DS:DX=段基地址:偏移地址汇编语言程序设计例2.24a—3:调用内部中断;调用中断80h的服务程序int80h;恢复中断80h的原入口地址movdx,intoffmovax,intsegmovds,axmovax,2580hint21h.exit0 ;返回DOS汇编语言程序设计内部中断服务程序:开头newint80h proc sti ;开中断
pushax ;保护现场
pushbx pushcx pushsi汇编语言程序设计内部中断服务程序:中间 movsi,offsetintmsg movcx,sizeofintmsgdisp: moval,cs:[si] ;字符在代码段
movbx,0 ;采用ROM-BIOS调用
movah,0eh int10h incsi loopdisp汇编语言程序设计内部中断服务程序:结尾 popsi ;恢复现场
popcx popbx popax iret ;中断返回intmsg db'IamGreat!',0dh,0ahnewint80h endp汇编语言程序设计驻留中断服务程序驻留中断服务程序TSR就是将用户的中断服务程序保留在系统主存中,供其他程序使用。实现程序驻留并不难,利用DOS功能调用31h代替4ch终止程序并返回DOS。DOS功能调用INT21H的驻留返回功能入口参数:AH=31H,AL=返回代码,DX=程序驻留的容量(以“节”为单位)汇编语言程序设计例2.24b—1:驻留的程序在前 .modeltiny .code .startup ;等价于org100h ;跳转到本程序的开始执行位置
jmpstartnewint80h proc ;驻留的中断服务程序
... ;同例题过程newint80h endp汇编语言程序设计例2.24b—2:主程序在后start: movax,cs ;主程序开始位置
movds,ax movdx,offsetnewint80h movax,2580h int21h ;设置中断向量
int80h ;调用一下看看
movdx,offsetistmsg movah,9 int21h汇编语言程序设计例2.24b—3:实现驻留返回 ;计算驻留程序的长度(需要多加15个字节)
movdx,(offsetstart)+15 movcl,4 shrdx,cl ;除以16转换成“节”
movax,3100h ;中断服务程序驻留
int21h ;主程序返回DOS系统istmsg db'INT80Hisinstalled!’ db0dh,0ah,'$'汇编语言程序设计可屏蔽中断服务程序可屏蔽中断来自外部,是随机出现的,用于与外设交换数据。可屏蔽中断来受控于中断标志IF;STI指令允许、CLI指令禁止可屏蔽中断。可屏蔽中断还需要中断控制器管理。可屏蔽中断复杂程序编写麻烦编写可屏蔽中断服务程序,注意事项很多;与之配合的主程序也有不少注意事项。汇编语言程序设计可屏蔽中断服务程序的注意事项发送中断结束命令不能采用寄存器传递参数不要使用DOS系统功能调用INT21H中断服务程序尽量短小汇编语言程序设计主程序的注意事项修改中断向量控制CPU的中断允许标志IF设置中断屏蔽寄存器IMR汇编语言程序设计PC键盘工作原理PC微机的键盘采用中断方式向系统提供按键的扫描码。每当用户按下一个键时,键盘就向系统申请键盘中断(中断向量号为9)。在中断服务程序中,通过数据端口60h读取该键的接通扫描码,然后通过控制端口61h的最高位D7应答键盘。而当放开按下的键时,键盘也产生9号可屏蔽中断,只是读取的是断开扫描码。如果一直按住某个键,则键盘以一个固定速率产生中断,不断提供接通扫描码。汇编语言程序设计例2.25——主程序的流程中断向量的获取、保存与设置开始键盘中断,循环等待按下ESC键中断屏蔽寄存器的获取、保存与设置恢复原中断向量和屏蔽寄存器内容中断程序汇编语言程序设计中断向量的获取、保存与设置movax,3509hint21hpushespushbx ;保存原中断向量内容cli ;关中断,以防此时产生键盘中断pushds ;设置新中断向量内容movax,2509hmovdx,segscancodemovds,dxmovdx,offsetscancodeint21hpopds汇编语言程序设计中断屏蔽寄存器的获取、保存与设置inal,21h ;读出IMRpush
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四年级数学(四则混合运算)计算题专项练习与答案汇编
- 静电纺丝法构筑明胶基碳纳米纤维材料及其氧还原性能的深度剖析
- 青藏高原气候变化风险源:时空特征解析与综合聚类探究
- 青蒿琥酯自微乳的制备工艺优化与多维度评价体系构建
- 小学语文拼音测试题库及评分标准
- 雷诺嗪治疗冠心病有效性与安全性的系统剖析:基于Meta分析视角
- 一年级上册语文期末专项练习题
- 雪莲菌菌相剖析及抗癌活性的前沿探索与机制解析
- 高速公路声屏障安装施工方案
- 异味处理设施环保验收方案
- 疏导摊点管理办法
- 广东省珠海市香洲区2024-2025学年八年级下学期期末语文试题(含答案)
- 养老护理员培训课件下载
- 北京市海淀区2023-2024学年五年级下学期英语期末试卷(含答案)
- JG/T 372-2012建筑变形缝装置
- 中国功夫课件
- 大学计算机-计算思维与信息素养 课件 第8章 利用典型计算机语言进行程序设计
- 《传统手工艺》课件
- DB11T583-2022扣件式和碗扣式钢管脚手架安全选用技术规程
- 职业技术学院2024级人工智能技术与应用专业人才培养方案
- 学校“1530”安全教育记录表(2024年秋季全学期)
评论
0/150
提交评论