已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章 汇编语言程序设计 汇编语言程序的步骤: 1)明确任务,确定算法。 2)绘流程图。 3)根据流程图编写汇编语言程序。 4)上机调试程序。 或 或 起始框 执行框判断框 终止框连接框 图5-1 标准流程图符号 5.1 汇编语言程序的上机过程 1、源文件的建立和汇编 (1)建立源程序文件 (2)汇编源程序文件 汇编程序主要功能: 检查源程序中的语法错误并给出出错信息。 产生目标文件,列表文件和对照文件。 展开宏指令。 汇编操作过程: 设在当前C盘上已经建立了一个扩展名为ASM的源程序文件 MYASM,汇编时发出如下命令: C:MASM MYASM (或MASM MYASM.ASM ) 具体的三个输入提示行显示如下: Object Filename MYASM.OBJ: Source Listing NUL.LST:(可打入源文件名或省略) Cross Reference NUL.CRF:(可打入源文件名或省略) 汇编程序对源文件进行汇编,若无错误信息则显示如下结果: 0 Warning Errors 0 Severe Errors 2.目标文件的链接 连接软件LINK的功能: 找到要连接的所有目标文件; 确定所有段的地址值; 确定所有浮动地址和外部符号所对应的存储地址; 生成.EXE可执行文件。 连接软件为 LINK.EXE,其过程如下: 设源文件MYASM.ASM已经由汇编软件汇编后生成MYASM.OBJ,其连 接命令为: C:LINK MYASM 或 LINK MYASM.OBJ 则在屏幕上显示连接软件的版本号和三个输入提示行,三 个输入提示行显示如下: Run File MYASM.EXE: List File NUL.MAP: Libraries .LIB: 3.执行文件的调试 5.2 顺序结构程序设计 语句1 语句2 语句3 图5-2 顺序结构流程 开始 结束 例5-1 用8086CPU的指令实现Y=(X1+X2)/2的程序设计 (1)明确任务,确定算法。 (2)绘流程图(图5-3) 图5-3 例5-1流程图 取变量X1送AL 取变量X2送AL 计算X1+X2送AX 结果送Y 计算AX/2 结束 开始 (3)根据流程图编写汇编语言程序 1 DATA SEGMENT 2 X1 DB ? 3 X2 DB ? 4 Y DW ? 5 DATA ENDS 6 CODE SEGMENT 7 ASSUME CS:CODE, DS:DATA, 8 MAIN PROC FAR ;设置远程调用子程序 9 START: PUSH DS ;将DS:0压入堆栈 10 MOVAX, 0 11 PUSH AX 12 MOV AX, DATA ;为DS设置段值 13 MOV DS, AX 14 MOV AL, X1 ;取变量X1送AL 15 MOV BL, X2 ;取变量X2送BL 16 ADD AL, BL 17 ADC AH, 0 ;X1+X2+进位送AX 18 SAR AX, 1 19 MOV Y, AX ;结果送Y 20 RET 21 MAINENDP 22 CODEENDS 23 ENDSTART 例5-2 将一位十六进制数转换成与它相应的 ASC码。 (1)明确任务,确定算法。 (2)绘流程图(图5-4) 图5-4 例5-2流程 BX表起始地址 ALHEX AL(BX)+(AL) ASCIAL 开始 结束 (3)根据流程图编写汇编语言程序 DATA SEGMENT TABLE DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H HEX DB 8 ASC DB ? DATA ENDS COSEG SEGMENT ASSUME CS:COSEG,DS:DATA BEING: MOV AX,DATA MOV DS,AX MOV BX, OFFSET TAB MOV AL,HEX XLAT MOV ASC,AL MOV AH,4CH INT 21H COSEG ENDS END BEING 5.3 分支结构程序设计 判定条件 S1S2 S1 判定条件 S2Sn (a)二分支结构(b)多分支结构 (b) (a) 图5-5 分支程序的结构形式 5.3.1 二分支结构 例5-3 要求对不足250个的学生成绩进行统计分析,统计出 优秀、及格和不及格的人数。 (1)明确任务,确定算法。 (2)绘流程图 结束 开始 SIBUF首址 取总学生数CHSI BX0, SISI+1 取学生成绩AHSI AH44H? ALAL41H BX取地址跳转表首址 AH0 AL计算表内地址 计算表地址BXBXAX 根据地址转向相应分支 Y 图5-8 例5-5流程图 (3)根据流程图编写汇编语言程序 ADATA SEGMENT BASE DW PA,PB,PC,PD KEY DB ? ADATA ENDS ASTACK SEGMENT PARA STACK STACK DW 100 DUP(?) TOP LABEL WORD ASTACK ENDS ACODE SEGMENT ASSUME CS:ACODE,DS:ADATA,SS:ASTACK START:MOV AX,ASTACK MOV SS,AX MOV SP, OFFSET TOP MOV AX, ADATA MOV DS, AX LOP: MOV AH,1 INT 21H CMP AL,41H JB LOP CMP AL,44H JA LOP SUB AL,41H MOV BX,OFFSET BASE MOV AH,0 ADD AL,AL ADD BX,AX JMP WORD PTRBX ACODE ENDS END START 5.4 循环结构程序设计 5.4.1 循环程序的组成与结构形式 两种循环程序结构:WHILE_DO结构和DO_UNTIL结构 循环初始状态 Y 循环体 N 图5-9 WHILEDO结构 循环控制条件 循环初始状态 循环体 Y N 图5-10 DOUNTIL结构 循环控制条件 例5-6 试编写一程序统计出某一内存单元中1的个数 (1)明确任务,确定算法。 (2)绘流程图(图5-11) N 结束 CL0 开始 AX逻辑左移一位 CLCL+1 AXXDA AX为零? CF=1? CONTCL Y N Y 图5-11 例5-6 流程图 (3)根据流程图编写汇编语言程序 DATA SEGMENT XDA DW 3AD8H CONT DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV CL,0 MOV AX,XDA LOP: CMP AX,0 JZ EXIT SHL AX,1 JNC NEXT INC CL NEXT:JMP LOP EXIT: MOV CONT,CL INT 20H CODE ENDS END START 5.4.2 循环程序的控制方法 (1)计数法 计数法分为正计数法和倒计数法。 例5-7 编制程序将两个n字节的无符号数相加,结果存入SUM 开始的n+1字节存储区中。 (1)明确任务,确定算法。 (2)绘流程图略 (3)根据流程图编写汇编语言程序 DATA SEGMENT DATA1 DB N DUP(?) DATA2 DB N DUP(?) SUM DB N+1 DUP(?) DATA ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DATA START:MOV AX,DATA MOV DS,AX MOV BX,OFFSET DATA1 MOV SI,OFFSET DATA2 LEA DI,SUM MOV CX,N CLC LOP: MOV AL,SI ADC AL,BX MOV DI,AL INC BX INC SI INC DI LOOP LOP ADC BYTE PTR DI,0 MOV AH, 4CH INT 21H CSEG ENDS END START (2)条件控制法 条件控制法利用已知的条件对循环进行控制的方法。 分两种情况: 1)如循环最大次数已知, 但有可能使用一些特征或条件使循环 提前结束。 2)循环次数未知,利用条件中的特征结束循环。 例5-8 编制程序用单字符输出的DOS功能调用向屏幕输出以 “%”结束的字符串。 (1)明确任务,确定算法。 (2)绘流程图(图5-12) 结束 SIDATA首址 开始 DLSI SISI+1 显示字符 DL=%? Y N 图5-12 例5-8流程图 (3)根据流程图编写汇编语言程序 DSEG SEGMENT DATA DB HOW ARE YOU?% DSEG ENDS CSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX LEA SI,DATA AGAIN: MOV DL,SI CMP DL,% JZ ENDOUT MOV AH,2 INT 21H INC SI JMP AGAIN ENDOUT:INT 20H CSEG ENDS END START (3)逻辑尺控制法 例5-9 设有16个内存单元需要修改,修改规律是:第1、3、 6、9、12号单元均加5,其余单元均加10,试用循环 结构编程实现。 (1)明确任务,确定算法。 (2)绘流程图 (3)根据流程图编写汇编语言程序 开始 逻辑尺DX0A490H 图5-13 例5-9流程图 指针BX0 计数初值CX16 AXXDABX DX逻辑左移一位 CF=1? Y N AXAX+10 XDABXAX BXBX+1 CXCX1 CX=0? NY 结束 AXAX+5 DATA SEGMENT XDA DB 16 DUP(?) LRULER DW 0A490H DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START: PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV BX,0 MOV CX,10H MOV DX,LRULER AGAIN: MOV AX,XDABX SHL DX,1 JC ADD5 ADD AX,10 JMP SHORT RESULT ADD5: ADD AX,5 RESULT:MOV XDABX,AX INC BX LOOP AGAIN RET MAIN ENDP CODE ENDS END 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 BX0 CXCX1 CX=0? 结束 N Y Y N Y N ADATA SEGMENT DATA DW N DUP(?) ADATA ENDS ACODE SEGMENT ASSUME CS:ACODE,DS:ADATA START: MOV AX,ADATA MOV DS,AX MOV BX,0 MOV 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 DATABX,AX CONTI: ADD BX,2 LOOP LOP2 ;内循环 MOV CX,DX ;外循环次数CX MOV BX,0 ;地址返回第一个数据 LOOP LOP1 ;外循环 MOV AH, 4CH ;返回DOS INT 21H ACODE ENDS END START 5.5 子程序结构程序设计 子程序是汇编语言中多次使用的一个相对独立的程序段。 子程序结构程序设计主要包括三个方面,即: 1)子程序的定义与调用 2)子程序的参数传送 3)子程序嵌套与递归调用 5.5.1 子程序的定义与调用 1、子程序的定义 子程序说明包括四个方面: 1)描述该子程序模块的名称、功能及性能 2)说明子程序中用到的寄存器和存储单元 3)指出子程序的入口参数和出口参数 4)子程序中调用其它子程序的名称 例5-11 定义一个显示两位十六进制数的子程序 程序说明: ;名称:DISPP ;功能:显示两位十六进制数 ;所用寄存器CX,DX ;人口参数:AL存放两位十六进制数 ;出口参数:无 ;调其它子程序:DISP1 子程序; DISPP PROC NEAR PUSH DX PUSH CX MOV DL, AL MOV CL, 4 ROL DL, CL AND DL, 0FH CALL DISP1 MOV DL, AL AND DL, 0FH CALL DISP1 POP CX POP DX RET DISPP ENDP 2、子程序的调用和返回 例5-12 编制显示四位十六进制数的子程序 (1)明确任务,确定算法。 (2)绘流程图 (3)根据流程图编写汇编语言程序 DISP4 PROC NEAR PUSH BX PUSH CX PUSH DX PUSH AX MOV AL, AH CALL DISP2 POP AX CALL DISP2 POP DX POP CX POP BX RET DISP4 ENDP DISP2 PROC NEAR MOV BL, AL MOV DL, AL MOV CL, 4 ROL DL,CL AND DL,0FH CALL DISP1 MOV DL,BL AND DL,0FH CALL DISP1 RET DISP2 ENDP DISP1 PROC OR DL,30H CMP DL,3AH JB DDD ADD DL,07H DDD: MOV AH,2 INT 21H RET DISP1 ENDP 5.5.2 子程序的参数传送 实现参数传送分为四种:寄存器传送、固定缓冲区传送、 地址表传送和堆栈传送。 1、寄存器传送 寄存器传送是一种最常用、最简单的参数传送实现方法。 2、固定缓冲区传送 固定缓冲区传送方法是采用存储器来实现参数传送的,它 与寄存器传送类似。 例5-13 已知数组由100个字数据组成,试编程求出这个数组 元素之和。 (1)明确任务,确定算法。 (2)绘流程图(图5-16) 返回 开始 保护现场 CF=1? 恢复现场 BXARY首地址 CX100 AX、DX清零 AXAX+BX DXDX+1 BXBX+2 CXCX1 CX=0? 保存结果 N N Y Y 图5-16 例5-13求和子程序流程图 (3)根据流程图编写汇编语言程序 DATA SEGMENT ARY DW 100 DUP(?) SUM DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX CALL RADD MOV AH,4CH INT 21H ;求和子程序 RADD PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX LEA BX,ARY MOV CX,100 XOR AX,AX MOV DX,AX CL1: ADD AX,BX JNC CL2 INC DX CL2: ADD BX,2 LOOP CL1 MOV SUM,AX MOV SUM+2, DX POP DX POP CX POP BX POP AX RET RADD ENDP CODE ENDS END START 3、地址表传送 地址表传送是采用存储器来实现参数传送的。 例5-14 已知数组A由100个字数据组成,数组B由50个字数据 组成,试编程分别求出这两个数组元素之和。 (1)明确任务,确定算法。 (2)绘流程图(图5-17) (3)根据流程图编写汇编语言程序 结束 开始 TAB CA首址 TAB 2ARA首址 TAB4SA首址 SI取TAB首址 调用求和子程序RADD TAB CB首址 TAB2ARB首址 TAB4SB首址 SI取TAB首址 调用求和子程序RADD 开始 返回 保护现场 保存结果并恢复现场 BXSI CXBX BXSI+2 DISI+4 AX、DX清零 AXAX+BX CF=1? BXBX+2 CXCX1 CX=0? DXDX+1 N N Y Y 图5-17 例5-14流程图 DATA SEGMENT CA DW 100 ARA DW 100 DUP(?) SA DD ? CB DW 50 ARB DW 50 DUP(?) SB DD ? TAB DW 3 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,OFFSET CA MOV TAB,AX MOV AX,OFFSET ARA MOV TAB2,AX MOV AX,OFFSET SA MOV TAB 4,AX MOV SI,OFFSET TAB CALL RADD MOV AX,OFFSET CB MOV TAB,AX MOV AX,OFFSET ARB MOV TAB2,AX MOV AX,OFFSET SB MOV TAB 4,AX MOV SI,OFFSET TAB CALL RADD MOV AH,4CH INT 21H RADD PROC NEAR MOV BX,SI MOV CX,BX MOV BX,SI+2 MOV DI,SI+4 XOR AX,AX MOV DX,AX CL1: ADD AX,BX JNC CL2 INC DX CL2: ADD BX,2 LOOP CL1 MOV DI,AX MOV DI+2, DX RET RADD ENDP CODE ENDS END START 4、堆栈传送 堆栈传送是采用存储器来实现参数传送的。 例5-15 已知数组A由100个字数据组成,数组B由50个字数据 组成,要求用堆栈传送参数的子程序结构编程,试分别求出这 两个数组元素之和。 1)明确任务,确定算法。 2)绘流程图(图5-18) 3)根据流程图编写汇编语言程序 结束 数组A起始地址压入堆栈 开始 存放数组A长度起始地址压入堆栈 存放数组A和起始地址压入堆栈 数组B起始地址压入堆栈 存放数组B长度起始地址压入堆栈 存放数组B和起始地址压入堆栈 调用求和子程序RADD 调用求和子程序RADD 开始 返回 BP值压入堆栈 BPSP 保护现场 恢复现场 SISP+8 DISP+6 CXDI DISP+4 AX、DX清零 AXAX+SI CF=0? DXDX+1 SISI+2 CX=0? CXCX1 DIAX DI+2DX 1 1 恢复BP值 Y Y N N 图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 SEGMENT ASSUME CS:CSEG,DS:DATA START: MOV AX,DATA MOV DS,AX MOV AX,OFFSET ARYA PUSH AX MOV AX,OFFSET CNTA PUSH AX MOV AX,OFFSET SUMA PUSH AX CALL NEAR PTR RADD MOV AX,OFFSET ARYB PUSH AX MOV AX,OFFSET CNTB PUSH AX MOV AX,OFFSET SUMB PUSH AX CALL NEAR PTR RADD MOV AH,4CH INT 21H RADD PROC NEAR PUSH BP MOV BP,SP PUSH AX PUSH DX PUSH CX PUSH SI PUSH DI MOV SI,BP8 MOV DI,BP6 MOV CX,DI MOV DI,BP4 XOR AX,AX MOV DX,AX NEXT: ADD AX,SI JNC NOCAY INC DX NOCAY: ADD SI,2 LOOP NEXT MOV DI,AX MOV DI2,DX POP DI POP SI POP CX POP DX POP AX POP BP RET 6 RADD ENDP CSEG ENDS END START (DI) (SI) (CX) (DX) (AX) (IP) SUM CNT ARY (IP) SUM CNT ARY SUM CNT ARY SP SP SP SP (a) (b) (c) (d) 图5-19 用堆栈传送参数时堆栈内容的变化情况 原(BP) 5.5.3 子程序嵌套与递归调用 1、子程序嵌套 子程序嵌套是指一个子程序的内部再调用其他子程序。 调用子程序 调用子程序 主程序 调用子程序 子程序 返回 返回 子程序II 图5-20 子程序嵌套 2、递归子程序 递归子程序是这种具有递归调用性质的子程序。 递归子程序必须注意以下两点: 1)注意现场的保护。 2)注意递归结束条件。 例5-16 计算 S=X!+Y!其中X、Y的值在08之间。 (1) 明确任务,确定算法。 (2)绘流程图 结束 SIXYVAL偏移首址 开始 BXSI 调用求阶乘子程序FT 暂存结果 BXSI+2 BX取前次结果 调用求阶乘子程序FT AXAX+BX SVALAX 开始 BX=0? BX值压入堆栈 BXBX1 递归调用FT 由堆栈取出值到BX中 AXBX*AX AX1 返回 Y N FT子程序流程图 主程序流程图 图5-21 例-16流程图 (3)根据流程图编写汇编语言程序 DATA SEGMENT XYVAL DW ?,? SVAL DW 0 DATA ENDS STACK1 SEGMENT PARA STACK STACK TOP DW 64H DUP(0) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1 START :MOV AX,DATA MOV DS,AX MOV AX,STACK1 MOV SS,AX MOV SP,SIZE TOP MOV SI,OFFSET XYVAL MOV BX,SI CALL FT PUSH AX MOV BX,SI+2 CALL FT POP BX ADD AX,BX MOV SVAL,AX MOV AH,4CH INT 21H ;求阶乘子程序 FT PROC NEAR AND BX,BX JZ FT1 PUSH BX DEC BX CALL FT POP BX MUL BX RET FT1: MOV AX,1 RET FT ENDP CODE ENDS END START 图5-22 递归调用过程的堆栈变化情况 NAD 01 NAD 02 NAD 03 MAD NAD 02 NAD 03 MAD NAD 03 MADMAD 01 NAD 02 NAD 03 MAD 02 NAD 03 MAD 03 MAD (a)(b)(c)(d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 婴儿膀胱刺激留尿法
- 生物(浙江卷)(考试版及全解全析)-2026年高考考前预测卷
- 供配电系统的无功补偿和电压调整
- 总装线周产进度核对流程方案
- 施工人员疲劳作业控制措施
- 客户满意度测评执行指南流程规范
- 机械设备进场验收协调方案
- 物流转运通道危险源管控计划
- 施工投标答辩方案现场亮点
- 综合管廊投标技术响应策划方案
- 2026年五一节前全体员工安全培训课件
- 初中数学七年级下册问题解决策略专题“特殊化思想:从特殊到一般的桥梁”创新教学设计
- 2026年黑龙江省《保密知识竞赛必刷100题》考试题库附参考答案详解(精练)
- 西南名校联盟2026届3+3+3高三4月联考数学试卷+答案
- 成都环境投资集团有限公司下属成都市兴蓉环境股份有限公司2026年春季校园招聘(47人)笔试历年参考题库附带答案详解
- 急性心肌梗死应急演练脚本
- 中央国家粮食和物资储备局垂直管理局事业单位2025年招聘223人笔试历年参考题库附带答案详解
- 英语四六级考前15天提高听力成绩必备技巧
- RG-S8600E云架构网络核心交换机产品介绍(V1.3)
- 【PPT】量子计算研究进展
- GJB9001B-2009《质量管理体系要求》
评论
0/150
提交评论