收藏 分享(赏)

第五章汇编语言程序设计.ppt

上传人:s36f12 文档编号:5956962 上传时间:2019-03-22 格式:PPT 页数:82 大小:520KB
下载 相关 举报
第五章汇编语言程序设计.ppt_第1页
第1页 / 共82页
第五章汇编语言程序设计.ppt_第2页
第2页 / 共82页
第五章汇编语言程序设计.ppt_第3页
第3页 / 共82页
第五章汇编语言程序设计.ppt_第4页
第4页 / 共82页
第五章汇编语言程序设计.ppt_第5页
第5页 / 共82页
点击查看更多>>
资源描述

1、第5章 汇编语言程序设计 汇编语言程序的步骤:1)明确任务,确定算法。2)绘流程图。3)根据流程图编写汇编语言程序。4)上机调试程序。,图5-1 标准流程图符号,5.1 汇编语言程序的上机过程 1、源文件的建立和汇编 (1)建立源程序文件 (2)汇编源程序文件 汇编程序主要功能:检查源程序中的语法错误并给出出错信息。产生目标文件,列表文件和对照文件。展开宏指令。,汇编操作过程:设在当前C盘上已经建立了一个扩展名为ASM的源程序文件MYASM,汇编时发出如下命令: C:MASM MYASM (或MASM MYASM.ASM ) 具体的三个输入提示行显示如下:Object Filename MYA

2、SM.OBJ:Source Listing NUL.LST:(可打入源文件名或省略)Cross Reference NUL.CRF:(可打入源文件名或省略) 汇编程序对源文件进行汇编,若无错误信息则显示如下结果:0 Warning Errors0 Severe Errors,2.目标文件的链接 连接软件LINK的功能:找到要连接的所有目标文件;确定所有段的地址值;确定所有浮动地址和外部符号所对应的存储地址;生成.EXE可执行文件。,连接软件为 LINK.EXE,其过程如下: 设源文件MYASM.ASM已经由汇编软件汇编后生成MYASM.OBJ,其连接命令为: C:LINK MYASM 或 LI

3、NK MYASM.OBJ则在屏幕上显示连接软件的版本号和三个输入提示行,三个输入提示行显示如下:Run File MYASM.EXE:List File NUL.MAP:Libraries .LIB: 3.执行文件的调试,5.2 顺序结构程序设计,例5-1 用8086CPU的指令实现Y=(X1+X2)/2的程序设计 (1)明确任务,确定算法。 (2)绘流程图(图5-3),图5-3 例5-1流程图,(3)根据流程图编写汇编语言程序1 DATA SEGMENT2 X1 DB ?3 X2 DB ?4 Y DW ?5 DATA ENDS6 CODE SEGMENT7 ASSUME CS:CODE, D

4、S:DATA,8 MAIN PROC FAR ;设置远程调用子程序9 START: PUSH DS ;将DS:0压入堆栈,10 MOV AX, 0 ;9-11用户程序返回操作系统,11 PUSH AX 12 MOV AX, DATA ;为DS设置段值13 MOV DS, AX14 MOV AL, X1 ;取变量X1送AL15 MOV BL, X2 ;取变量X2送BL16 ADD AL, BL17 ADC AH, 0 ;X1+X2+进位送AX18 SAR AX, 119 MOV Y, AX ;结果送Y20 RET21 MAIN ENDP22 CODE ENDS23 END START,例5-2

5、将一位十六进制数转换成与它相应的ASC码。 (1)明确任务,确定算法。 (2)绘流程图(图5-4),图5-4 例5-2流程,(3)根据流程图编写汇编语言程序 DATA SEGMENT TAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 8ASC DB ? DATA ENDS COSEG SEGMENTASSUME CS:COSEG,DS:DATA BEING: MOV AX,DATAMOV DS,AX,MOV BX, OFFSET TABMOV AL,HEXXLATMOV ASC,ALMO

6、V AH,4CHINT 21H COSEG ENDSEND BEING,5.3 分支结构程序设计,5.3.1 二分支结构例5-3 要求对不足250个的学生成绩进行统计分析,统计出优秀、及格和不及格的人数。 (1)明确任务,确定算法。,(2)绘流程图,图5-6 例5-3流程图,(3)根据流程图编写汇编语言程序DATA SEGMENTBUF DB NDB N DUP(?)NUM DB 3 DUP(?)DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART: PUSH DSSUB AX,AXPUSH AXMOV AX,DATA MO

