




已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第 5 5 章章 汇编语言程序设计 第5章 汇编语言程序设计 本章重点: 结合实例理解汇编语言程序设计的基本步骤; 掌握汇编语言程序设计的基本方法;熟练运用循 环、分支和子程序的程序设计方法解决问题。 本章难点: 伪指令、依据所要解决的问题,选择正确的程 序设计方法,正确地运用指令编写实用的汇编原 程序。 汇编语言是一种用助记符来表示指令的操作 码和操作数,用标号和符号来代替地址、常量 和变量的符号语言。 用汇编语言编写的程序不能由机器直接执行 ,而必须翻译成由机器代码组成的目标程序, 这个翻译过程称为汇编。 5.1 概述 用来把汇编语言编写的程 序自动翻译成目标程序的软 件叫汇编程序。 汇编程序的建立及汇编过程 如图所示。 编辑程序 汇编程序 连接程序 EXP. ASM EXP. OBJ EXP. EXE 8086的汇编语言的源程 序是分段的,由若干个段 形成一个源程序。源程序 的一般格式为: NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END 5.1 概述 每一个段有一个名字,以符号SEGMENT作 为段的开始,以语句ENDS作为段的结束。这 两者都必须有名字,而且名字必须相同。 由若干个段组成一个源程序,整个源程序以 语句END作为结束。 5.1 概述 总之,8086的源程序是由若干段组成的,而一 个段又是由若干个语句行组成的。所以,语句行 是汇编源程序的基础。 8086汇编的一个语句行也是由4个部分组成的 ,即 标号 操作码 操作数 ;注释 各部分之间至少要用一个空格作为间隔。 5.1 概述 语句行是由标记及分隔符按照一定规则组织起来 的,标记是汇编语言源程序的最小的、具有意义的 单位,如标识符、保留字、界符、常数和注释,所 有这些都称为标记。 在8086汇编语言中,有数值表达式和地址表达式两 种,由各种常量与运算符连接成的式子,称为数值 表达式。将常量、变量、标号、寄存器内容和运算 符、操作符组合成的有意义的式子,称为地址表达 式。单个常量,变量、标号是表达式的最简形式。 在汇编过程中,汇编程序按操作运算符约定的优先 规则对表达式进行计算,得到一个数值或一个地址 。 5.2 语句行构成 伪指令用来指示汇编程序应该如何去处理汇 编语言的源程序。它们在汇编时被解释执行, 除了部分语句可以申请存储空间以外,不产生 任何目标代码。 5.3 伪指令 2等号语句 格式:符号名=表达式 功能:把表达式的值赋值给符号名,等号语 句与等值语句具有相同的功能。 5.3.1 符号定义伪指令 1等值语句 格式:符号名 EQU 表达式 功能:用一个符号名来代替表达式,使该符 号名与表达式同义。 格式:变量名 数据定义符 操作数 ,操作数 , 功能:方括号中的变量名为可选项。操作数可 以不止一个,多个操作数时用逗号分开。数据 定义符号是DB、DW、DD、DQ、DT。 DB定 义字节类型变量,DW定义字类型变量,DD定 义双字类型变量,DQ定义四字类型变量,DT 定义十字节类型变量。 5.3.2 数据定义伪指令 DATA DB l0H,20H STRl DBCOMPUTER DATAlDB20 DUP (?) DATA2DW? DATA3DB 20 DUP (30H) 5.3.2 数据定义伪指令 格式:段名 SEGMENT 定位类型 组合类型 类别 名 段名 ENDS 功能:用来把程序分成若干逻辑段,实现存储器 的分段管理,在汇编和连接程序时,控制不同段 的定位,组合和连接,以便形成一个可执行程序 。 5.3.3 段定义伪指 段寻址伪指令用来告诉汇编程序当前使用的 各个段的段地址将要存放在哪个段寄存器中。 格式:ASSUME段寄存器名:段名,段寄存器 名:段名 功能:设置或撤消在SEGMENTENDS伪指 令中 定义过的段名所使用的段寄存器。 5.3.4 段寻址伪指令 格式:过程名 PROC NEARFAR RET 过程名 ENDP 功能:定义一个过程,并指明过程名和过程的属性。 过程名实际上是过程入口的符号地址,PROC和 ENDP前的过程名必须相同,它们之间的部分是过程 体。 过程的类型可以是NEAR,表示所定义的过程是一 个近过程。过程类型为FAR表示是一个远过程, 5.3.5 过程定义伪指令 4.5.4 DOS4.5.4 DOS系统功能调用系统功能调用 主要内容:系统功能调用 简介简介 MS-DOS设置了几十个内部子程序,可以完成 I/O设备管理,存储管理,文件管理,合作业管 理.它们被做成中断服务程序,其入口地址已 由系统置入中断向量表中,可以用软中断指 令调用. 类型号:2027H 系统功能调用:INT 21H DOSDOS系统功能调用系统功能调用 1.DOS系统功能调用格式 1)、在AH中设置功能号 2)、在指定的寄存器中设置入口参数 3)、用INT21H指令执行系统功能调用 4)、根据出口参数分析执行情况 2.DOS系统功能调用INT 21H的部分I/O操作 1). 键盘输入一个字符并回显 功能号AH=01H,出口参数 AL=字符; 使用格式: MOV AH , 01H INT 21H 4.5.4 DOS系统功能调用格式 2). 键盘输入字符到缓冲区: 功能号 :AH=0AH, 入口参数 :DS:DX=缓冲区首址 使用格式 BUF DB 20 DB ? DB 20 DUP (?) MOV DX , OFFSET BUF MOV AH , OAH INT 21H 4.5.4 DOS系统功能调用:I/O 11 0 ? ? ? ? ? ? ? ? ? ? ? 缓缓存区容纳纳的最大字符数 实际输实际输 入的字符串长长 从第三个字节节开始,存放输输 入的字符。 人为设为设 定的结结束标标志 BUF第一个字节节 BUF+1第二个字节节 BUF+2 1 BUF+3 2 BUF+4 3 BUF+5 4 BUF+6 5 BUF+7 6 BUF+8 7 BUF+9 8 BUF+10 9 BUF+11 10 BUF+12 DX DX DXc h e n 1 6 8 A B 0 9 $ BX 9 chen168AB 3).输出一个字符 功能号 :AH=2 入口参数 :DL=字符,光标随字符移动 使用格式: MOV DL , A MOV AH , 02H INT 21H 执行上面程序后,将在屏幕上显示字符 A. 4).输出字符串, 功能号 : AH=9, 入口参数 :DS:DX=串地址,字串结束为“$”符 号 使用格式: BUF DB HELLO! MOV DX, OFFSET BUF MOV AH, 09H INT 21H . 4.5.4 DOS系统功能调用:I/O 5)直接控制台输入输出单字符 功能号:AH=06H 入口参数:DL=0FFH(输入) DL=字符(输出) 出口参数:AL=输入字符 6)键盘输入一个字符无回显 功能号:AH=08H 出口参数:AL=字符; 7)返回DOS系统 功能号:AH=4CH 8)清键盘缓冲区,并调用一种键盘功能 功能号:AH=0CH AL=键盘功能号(1、6、7、8、0AH) 4.5.4 DOS系统功能调用:I/O 9).从串口输入单字符 AH=03H 入口参数AL=字符 10)向串口输出单字符 AH=04H 出口参数DL=字符 11)设置时间:INT 21/2BH year:mounth:day=CX:CH:CL 12)取得时间:INT21H/2AH 13)取得日期:INT21H/2CH 4.5.4 DOS系统功能调用:I/O data segment a1 db hello!,0dh,0ah,$ data ends code segment Main proc far assume cs:code,ds:data start:PUSH DS MOV AX,0 PUSH AX mov ax,data mov ds,ax mov dx,offset a1 mov ah,09h int 21h RET MAIN ENDP CODE ends end start 看一个例子看一个例子 程序设计步骤 1.分析问题 2.建立数学模型 3.确定算法 4.绘制程序流程图 5.内存分配 6.编制程序 7.程序调试 4.5 汇编语言程序设计:程序设计步骤 一般说来,编制一个汇编程序的步骤如下: (1) 分析题意,确定算法。 (2) 根据算法画出程序框图。 (3) 根据框图编写程序。 (4) 上机调试程序。 程序有顺序、循环、分支和子程序四种结构 形式。 顺序程序结构是指完全按顺序逐条执行的指 令序列,这在程序段中是大量存在的,但作为 完整的程序则很少见。 5.4 程序设计举例 1分支程序的结构形式 分支程序结构可以有两种形式,如图所示。 判定条件 NY 判定条件 (a)IF_THEN_ELSE (b)CASE 分支程序的结构形式图 5.4 程序设计举例 2分支程序设计方法 程序的分支一般用条件转移指令来产生,下面一 些例子来分析分支程序的设计方法。 例5.6 编程求符号函数,设x在AL中 5.4.1 分支程序设计 程序: DATASEGMENT ;定义数据段 XXDB10 YYDB? DATAENDS CODE SEGMENT ;定义代码段 ASSUME CS: CODE, DS: DATA START PROC FAR BEGIN:PUSH DS ;DS:00 压栈 MOVAX, 0 PUSH AX MOVAX, DATA MOVDS, AX;置数据段 MOVAL, XX;AL=XX CMPAL, 0;AL与0比较 JGEBIGR;大于,等于转BIGR MOVAL, 0FFH;AL=-1 JMPEQUT;转EQUT BIGR: JEEQUT ;等于0,转EQUT MOVAL, 01;AL=1 EQUT: MOVYY, AL ;符号函数的结果存入YY单元 RET START ENDP CODE ENDS ENDBEGIN 1循环程序的结构形式 循环程序可以有两种结构形式,如图所 示。 循环初始状态 循环控制条件 循环体 N Y N 循环控制条件 循环初始状态 循环体 Y (1)Do While结构 (2)Do UNTIL结构 5.4.2 循环程序设计 4.5.2 循环结构程序设计 循环结构组成: 循环初值 循环体:指重复执行的程序部分 循环结束条件 循环结束的控制 计数器控制循环:易于采用循环指令 LOOP 条件控制循环 4.5.3 循环结构程序 先判断条件,然后执行循环体。 先执行循环体,然后判断条件。 特点:至少执行一次循环体。 赋初值 条件 循环体 修改 Y N 开始 赋初值 循环体 修改 条件? N Y 开始 4.5.3 循环结构程序 例4-5:从给定串中寻找最大 的值,并放到MAX单元.元 素放在BUFFER开始的单 元中。 解:分析: CX:比较次数: 循环次数数据个数1 BX:数据指针 LOOP:循环控制 程序框图: 4.5.3 循环结构程序:计数器控制循环举例 开始 BX 元素表首地址 CX N-1 AX-bx BX BX+2 AX=BX? AX、BX中的数交换 CX CX-1 CX=0? Y N 暂停 Y N 参考程序: BUFFER DW 21,33,45,67,98,10。 COUNT = ($-BUFFER)/2 MAX DW ? MOV AX,SEG BUFFER MOV DS,AX MOV CX, COUNT-1 MOV BX, OFFSET BUFFER MOV AX, BX DON: ADD BX ,2 ;指向下一个数 CMP AX, BX ;AL- BX JAE P1 ;大于转 MOV AX, BX ;交换 P1 : LOOP DON MOV MAX,AX . 4.5.3 循环结构程序:计数器控制循环举例 条件控制循环:需要利用特定条件转移指令判断 循环是否结束 转移指令可以指定目的标号来改变程序的运行顺 序,如果目的标号指向一个重复执行的语句体的 开始或结束,便构成了循环控制结构 4.5.3 循环结构程序:条件控制循环 例4-6:显示以0结尾的字符串。 STR DB Let us have a try !,0 MOV BX,OFFSET STR MOV AH,2 AGAIN:MOV DL,BX CMP DL,0 JZ DONE;为0结束 ;MOV AH,2 ;不为0,显示 INT 21H INC BX ;指向下一个字符 JMP AGAIN DONE: 4.5.3 循环结构程序:条件控制循环举例 例5.10 求S=1+2+3+100 程序: DATA SEGMENT ; 定义数据段 MAX DW 100 SUM DW ? DATA ENDS CODE SEGMENT ; 定义代码段 START PROC FAR ASSUME CS:CODE,DS:DATA BEGIN: PUSH DS ; DS压栈 MOVAX, 0 PUSH AX ; 00压栈 MOV AX,DATA MOV DS,AX ; 置数据段 MOV AX,0 ; 累加器清0 MOVCX,MAX ; 循环控制CX=MAX MOVBX,1 ; 初始加数用1 AGAIN: ADDAX,BX ; 累加求和 INC BX; 下一个数 LOOP AGAIN; 循环转AGAIN MOVSUM, AX; 求和结果存SUM中 RET START ENDP CODE ENDS END BEGIN 例5.10 求 N! 程序: DATASEGMENT; 定义数据段 NDW 5 YYDW ? DATAENDS STACKSEGMENT PARA STACK ; 定义堆栈段 DW50H DUP (?) STACKENDS CODE SEGMENT; 定义代码段 START PROC FAR ASSUME CS:CODE, DS:DATA, SS:STACK BEGIN: PUSH DS; DS压栈 MOV AX, 0 PUSH AX; 00压栈 MOV AX, DATA MOV DS, AX ; 置数据段 MOV AX, N; AX=N CMP AX, 0 ; 比较是否为0 JNE NOZ ; 非0转NOZ INCAX ; 0则AX=1 JMPEXIT ; 转EXIT NOZ: MOV BX, AX ; BX=AX=N MOV AX, 1 ; 累积AX=1 AGAIN: MULBX ; 相乘AX*BX-AX DEC BX; BX减1 JNEAGAIN ; 非0继续 EXIT: MOV YY, AX ; 保存N!结果到YY中 RET START ENDP CODE ENDS END BEGIN 子程序又称为过程,它相当于高级语言中 的过程和函数。在一个程序的不同部分,往往 用功能和结构形式都相同的程序段,只是某些 变量的赋值不同,此时就可以把这些程序段写 成子程序形式,在需要时可以调用它。在汇编 语言程序中,子程序定义的伪指令是PROC和 ENDP,子程序有NEAR和FAR属性调用子程序和 从子程序返回的指令是CALL和RET 5.4.3 子程序结构 子程序设计中,应注意几点: 现场保护和恢复 子程序的嵌套和递归调用 参数传递 编写子程序调用方法说明 5.4.3 子程序结构 程序要求从键盘取得一个十进制数,然后把该数 以十六进制形式在屏幕上显示出来。采用一个子程序 DECIBIN实现从键盘取得十进制数并把它转换为二进 制数;另一个子程序BINIHEX把此二进制数以十六进 制数的形式在屏幕上显示出来。为避免屏幕上的重叠 ,另外用CRLF子程序取得回车和换行效果。整个程序 结构如图所示。各个子程序之间用BX寄存器来传送信 息。在过程DECIBIN中取得的输入数据转换为二进制 数后保存在BX寄存器中,而过程BINIHEX需要把BX寄 存器中的数用十六进制形式显示出来。 例5.17 编写十进制到十六进制数转换程序。 开始 调用DECIBIN 调用CRLF 调用BINIHEX 调用CRLF 结 束 从键盘取得十进制 数,保存在BX中 显示回车和换行 用十六进制数形式 表达显示BX中的数 十进制到十六进制数转换的程序结构图 程序: DECIHEX SEGMENT; 定义代码段 ASSUME CS:DECIHEX MAIN PROC FAR; 主程序 REPEAT: CALL DECIBIN; 调用子程序输入十 进制数 CALL CRLF; 显示回车、换行 CALL BINIHEX; 以十六进制数输出 CALL CRLF ; 显示回车、换行 JMP REPEAT; 转REPEAT,继续 MAIN ENDP DECIBIN PROC NEAR; 十进制数输入子程序 MOV BX, 0; BX保存输入数 NEWCHAR: MOV AH, 1 INT 21H; 调用DOS功能输入字符 SUB AL, 30H; 转为数0-9 Jb EXIT; 小于0,不是数字 CMP AL, 9D; 与9比较 Ja EXIT; 大于,不是数字 CBW; AL=AX XCHG AX, BX; AX、BX互换 MOV CX, 10D ; CX=10 MUL CX ; AX=AX*CX ; XCHG AX, BX ; AX、BX互换 ADD BX, AX ; BX为前面输入的结果 JMP NEWCHAR EXIT: RET DECIBIN ENDP BINIHEX PROC NEAR MOV CH, 4 ; CH循环次数 ROTATE: MOV CL, 4 ;每次循环输出一位十六进制数 ROL BX, CL ; 即移位4个二进制位 MOV AL, BL ; AL=BL AND AL, 0FH ; 取低4位 ADD AL, 30H ; 转变为ASCII码 CMP AL, 3AH ; 是否为0-9 JL PRINTIT ; 是转PRINTIT ADD AL, 7H ; 否转为A-F PRINTIT: MOV DL, AL ; DL=输出字符 MOV AH, 2 INT 21H ;调用DOS中断,显示字符 DEC CH JNZ ROTATE ; 没循环结束,继续 RET ; 返回 BINIHEX ENDP CRLF PROC NEAR ; 输出回车、换行 MOV DL, 0DH MOV AH, 2 INT 21H ; 输出回车 MOV DL, 0AH MOV AH, 2 INT 21H ; 输出换行 RET CRLF ENDP DECIHEX ENDS END MAIN 4.18 从60H个元素中寻找一个最大的值,并放到AL 中,假设这60个元素放在DATA1开始的单元中 。 4.19 编写一段程序,接收从键盘输入的10个数, 输入回车符表示结束,然后将这些数加密后存于 BUFF缓冲区中。加密表为: 输入数字: 0,1,2,3,4,5,6,7,8,9; 密码数字:7,5,9,1,3,6,8,0,2,4 4.20 编程序从键盘接收一个4位16进制数,转换为 10进制数后,送显示。 4.21 排序程序设计: 把表中元素按值的大小升 序排列。要求显示排序前和排序后的数据。 4.22 从内存BUF单元开始,连续存放出100个学 生的某门课成绩。编写程序统计统计 90100, 7079, 6069, 60以下各段人数。并 将结果放在数据段、偏移地址为BTRX开始的 顺序单元中。试编程序,求该班这门课的 平均成绩为多少,并放在该数据段的AVER单 元中。要求显示结果。 一、填空题 1. 标号和变量都是存贮单元的符号地址,但其内容不同,标 号是_的符号地址,而变量是 _的符号地址。 2. 设有一程序定义如下: ORG 0024H AR1 DW 4,5,$+4 MOV AX,AR1+4 执行以上指令后,AX中的内容正确的是_。 A) 0028H B) 0032H C) 002AH D) 002CH 2. 下面表示段定义结束的命令是_。 A) END B) ENDP C) ENDS D) ENDM 3.现用数据定义伪指令定义数据:BUF DB 4 DUP(0,2 DUP(1,0);问定义后,存储单元中有数据0100H的字 单元个数是_。 A) 4 B) 3 C) 8 D) 12 4.下列伪指令中定义字节变量的是_。 A) DB B) DW C) DD D) DT 5.变量的类型属性如下,下面错误的类型是_。 A) 字节型 B) 字符型 C) 字型 D) 双字型 6.一个程序中,有下列伪指令: ARY DW 35 DUP(3,4,4 DUP(?,1,0) LEN DW $ - ARY 问LEN单元存储的值是多少? 7. 有一个程序片段如下 MSG DW 3 DUP(?, 2 DUP (5,4),3) MEN DW $-MSG MOV A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 灯具安装合同范本博客
- 制造业路演题目及答案
- 护理部工作计划范文2025(5篇)
- 烟草行业技术规范与市场策略
- 劳动合同的注意事项
- 环境监测行业智能化转型2025年数据质量控制与智能化监测平台报告
- 2025年管理信息系统试卷及答案
- 2025年电工常识题库及答案
- 2025年餐饮消防培训题目及答案
- 2025年陕西省安康市事业单位工勤技能考试考试题库及参考答案
- 文创市集限定摊位协议
- 妇产科护理 课件06章-正常产褥期母婴的护理
- 《劳模工匠之光》课件 第1、2单元 民族大厦的基石、改革攻坚的先锋
- 2025年中国癌症筛查及早诊早治指南(试行)
- 2025年全国企业员工全面质量管理知识竞赛题库及答案
- 基孔肯雅热防控指南专题课件
- 2025年中级钳工技能鉴定考核试题库(附答案)
- 2025秋教科版科学二年级上册教学课件:第一单元第1课 动物的家
- GB/T 15620-2025镍及镍合金实心焊丝和焊带
- 名誉顾问聘任管理办法
- 牧昆:亚朵星球怎样用内容打增量 洞察无法逃离日常用真人秀的思路打增量
评论
0/150
提交评论