大综合课件微机原理上课章_第1页
大综合课件微机原理上课章_第2页
大综合课件微机原理上课章_第3页
大综合课件微机原理上课章_第4页
大综合课件微机原理上课章_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

3.6子程序设计子程序的概念子程序的调用和返回指令子程序及其调用程序设计过程的定义及功能调用3.6.1子程序的概念把功能相对独立的程序段单独编写和调试,作为一个相对独立的模块供程序使用,就形成子程序。子程序可以实现源程序的模块化,可以简化源程序结构,可以提高编程效率。基本定义:子程序调用:进入子程序的操作;子程序返回:子程序返回到主程序的操作;主程序与子程序相互传递的信息称为参数;主程序提供给子程序以便加工处理的信息称为入口参数;经子程序加工处理后回送给主程序的信息称为出口参数。

3.6.2.子程序/过程调用和返回指令过程(子程序)一段具有特定功能的,供其它程序调用的公用程序。特点调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。子程序执行结束后一般均要返回调用程序。一次定义,多次调用;可带参数调用,以完成不同的功能。优点程序代码短,结构清晰,便于编程、调试、修改和阅读。两条相关指令:子程序调用指令CALL子程序返回指令RET一般格式:CALLsub

;sub为子程序的入口根据子程序入口的寻址方式,子程序调用有四类。①段内直接调用子程序的偏移地址直接由CALL指令给出。格式:CALLnear_proc

CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。

注:汇编以后的调用地址是相对于CALL的下一条指令的位移量。例:CALL0120H;子程序偏移地址由指令给出(1)调用指令CALL位移量由汇编程序在汇编时进行计算,如下例:CS:0102 CALL0120H ;3字节

CS:0105……

则位移量为:0120-0105H=001BH于是CALL 0120H的机器码为E81B00CS:0102 E8CS:0103 1BCALL0120HCS:0104 00CS:0105……

子程序的偏移地址在寄存器或存储器中。格式:CALLmem16/reg16CALL执行时,它首先将IP内容压栈,然后把指定的寄存器/存储器的内容送入IP。例:CALL AX;调用地址由AX给出 CALL WORDPTR[SI];调用地址由存储器给出②段内间接调用CALL

IPHIPL代码段数据段对于CALLWORDPTR[SI]这条指令若:(DS)

=

8000H,(SI)

=

1200H则指令操作图示如下。81200H81201H子程序的段地址和偏移地址直接由CALL指令给出。

格式:CALLfar_proc;far_proc为远过程的地址指令的操作为:

“SP←(SP)-2”((SP)-2,(SP)-1))←(CS);CS压栈CS←段地址

“SP←(SP)-2”((SP)-4,(SP)-3))←(IP);IP压栈IP←偏移地址例:CALL 2000H:1000H③段间直接调用子程序的段和偏移地址为存储器的连续4个单元中的内容。

格式:CALLmem32指令的操作为:

“SP←(SP)-2”((SP)-2,(SP)-1))←(CS);CS压栈CS←(mem32+2)

“SP←(SP)-2”((SP)-4,(SP)-3))←(IP);IP压栈IP←(mem32)例:CALLDWORD

PTR[DI]

调用地址在[DI],[DI]+1,[DI]+2,[DI]+3四个存储单元中。低字内容为偏移地址,高字内容为段地址。④段间间接调用CALL代码段数据段

IPHIPL

CSHCSL[DI][DI]+1[DI]+2[DI]+3段间间接调用示意图CALLDWORD

PTR[DI]

例:下面的程序执行后,(AX)=?(DX)=?

CS:2000HMOVAX,2012H2003HMOVCX,200CH2006HPUSHCX2007HCALL4000H200AHADDAX,BX200CHADDAX,DX200EHHLT…………CS:4000HMOVBX,200AHPOPDXRET段内返回指令RET的操作为:

IP←((SP)+1,(SP));栈顶内容弹出到IPSP←(SP)+2段间返回指令RET的操作为:

IP←((SP)+1,(SP));栈顶内容弹出到IP

“SP←(SP)+2”CS←((SP)+3,(SP)+2);栈顶内容弹出到CS

“SP←(SP)+2”另有一种带立即数返回指令:RETn其中n为偶数,表示从栈顶弹出地址后另外丢弃的字节数。例:RET4;返回后再丢弃栈顶的4个字节(2)返回指令RET过程的定义过程由伪指令PROC和ENDP定义。定义过程的格式为:

过程名PROC[NEAR]或FAR

过程名ENDP

其中,PROC和ENDP必须成对出现,且前面都有同一过程名,过程的类型由PROC的操作数指出。若PROC后无操作数,则默认为NEAR类型。子程序也可以用“:”定义,“:”定义的标号是为该子程序起的名字。主程序把用“:”定义的子程序作为远过程来调用。若子程序与调用它的主程序在同一代码段,则必须用过程来定义该子程序。中断调用都是远调用,所以中断服务子程序用“:”定义。若用过程来定义中断服务子程序定义过程为远过程,而不论他与调用程序是否在不同的代码段。(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用)codesegment