7、V DS,AXMOV SI,OFFSET BUFMOV CH,SI ;学生个数NCHMOV CL,0 ;CL存不及格人数,MOV BX,0 ;BH存优秀人数,BL存及格人数INC SI LP: MOV AH, SI ;取学生成绩CMP AH,90JB BLOW90 ;小于90转INC BH ;优秀人数加1JMP ABOV60 BLOW90: CMP AH,60JB BLOW60 ;小于60转 ABOV60: INC BL ;及格人数加1JMP NEXT BLOW60: INC CL ;不及格人数加1NEXT: INC SI ;数组地址加1DEC CH ;计数减1JNZ LPMOV SI,OFF

8、SET NUMMOV SI,BH ;优秀人数送入内存单元MOV SI+1,BL ;及格人数送入内存单元,MOV SI+2,CL ;不及格人数送入内存单元RET MAIN ENDP CODE ENDSEND START,5.3.2 多分支结构 1.条件逐次测试法 例5-4 编程实现使键盘上A、B、C、D4个字母键成为4条输 入命令,使之分别对应不同算法的控制子程序。 (1)明确任务,确定算法。 (2)绘流程图略,(3)汇编语言程序MOV AH,lINT 21H ;1号功能调用,键盘接收CMP AL,A ;键值为A,转PA子程序JE PACMP AL,B ;键值为B,转PB子程序JE PBCMP

9、AL,C ;键值为C,转PC子程序JE PCCMP AL,D ;键值为D,转PD子程序JE PD HLT ;键值非A、B、C、D,停止PA: ;A号控制子程序入口PB: ;B号控制子程序入口PC: ;C号控制子程序入口PD: ;D号控制子程序入口,2. 列表跳转法 例5-5 利用表内地址跳转法来实现例5.4的要求(1)明确任务,确定算法。,(2)绘流程图(图5-8),图5-8 例5-5流程图,(3)根据流程图编写汇编语言程序 ADATA SEGMENT BASE DW PA,PB,PC,PD KEY DB ? ADATA ENDS ASTACK SEGMENT PARA STACK STACK

10、DW 100 DUP(?) TOP LABEL WORD ASTACK ENDS ACODE SEGMENTASSUME CS:ACODE,DS:ADATA,SS:ASTACK START:MOV AX,ASTACKMOV SS,AXMOV SP, OFFSET TOP,MOV AX, ADATAMOV DS, AXLOP: MOV AH,1INT 21HCMP AL,41HJB LOP CMP AL,44HJA LOPSUB AL,41HMOV BX,OFFSET BASEMOV AH,0ADD AL,ALADD BX,AXJMP WORD PTRBX ACODE ENDSEND START

11、,5.4 循环结构程序设计 5.4.1 循环程序的组成与结构形式 两种循环程序结构:WHILE_DO结构和DO_UNTIL结构,例5-6 试编写一程序统计出某一内存单元中1的个数 (1)明确任务,确定算法。 (2)绘流程图(图5-11),图5-11 例5-6 流程图,(3)根据流程图编写汇编语言程序 DATA SEGMENT XDA DW 3AD8H CONT DB ? DATA ENDS CODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV CL,0MOV AX,XDA,LOP: CMP AX,0JZ EXITSH

12、L AX,1 ;左移,高位进CY,低位补0JNC NEXTINC CL NEXT:JMP LOP EXIT: MOV CONT,CLINT 20H CODE ENDSEND START,5.4.2 循环程序的控制方法 1.计数法 计数法分为正计数法和倒计数法。 例5-7 编制程序将两个n字节的无符号数相加,结果存入SUM 开始的n+1字节存储区中。 (1)明确任务,确定算法。 (2)绘流程图略,(3)根据流程图编写汇编语言程序 DATA SEGMENTDATA1 DB N DUP(?)DATA2 DB N DUP(?)SUM DB N+1 DUP(?) DATA ENDS CSEG SEGME

13、NTASSUME CS:CSEG,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET DATA1MOV SI,OFFSET DATA2LEA DI,SUMMOV CX,NCLC ;C=0,LOP: MOV AL,SIADC AL,BXMOV DI,ALINC BXINC SIINC DILOOP LOPADC BYTE PTR DI,0MOV AH, 4CHINT 21H CSEG ENDSEND START,2.条件控制法 条件控制法利用已知的条件对循环进行控制的方法。 分两种情况: 1)如循环最大次数已知, 但有可能使用一些特征或条件使循环提前结

