第5章 汇编语言程序设计_第1页
第5章 汇编语言程序设计_第2页
第5章 汇编语言程序设计_第3页
第5章 汇编语言程序设计_第4页
第5章 汇编语言程序设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第5章汇编语言程序设计5.1概述5.2顺序程序设计5.3分支程序设计5.4循环程序设计5.5子程序设计开始5.1概述5.1.1汇编语言程序设计的一般步骤5.1.2流程图返回本章首页5.1.1汇编语言程序设计的一般步骤汇编语言程序设计一般有以下几个步骤:1.分析问题,确定算法2.绘制流程图3.根据流程图编制程序4.调试程序返回本节5.1.2流程图1.流程图的概念 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。2.流程图符号表示(1)起止框:表示程序的开始和结束。起止框(2)判断框

(3)处理框

(4)调用框

(5)指向线

返回本节5.2顺序程序设计

一个程序通常都是从外部读取一些数据,然后进行处理,再把处理的结果送到输出设备上.对于一些简单的数据处理,只要把完成处理的各个步骤用汇编语言描述清楚,让计算机按指令编写的次序从头到尾逐条执行即可,这样的程序结构称为顺序结构。[例1]已知X和Y是数据段中的两个无符号字节单元,用程序完成Z=(X2+Y2)/2的计算。

DATASEGMENTXDB15YDB34ZDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XMULAL;计算X2MOVBX,AX

MOVAL,YMULAL;计算Y2ADDAX,BX;计算X2+Y2MOVCL,2;计算(X2+Y2)/2DIVCLMOVZ,ALMOVAH,4CHINT21H;返回DOSCODEENDSENDSTART

[例2]从键盘读入两个一位数(假设按下的肯定是数字键),编程序显示它们的乘积。CODESEGMENTASSUMECS:CODESTART:MOVAH,1INT21HMOVBL,ALMOVAH,1INT21HSUBAL,30HSUBBL,30HMULBL;积在AX中MOVBL,10DIVBLADDAX,3030H

MOVBX,AXMOVDL,BLMOVAH,2INT21H;输出十位数MOVDL,BHMOVAH,2INT21H;输出个位数MOVAH,4CHINT21H;返回DOSCODEENDSENDSTART

5.3分支程序设计

计算机可根据不同条件进行逻辑判断,通过转移指令选择不同的程序流向。转移指令分为无条件转移指令和条件转移指令。在设计分支程序前,请复习第3章有关转移指令的内容,尤其是条件转移指令。能否正确使用这些转移指令,是能否编写好分支程序的关键。

分支程序设计要领如下:(1)首先要根据处理的问题用比较、测试等方式,或者用算术运算、逻辑运算,使标志寄存器产生相应的标志位。(2)根据转移条件选择转移指令。通常一条条件转移指令只能产生两路分支,因此要产生n路分支需n-1条条件转移指令。(3)各分支之间不能产生干扰,如果产生干扰,可用无条件转移语句JMP进行隔离。

1x>0

[例5-7]符号函数y=0x=0其中x为8位带符号数。

-1x<0分析:设x的值(x)放在数据段XX单元中,Y的值(y)放在YY单元中。寄存器选用AL存放中间结果。程序流程图见右图。

DATASEGMENTXXDB45HYYDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,XXCMPAl,0;置标志位JGEBIGR;X≥O转移MOVAl,-1;-1送YY

JMPJUS2;隔离BIGR:JGJUS1;X>0转移MOVAL,0;0送YY

JMPJUS2;隔离JUSl:MOVAL,1;1送YYJUS2:MOVYY,ALMOVAH,4CHINT21HCODEENDSENDSTART5.4循环程序设计

一个循环程序通常由四部分组成:

1)初始化部分为循环操作做准备工作,建立循环的初始值,如初始化地址指针、计数器及给变量赋初值等。

2)循环体循环体为循环的工作部分,用于完成各种具体操作,它可以是一个顺序结构、分支结构或又一个循环结构。若循环体内又包含有循环程序,则称为多重循环。

3)修改部分为执行循环而修改某些参数,如地址指针、计数器或某些变量。