mainprocfar......

callsubr1......retmainendpsubr1procnear......retsubr1endpcodeendscodesegment

mainprocfar......

callsubr1......retsubr1procnear......retsubr1endpmainendpcodeends例1调用程序和子程序在同一代码段中例2调用程序和子程序不在同一代码段中

sagxsegment

subtprocfar......retsubtendp......

callsubt......

segxendssegysegment

......

callsubt......

segyends段的定义段的定义通过SEGMENT和ENDS伪指令进行。定义一个段的格式是:段名

SEGMENT[定位方式][组合方式]['类别名']

段名ENDS

其中,SEGMENT和ENDS必须成对出现,它们的前面需有相同的名字,该名字为段名。

例:STACKSEGMENTSTACKDW20DUP(?)STACKENDS

伪指令SEGMENT有3个可选择的操作数:定位方式,组合方式和类别名。汇编地址计数器汇编地址计数器用符号$表示,它用来记录正在被汇编程序汇编的指令的地址,即它的内容标出了汇编程序当前的工作位置。汇编程序为每个段分配一个汇编地址计数器。对需要分配存储单元的变量和产生目标代码的指令,$就按存储单元数和目标代码的长度增值。因此,段内定义的所有标号和变量的偏移地址就是当前值。

DATASEGMENTBUFDB'ABCDEF'COUNTEQU$-BUFDATAENDS

常量COUNT的值就是变量BUF数据区所占的存储单元数16。

$可以用作指令的操作数,此时$的值就是该指令的偏移地址。

$也可以出现在表达式中。如:$的值可以用伪指令ORG来设置。其格式是:

ORG数值表达式功能是将$设置成数值表达式的值(0000H~FFFFH之间的整数)。e.gORG$+8

段寄存器的假定

存储单元的段地址来自某个段寄存器。源程序在代码段的开始就要对段寄存器与段之间的关系作假定,以便宏汇编程序MASM汇编时根据指令给定的偏移地址和段寄存器中的段地址计算出正确的物理地址。段寄存器与段的关系,由伪指令ASSUME设定,设定格式是:

ASSUMESREG:SNAM[,SREG:SNAM,……]其中SREG为4个段寄存器CS、SS、DS、ES中的任一个,SNAM是段名。需要说明的是,伪指令ASSUME只是将段寄存器与段间的对应关系告诉汇编程序,它并没有将段首址置入对应的段寄存器中,这一工作要到程序最后投入运行时才能完成。那时系统自动将代码段和堆栈段的段首址分别置入CS和SS,将PSP(programsegmentprefix)的段首址同时置入DS和ES。因此CS和SS不用程序处理;但对DS和ES,则必须由程序将其段首址分别置入。例如:CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKMOVAX,DATAMOVDS,AX

…CODEENDS源程序的结束源程序的结束要用伪指令END,其格式是:

END[表达式]该伪指令用在源程序的最后,用以表示整个源程序的结束,即告诉汇编程序,汇编工作到此结束。其中可选项表达式的值必须是存储器的地址,该地址即为程序的启动地址,亦就是程序的第一条可执行指令的地址。表达式一般为过程名。如果不带表达式,则该程序不能单独运行,只是供其他程序调用的子模块。宏汇编源程序的格式宏汇编源程序一般由3个段组成,其格式如下:stacksegmentstack'stack'dw32dup(?)stackendsdatasegmentdataendscodesegmentbeginprocfarassumess:stack,cs:code,ds:data

pushdssubax,axpushaxmovax,datamovds,ax …… ……retbeginendpcodeendsendbegin常用系统功能调用

IBMPC微机系统为汇编用户提供了两个程序接口。一个是DOS系统功能调用,另一个是ROM中的BIOS(basicinput/outputsystem)。系统功能调用和BIOS由一系列的服务子程序构成,但调用与返回不是使用子程序调用指令CALL和返回指令RET,而是通过软中断指令INTN和中断返回指令IRET调用和返回。我们仅介绍DOS系统功能调用。系统功能调用系统功能调用是IBMPC微机系统为汇编用户提供的一个程序接口。系统功能调用共有4类。我们仅介绍设备管理系统功能调用中基本的I/O管理功能。使用系统功能调用的一般过程为:把调用号放入AH中,设置入口参数,然后执行INT21H指令,最后分析处理出口参数。调用方法设置入口参数在AH设置功能号m执行中断指令INTN分析、应用出口参数

1.1号功能调用

MOVAH,1INT21H

执行该调用时将等待键入,一旦有键按下就将该按键字符的ASCII码读入AL,并同时显示该字符。

2.2号功能调用

MOVDL,待显示字符的ASCII码

MOVAH,2INT21H

本调用执行后,显示器显示待显示的字符。

3.9号功能调用

MOVDX,待显示字符串的首偏移地址

MOVAH,9INT21H

本调用执行后,显示器显示待显示的字符串。执行前要在D

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论