14、束。 2)循环次数未知,利用条件中的特征结束循环。 例5-8 编制程序用单字符输出的DOS功能调用向屏幕输出以 “%”结束的字符串。 (1)明确任务,确定算法。,(2)绘流程图(图5-12),图5-12 例5-8流程图,(3)根据流程图编写汇编语言程序DSEG SEGMENTDATA DB HOW ARE YOU?%DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG MOV DS,AXLEA SI,DATA,AGAIN: MOV DL,SICMP DL,%JZ ENDOUTMOV AH,2 ;显示字符INT 21HINC

15、SIJMP AGAIN ENDOUT:INT 20H CSEG ENDSEND START,3.逻辑尺控制法 例5-9 设有16个内存单元需要修改,修改规律是:第1、3、 6、9、12号单元均加5,其余单元均加10,试用循环 结构编程实现。 (1)明确任务,确定算法。 (2)绘流程图 (3)根据流程图编写汇编语言程序,图5-13 例5-9流程图,指针BX0,计数初值CX16,AXXDABX,DX逻辑左移一位,CF=1?,Y,N,AXAX+10,XDABXAX,BXBX+1,CXCX1,CX=0?,N,Y,结束,AXAX+5,DATA SEGMENTXDA DB 16 DUP(?)LRULER

16、DW 0A490H ; 1010 0100 1001 0000 DATA ENDS CODE SEGMENT MAIN PROC FARASSUME CS:CODE,DS:DATA START: PUSH DSXOR AX,AX PUSH AXMOV AX,DATAMOV DS,AX MOV BX,0MOV CX,10H,MOV DX,LRULER AGAIN: MOV AX,XDABXSHL DX,1JC ADD5 ADD AX,10JMP SHORT RESULT ADD5: ADD AX,5 RESULT:MOV XDABX,AXINC BXLOOP AGAINRET MAIN ENDP

17、 CODE ENDSEND START,5.4.3 多重循环程序设计 注意以下几点:1)设置好各重循环的初始状态,确保各重循环的正常运行。2)注意内外循环嵌套。3)防止死循环现象。 例5-10 设某一数组的长度为N,各元素均为字数据,试编制 一个程序使该数组中的数据按照从小到大的次序排 列。 (1)明确任务,确定算法。 (2)绘流程图 (3)根据流程图编写汇编语言程序,图5-14 例5-10流程图,开始,BX0,内循环次数CXN1,外循环次数DXCX,AXDATABX,AXDATABX+2?,交换AX,DATABX+2,DATABXAX,BXBX+2,CXCX1,CX=0?,外循环次数CXDX

18、,BX0,CXCX1,CX=0?,结束,N,Y,Y,N,Y,N,ADATA SEGMENT DATA DW N DUP(?) ADATA ENDS ACODE SEGMENTASSUME CS:ACODE,DS:ADATA START: MOV AX,ADATAMOV DS,AXMOV BX,0MOV CX,N ;设计数器CX,内循环次数DEC CX LOP1: MOV DX,CX ;设计数器DX,外循环次数 LOP2: MOV AX,DATABX ;取相邻两数CMP AX,DATABX+2 ;若次序符合,则不交换JBE CONTI,XCHG AX,DATABX+2 ;否则两数交换MOV DA

19、TABX,AX CONTI: ADD BX,2LOOP LOP2 ;内循环MOV CX,DX ;外循环次数CXMOV BX,0 ;地址返回第一个数据LOOP LOP1 ;外循环MOV AH, 4CH ;返回DOSINT 21H ACODE ENDSEND START,5.5 子程序结构程序设计 子程序是汇编语言中多次使用的一个相对独立的程序段。 子程序结构程序设计主要包括三个方面,即:1)子程序的定义与调用2)子程序的参数传送3)子程序嵌套与递归调用,5.5.1 子程序的定义与调用 1、子程序的定义 子程序说明包括四个方面:1)描述该子程序模块的名称、功能及性能2)说明子程序中用到的寄存器和存

20、储单元3)指出子程序的入口参数和出口参数4)子程序中调用其它子程序的名称,例5-11 定义一个显示两位十六进制数的子程序 程序说明:;名称:DISPP;功能:显示两位十六进制数;所用寄存器CX,DX;人口参数:AL存放两位十六进制数;出口参数:无;调其它子程序:DISP1,子程序;DISPP PROC NEARPUSH DXPUSH CXMOV DL, ALMOV CL, 4ROL DL, CLAND DL, 0FHCALL DISP1MOV DL, ALAND DL, 0FHCALL DISP1POP CXPOP DXRETDISPP ENDP,2、子程序的调用和返回 例5-12 编制显示四