4)控制部分判断循环是否结束,通常判断循环是否结束主要有两种方法:(1)计数器控制循环,这种方式一般用于循环次数已知的情况;(2)条件控制循环,用于循环次数未知根据条件决定是否结束。循环程序的常见结构形式如图5.5(a)、(b)所示。图5.5循环程序结构图

20

[例4]计算y=∑Ai

i=l设Al,A2,…,A20是一组无符号16位二进制数。分析:定义数组名TABL存放A1,A2,…,A20,和存放于单元YY中。中间结果存于寄存器AX中,BX寄存器为地址指针,CX寄存器作计数器。程序如右:

DATASEGMENTTABLDWA1,A2,…,A20YYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVBX,0MOVCX,20;初始化LOP:ADDAX,TABL[BX];循环体ADDBX,2;修正LOOPLOP;控制部分MOVYY,AXMOVAH,4CHINT21HCODEENDSENDSTART[例5]现将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中去。DATASEGMENTAREA1DB100DUP(11H)AREA2DB100DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,0MOVDI,0MOVCX,100AGAIN:MOVAL,AREA1[SI]MOVAREA2[DI],AL

INCSIINCDILOOPAGAINMOVAH,4CHINT21HCODEENDSENDSTART5.5子程序设计引例:编程实现分四行显示任意输入的四个字符start:movah,01hint21h

回车换行movah,01hint21h

回车换行movah,01hint21h

回车换行movah,01hint21h回车换行相关程序段:movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21h

程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段,当需要执行这个程序段时,可以用调用指令调用它。具有这种独立功能的程序段称为过程或子程序。适合编成子程序的程序有以下两大类:

(1)程序需要反复使用,这类程序编写成子程序可避免重复编写程序,并节省大量存储空间。

(2)程序具有通用性,这类程序大家都要用到,如键盘管理程序、磁盘读写程序、标准函数程序等。编成子程序后便于用户共享。为了使用户使用方便,子程序文件由子程序说明和子程序本身两部分构成。

1.过程定义伪指令

1)子程序说明部分

●子程序的名称;●子程序的功能;●使用的寄存器和存储单元;●子程序的人口、出口参数。下面是一个子程序说明部分的例子:;子程序DTOB;将两位十进制数(BCD码)转换成二进制数;寄存器BX传递参数;入口参数:AL寄存器存放十进制数;出口参数:CL寄存器存放转换后的二进制数

2)子程序程序部分格式:子程序名PROC┊

RET┊子程序名ENDP

子程序从PROC语句开始,以ENDP语句结束,程序中至少应当包含一条RET语句用以返回主程序。

2.子程序使用中的问题1)子程序的调用和返回

CALL子程序名2)调用子程序时寄存器及所用存储单元内容的保护如果子程序中要用到某些寄存器或存储单元时,为了不破坏原有的信息,要将寄存器或存储单元的原有内容压栈保护,或存入子程序不用的寄存器或存储单元中。

保护可以放在主程序中,也可以放在子程序中,但放在子程序中较好。例如:

SUBPPROCNEAR

PUSHAXPUSHBX┊

POPBXPOPAX

RETSUBPENDP

3.子程序调用时参数的传递方法调用程序在调用子程序时需要传送一些参数给子程序,这些参数是子程序运算中所需要的原始数据,子程序运行后要将处理结果返回调用程序。原始数据和处理结果的传递可以是数据,也可以是地址,统称为参数传递。

参数传递必须事先约定,子程序根据约定从寄存器或存储单元取原始数据(称入口参数);进行处理后将处理结果(称出口参数)送到约定的寄存器或存储单元,返回到调用程序。参数传递一般有下面三种方法。(1)用寄存器传递:适用于参数传递较少、传递速度快的情况:(2)用堆栈传送:适用于参数传递较多、存在嵌套或递归的情况:(3)用存储单元传送:适用于参数传递较多时,但传递速度较慢。(1)用寄存器传递参数

