微机原理:第4章 程序设计2_第1页
微机原理:第4章 程序设计2_第2页
微机原理:第4章 程序设计2_第3页
微机原理:第4章 程序设计2_第4页
微机原理:第4章 程序设计2_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

§4

程序设计

汇编语言程序设计步骤:1.分析问题,确定算法

2.编制程序流程图

3.编制程序

4.调试程序

一个源程序的基本格式如下:DATASEGMENT•DATAENDSEXTRASEGEMNT•

EXTRAENDSSTACK1SEGMENTPARASTACK•STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATAASSUMESS:STACK1,ES:EXTRA••••••;存放数据项的数据段;存放数据项的附加段;堆栈段START:MOVAX,DATAMOVDS,AXMOVAX,EXTRAMOVES,AXMOVAH,4CHINT21HCODEENDSENDSTART••••••(核心程序段);DD装入段基址;ES装入段基址;系统功能调用;返回操作系统(一)顺序结构程序例1编制程序,求下列公式中的Z值,并将结果存放到RESULT单元中。

=Z(X+Y)*8-X2

设X,Y的值分别存放在VARX,VARY单元中,运算结果不超过16位。解:(1)存储单元RESULT用来存放结果,VARX和VARY放

X、Y的值。寄存器DX放中间运算结果,左移1位相当于乘2,右移1位相当于除2,所以可以用左移3位得到乘以8的结果。

(2)程序流程图和程序如下:开始预置段寄存器DXXDXX+YDX右移得((X+Y)*8-X)/2RESULTDX结束DX左移3次(X+Y)*8DX(DX)-XDATASEGMENTVARXDW0006HVARYDW0007HRESULDW?DATAENDSSACK1SEGMENTPARASTACKDW100HDUP(?) SACK1ENDSCOSEGSEGMENTASSUMECS:COSEGASSUMEDS:DATAASSUMESS:STACK1START:MOVAX,DATAMOVDS,AXMOVDX,VARX;DXXADDDX,VARY;DXX+YMOVCL,3SALDX,CL;DX(X+Y)*8SUBDX,VARX;DX(X+Y)*8-XSARDX,1;DX((X+Y)*8-X)/2MOVRESULT,DXMOVAH,4CH;系统功能调用,返回操作系统

INT21HCOSEGENDSENDSTART

例:顺序程序设计

设:在内存XX单元中存放数x(0<x<9的整数),查表求x的平方值,并将结果存入YY单元中。

DATASEGMENTTABDB0,1,4,9,16,25DB36,49,64,81XXDB2YYDB?DATAENDSTAB+00+11+24+981+A2+B4

CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAH,0MOVAL,XXMOVBX,OFFSETTABADDBX,AXMOVAL,[BX]MOVYY,ALMOVAH,4CHINT21HCODEENDSENDSTART}XLAT(二)、分支程序条件转移:JX目标用于程序需要进行分别处理的情况。主要使用转移指令。转移指令分为无条件转移指令和条件转移指令。无条件转移指令:JMP目标在进行分支程序设计时,通常用比较、测试,或算术运算、逻辑运算影响标志位,然后选择转移指令。分支程序结构开始条件?A块存结果结束成立不成立初始化开始条件?A块B块存结果结束成立不成立初始化例:分支程序设计

y=1x>00x=0-1x<0设:x为8位有符号数开始预置段RALXAL>0AL>0AL-1AL0AL1NYNYYAL结束DATASEGMENTXDBxYDB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAL,X

CMPAL,0

;x-0建标志位

JGEBIGD

;x0转移

MOVAL,-1;x<0

JMPJUS2BIGD:JGJUS1

;x>0转移

MOVAL,0;x=0

JMPJUS2JUS1:MOVAL,1;x>0

JUS2:MOVY,AL

MOVAH,4CHINT21HCODEENDSENDSTART入口初始化部分循环体修改部分结束?出口YN(A).循环的基本结构先执行,后判断结构设:循环次数为N正计数法:倒计数法:MOVCX,NMOVCX,0L:L:

DECCXINCCXJNZLCMPCX,NJNZL…………三、循环程序结构入口初始化部分循环结束?循环体修改部分出口YN用于当计数次数无法确定,但循环次数与某些条件有关,并且条件可检测时,可采用条件控制。

先判断,后执行结构

循环控制指令LOOPLOOP标号;(CX)-1CX,(CX)=0时转标号LOOPE/LOOPZ标号;(CX)-1CX(CX)=0且ZF=1(相同)时转标号LOOPNZ/LOOPNE标号;(CX)-1CX(CX)=0且ZF=0(不同)时转标号例如:MOVCX,10MOVCX,10

L1:……….L1:………

CMPAX,X

LOOPL1

LOOPEL1

}相同不同或全比较完ZF=0(CX)=0例1:

计算Y=

程序如下:DATASEGMENTTABLDWa1,a2,······,a20

YYDW?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;

MOVDS,AXMOVAX,0LEABX,TABLMOVCX,20L0:ADDAX,[BX];循环体