21、位十六进制数的子程序 (1)明确任务,确定算法。 (2)绘流程图 (3)根据流程图编写汇编语言程序,DISP4 PROC NEAR PUSH BX PUSH CX PUSH DXPUSH AXMOV AL, AHCALL DISP2POP AXCALL DISP2POP DXPOP CX POP BXRETDISP4 ENDPDISP2 PROC NEARMOV BL, ALMOV DL, ALMOV CL, 4,ROL DL,CLAND DL,0FHCALL DISP1 MOV DL,BL AND DL,0FHCALL DISP1 RET DISP2 ENDP DISP1 PROCOR DL

22、,30HCMP DL,3AHJB DDDADD DL,07HDDD: MOV AH,2INT 21HRET DISP1 ENDP,5.5.2 子程序的参数传送实现参数传送分为四种:寄存器传送、固定缓冲区传送、地址表传送和堆栈传送。 1、寄存器传送寄存器传送是一种最常用、最简单的参数传送实现方法。 2、固定缓冲区传送固定缓冲区传送方法是采用存储器来实现参数传送的,它与寄存器传送类似。 例5-13 已知数组由100个字数据组成,试编程求出这个数组 元素之和。,(1)明确任务,确定算法。 (2)绘流程图(图5-16),图5-16 例5-13求和子程序流程图,(3)根据流程图编写汇编语言程序DATA

23、SEGMENTARY DW 100 DUP(?)SUM DW ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXCALL RADDMOV AH,4CHINT 21H;求和子程序RADD PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXLEA BX,ARY,MOV CX,100XOR AX,AXMOV DX,AXCL1: ADD AX,BXJNC CL2INC DXCL2: ADD BX,2LOOP CL1 MOV SUM,AXMOV SUM+2, DXPOP DXPOP CXP

24、OP BXPOP AXRETRADD ENDPCODE ENDSEND START,3、地址表传送 地址表传送是采用存储器来实现参数传送的。 例5-14 已知数组A由100个字数据组成,数组B由50个字数据 组成,试编程分别求出这两个数组元素之和。 (1)明确任务,确定算法。 (2)绘流程图(图5-17) (3)根据流程图编写汇编语言程序,图5-17 例5-14流程图,DATA SEGMENTCA DW 100ARA DW 100 DUP(?)SA DD ?CB DW 50ARB DW 50 DUP(?)SB DD ?TAB DW 3 DUP(?)DATA ENDSCODE SEGMENTAS

25、SUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV AX,OFFSET CAMOV TAB,AXMOV AX,OFFSET ARAMOV TAB2,AX,MOV AX,OFFSET SAMOV TAB 4,AX MOV SI,OFFSET TABCALL RADDMOV AX,OFFSET CBMOV TAB,AXMOV AX,OFFSET ARBMOV TAB2,AXMOV AX,OFFSET SBMOV TAB 4,AXMOV SI,OFFSET TABCALL RADDMOV AH,4CHINT 21HRADD PROC NEAR MOV

26、 BX,SI,MOV CX,BXMOV BX,SI+2MOV DI,SI+4 XOR AX,AXMOV DX,AXCL1: ADD AX,BXJNC CL2INC DXCL2: ADD BX,2LOOP CL1MOV DI,AXMOV DI+2, DXRETRADD ENDPCODE ENDSEND START,4、堆栈传送 堆栈传送是采用存储器来实现参数传送的。 例5-15 已知数组A由100个字数据组成,数组B由50个字数据 组成,要求用堆栈传送参数的子程序结构编程,试分别求出这两个数组元素之和。 1)明确任务,确定算法。 2)绘流程图(图5-18) 3)根据流程图编写汇编语言程序,结束,

27、数组A起始地址压入堆栈,开始,存放数组A长度起始地址压入堆栈,存放数组A和起始地址压入堆栈,数组B起始地址压入堆栈,存放数组B长度起始地址压入堆栈,存放数组B和起始地址压入堆栈,调用求和子程序RADD,调用求和子程序RADD,图5-18 例5-15流程图,DATA SEGMENT CNTA DW 100 ARYA DW 100 DUP(?) SUMA DD ? CNTB DW 50 ARYB DW 50 DUP(?) SUMB DD ? DATA ENDS CSEG SEGMENTASSUME CS:CSEG,DS:DATA START: MOV AX,DATAMOV DS,AXMOV AX,