采用寄存器传递参数是把参数存于约定的寄存器中,这种方法简单易行,经常采用。[例6]设ARRAY是10个元素的数组,每个元素是字节数据。试用子程序计算数组元素的校验和,并将结果存入变量RESULT中。所谓“校验和”,是指不记进位的累加,常用于检查信息的正确性。分析:子程序完成元素求和,主程序需要向它提供入口参数,使得子程序能够访问数组元素。子程序需要回送求和结果这个出口参数。在本例中采用寄存器传递参数。DATASEGMENTARRAYDB01H,22H,33H,14H,……,90HRESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETARRAYMOVCX,10MOVAL,0

CALLCHECKSUMAMOVRESULT,ALMOVAH,4CHINT21HCODEENDSENDSTART;计算字节校验和的通用过程;入口参数:DS:BX=数组的段地址:偏移地址CX=元素个数;出口参数:AL=校验和;说明:除AX/BX/CX外,不影响其他寄存器CHECKSUMAPROCSUMA:ADDAL,[BX]INCBXLOOPSUMARETCHECKSUMAENDP(2)用存储单元传送参数主程序与被调用过程直接用同一个变量名访问传递的参数,就是利用变量传递参数。如果调用程序与被调用程序在同一个源程序文件中,只要设置好数据段寄存器DS,则子程序与主程序访问变量的形式相同,也就是他们共享数据段的变量。[例7]针对例6的问题,现在用变量传递参数、计算数组元素的和。DATASEGMENTARRAYDB01H,22H,33H,14H,……,90H

COUNTEQU$-ARRAYRESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXCALLCHECKSUMA

MOVAH,4CHINT21HCODEENDSENDSTART;计算字节校验和的通用过程;入口参数:ARRAY=数组名,COUNT=元素个数;出口参数:RESULT=校验和存放的变量名CHECKSUMAPROC

PUSHAXPUSHBXPUSHCXMOVBX,OFFSETARRAYMOVCX,10XORAL,ALSUMA:ADDAL,[BX]INCBXLOOPSUMAMOVRESULT,AL

POPCXPOPBXPOPAXRETCHECKSUMAENDPcodesegmentassumecs:codestart:movah,01hint21h

calldpcrlfmovah,01hint21h

calldpcrlfmovah,01hint21h

calldpcrlfmovah,01hint21h

movah,4chint21hdpcrlfproc

pushaxpushdxmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21h

popdxpopax

retdpcrlfendpcodeendsendstartDATASEGMENT

STRDB10DUP(‘1ASz#’)

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVCX,50MOVSI,0MOVDL,0CMP1:CMPDL,STR[SI]JAEOUT1

MOVDL,STR[SI]OUT1:INCSILOOPCMP1MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART习题22答案(1)DATASEGMENT

STRDB10DUP(‘1ASz#’)

DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVCX,49MOVSI,1MOVDL,STRCMP1:CMPDL,STR[SI]JAEOUT1

MOVDL,STR[SI]OUT1:INCSILOOPCMP1MOVAH,2INT21HMOVAH,4CHINT21HCODEENDSENDSTART习题22答案(2)24

DATASEGMENT

DATDB45H,13H,55HDATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,DATMOVBL,DAT+1MOVCL,DAT+2……………MOVAH,4CHINT21HCODEENDSENDSTARTMOVAL,DATMOVBL,DAT+1MOVCL,DAT+2

CMPAL,BLJAA1XCHGAL,BLA1:CMPAL,CLJAA2XCHGAL,CLA2:MOVDAT,AL

CMPBL,CLJAA3XCHGBL,CLA3:MOVDAT+1,BLMOVDAT+2,CL习题29答案DATASEGMENTNUMDB‘1ABaf….’DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVCX,100MOVBX,0LOOP1:CMPNUM[BX],39HJAA2

SUBNUM[BX],30HJMPOUT1A2:CMPNUM[BX],5AHJAA3SUBNUM[BX],37HJMPOUT1A3:SUBNUM[BX],57HOUT1:INCBXLOOPLOOP1MOVAH,4CHINT21HCODEENDSENDSTART习题31答案DATASEGMENTSTRDB‘1ASAB….’

NEQU$-STRRESULTDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,N-1MOVSI,0

温馨提示

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

评论

0/150

提交评论