INCBX;修改部分

INCBXLOOPL0;控制部分

MOVYY,AX

MOVAH,4CHINT21HCODEENDSENDSTART设a1,a2,···a20是一组无符号十六位二进制数,并设其和不大于2个字节。定义数组名TABL存放a1~a20;和存放于单元YY中。中间结果存于寄存器AX中。BX寄存器为地址指针,CX寄存器作计数器。例2.编程统计数据块中正数的个数,并将其送RS单元中。解:数据块定义为D1,RS单元存放正数的个数,数据块长度用COUNT表示。BX作地址指针,CX作计数器,DX记录正数的个数,程序流程图如下所示:START预置段RBXD1DX0CXCOUNT[BX]>0?DXDX+1BXBX+1CXCX-1CX=0?RS(DX)ENDNYNYDATASEGMENTD1DB-1,-3,5,7,-9,···,-6RSDW?COUNTEQU$-D1DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,OFFSETD1MOVCX,COUNTMOVDX,0MOVRS,DXMOVAH,4CHINT21HCODEENDSENDSTARTLOOPLOP1LOP1:MOVAL,[BX]CMPAL,0JLEJUSTIJUSTI:INCBXDECCXJNZLOP1INCDX例3:AX寄存器中有一个16位的二进制数,编程统计其中值为1的位的个数,并将结果存于CX中。STARTCX0AX=0?AX左移CF=0?CXCX+1ENDYNYN程序段如下:

MOVCX,0LOP:ANDAX,AX

;建标志位

JZSTOP

;AX=0停机

SALAX,1JNCNODINCCXNOD:JMPLOPSTOP:MOVAH,4CHINT21H由于AX有可能为0,若AX=0则不必再往下作统计工作,因此可采用先判断,后执行结构。流程图如右:(B).循环控制方式1.计数控制用于计数次数已知的情况,可采用正计数或倒计数法。如例12.条件控制当计数次数无法确定,但循环次数与某些条件有关,并且条件可检测时,可采用条件控制,例如检测,比较或判断等形式。例4.在一串字符串中查找某一关键字‘#’,若查到,记下存放该关键字单元的偏移地址,若找不到用-1作标记。解:设串变量名STRING,关键字单元CHAR,关键字单元的偏移地址放FLAG单元。寄存器SI为字符串的地址指针,CX为字符串长度,AL用于放关键字‘#’。STARTSISTRING的EACX串长度

AL‘#’[SI]=AL?SI=SI+1CX-1=0?FLAG-1ENDFLAGSIYNYN还可用字符串指令实现(C)多重循环结构

外层初始化内层初始化循环体内层循环参数修改控制内层循环外层循环参数修改控制外层循环外层循环体序号数8516328412345例:A数组中有N个数,将它们按从大到小的顺序排列。冒泡排序法

从第一个数开始依次对相邻的两个数进行比较若顺序正序,不交换两数位置;若顺序不正序,交换两数位置。816328451632848532841685843216851234比较次序流程图:STARTCXN—1DICXBX0AXA[BX]A[BX+2]A[BX]BXBX+2DIDI-1ENDAX>A[BX+2]?DI=0?CX-1=0?NYNYNY交换标志=0NY交换标志=1?交换标志=1DATASEGMENTADW50DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVCX,50DECCXLP1:MOVDI,CX;外循环

MOVBX,0LP2:MOVAX,A[BX];内循环

CMPAX,A[BX+2]JGCONT

XCHGAX,A[BX+2]MOV[BX],AXCONT:ADDBX,2

DECDIJNZLP2

LOOPLP1MOVAH,4CHINT21HCODEENDSENDSTARTDATASEGMENTADWnDUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

MOVCX,NDECCXLP1:MOVDI,CX;外循环

MOVBX,0

MOVDX,0;未交换标志0LP2:MOVAX,A[BX];内循环

CMPAX,A[BX+2]JGCONT

XCHGAX,A[BX+2]MOV[BX],AX

MOVDX,1;交换标志1CONT:ADDBX,2

DECDIJNZLP2

CMPDX,0

JZL1LOOPLP1L1:MOVAH,4CHINT21HCODEENDSENDSTART

子程序设计中的问题:

子程序的调用和返回

子程序调用时参数的传递方法四、子程序结构子程序名PROC[NEAR/FAR]

RET[n]子程序名ENDP……子程序的调用和返回CALL

子程序名

RET[n]断点入口……….CALL

;断点入栈、取子程序入口RET[n];断点出栈,若带有n,继续弹出断点以下的n个字节的数据。SPSPSP断点CS断点IP栈底CALL断点IP断点CSIPCSRET

子程序调用时参数的传递方法

调用程序被调用程序

参数传递:

(1)寄存器传递:参数较少(2)存储单元传递:参数较多(3)堆栈传递:子程序嵌套或递归调用

数据结果子程序设计举例:求十进制数的和

1.用寄存器

温馨提示

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

评论

0/150

提交评论