28、OFFSET ARYAPUSH AXMOV AX,OFFSET CNTA,PUSH AXMOV AX,OFFSET SUMAPUSH AXCALL NEAR PTR RADDMOV AX,OFFSET ARYBPUSH AXMOV AX,OFFSET CNTBPUSH AXMOV AX,OFFSET SUMBPUSH AXCALL NEAR PTR RADDMOV AH,4CHINT 21H RADD PROC NEARPUSH BP,MOV BP,SPPUSH AXPUSH DXPUSH CXPUSH SIPUSH DIMOV SI,BP8MOV DI,BP6MOV CX,DIMOV DI,

29、BP4XOR AX,AXMOV DX,AXNEXT: ADD AX,SIJNC NOCAYINC DX,NOCAY: ADD SI,2LOOP NEXTMOV DI,AXMOV DI2,DXPOP DIPOP SIPOP CXPOP DX POP AX POP BP RET 6RADD ENDPCSEG ENDSEND START,5.5.3 子程序嵌套与递归调用 1、子程序嵌套 子程序嵌套是指一个子程序的内部再调用其他子程序。,图5-20 子程序嵌套,2、递归子程序 递归子程序是这种具有递归调用性质的子程序。 递归子程序必须注意以下两点: 1)注意现场的保护。 2)注意递归结束条件。例5-1

30、6 计算 S=X!+Y!其中X、Y的值在08之间。 (1) 明确任务,确定算法。,(2)绘流程图,图5-21 例-16流程图,(3)根据流程图编写汇编语言程序DATA SEGMENTXYVAL DW ?,?SVAL DW 0DATA ENDSSTACK1 SEGMENT PARA STACK STACKTOP DW 64H DUP(0)STACK1 ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK1START :MOV AX,DATAMOV DS,AXMOV AX,STACK1MOV SS,AXMOV SP,SIZE TOP,MOV SI,OFFS

31、ET XYVALMOV BX,SICALL FTPUSH AX MOV BX,SI+2CALL FTPOP BXADD AX,BXMOV SVAL,AXMOV AH,4CHINT 21H;求阶乘子程序FT PROC NEARAND BX,BX,JZ FT1PUSH BX DEC BXCALL FTPOP BX MUL BXRET FT1: MOV AX,1RETFT ENDPCODE ENDSEND START,图5-22 递归调用过程的堆栈变化情况,5.6 模块化程序设计 1、模块化程序设计的优点 模块化程序设计是将复杂的程序划分成多个程序模块。 优点: 1)对大型程序设计来说,便于程序员之

32、间分工,可由多人编 写和调试,这样加快了程序的开发速度; 2)对单个程序模块而言,易于编写、调试和修改; 3)整个程序易读、易理解,程序的修改可局部进行,不会影 响其它部分; 4)对频繁使用的功能程序段可以编制成模块,供多个任务使 用,这样不仅使程序更简洁而且能提高编程效率。,2、模块化程序设计步骤 步骤: 1)明确任务,正确地描述整个程序需要完成的各项功能; 2)根据各项功能与整个程序的关系,把整个程序划分成多个 功能模块,并画出模块层次图; 3)确切地定义每个功能模块做些什么,以及与其他功能模块 之间的联系,并写出各模块的说明; 4)把每个功能模块编制成程序,并进行独立汇编、调试,得 到与

33、各功能模块相应的目标模块; 5)由连接程序将各目标模块连接在一起,构成一个完整的可 执行程序; 6)最后,把整个程序及所有的模块说明合在一起,形成一个 模块化程序设计文件。,3、模块化程序设计方法 (1)模块划分的方法 模块的划分一般应遵循以下原则: 1) 高内聚 2) 低耦合 3) 长度适中,(2)模块划分的描述,图5-23 模块划分的描述,(3)模块化程序设计技术 1)模块化程序实现方法:子程序结构和宏结构 子程序结构:在汇编语言程序设计中,采用子程序结 构设计是实现模块化程序设计的重要手 段。 宏结构:在汇编语言程序设计中,提供了宏定义功能, 采用宏定义、调用和展开来进行程序设计也 是实现程序模块化的重要技巧。 2)多模块的连接,例5-17 设有三个模块M1、M2、M3,模块M1含有三个段,段名分别为A、B、C,与之对应的组合类型分别为PUBLIC、COMMON和STACK;模块M2含有两个段,段名分别为A、C,与之对应的组合类型分别为PUBLIC和STACK;模块M3含有三个段,段名分别为A、B、C,与A、B段对应的组合类型分别为PUBLIC、COMMON;C段没有指定组合类型。试说明经连接程序LINK对段进行组合处理后产生哪些段?,3)模块间标识符的交叉访问4)模块间数据传送的其它方法,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报