




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第七章 汇编语言程序设计的基本方法和技巧,7.1 概述 7.2 伪指令和宏指令 7.3 8086汇编语言程序设计的基本语法 7.4 汇编语言程序设计的基本方法和技巧 7.7 IBM-PC-DOS系统的功能调用,可执行目标文件:“.EXE”,目标代码文件:“.OBJ”,没有确定的物理地址,“.ASM”若有错,给出信息,源程序文件:“.ASM” “.asm” 编辑edit,汇编,得到结果,观察结果是否正确,错误,链接,若干.OBJ,调试,MS-DOS下,7.1 概述,7.2 伪指令和宏指令,格式:名字 定义符 参数1 ;注释,一、伪指令语句,无冒号,作用:指导汇编程序进行汇编,不产生目标代码,不占
2、用内存,功能:提供如下信息:如何分段,段的定义,段间关系,模块定义,模块间关系,数据定义,开始汇编,结束汇编,不可缺省,常数、字符串、常量名、变量名,标号,专用符号,1. 符号定义伪指令,等值语句 符号名 EQU 表达式 功能:为一个表达式赋予一个符号名 表达式类型:常数或数值,地址,变量、标号、寄存器、指令助记符 e.g. COUNT EQU 5 NUM EQU COUNT+5 e.g. ADDR EQU DS:DI+7 e.g. LABLE EQU START+BET CNT EQU BX CBD EQU SUB 注:EQU定义的符号名不能被重新定义,等号语句 符号名 = 表达式 e.g.
3、 NUM = 6 NUM = NUM+2 注:与EQU区别在于符号名可以重新定义,2. 数据定义伪指令,(1) 数值常数:十进制、八进制、十六进制、二进制等,缺省形式是十进制; (2) 字符常量,用单引号括起来,被存储的是该字符的ASCII码; (3) 符号常量,必须是预先已定义的符号; (4) 符号“?”,表示预留空间,内容不定;,表达式类型:,数据复制语句 n DUP(表达式),重复的次数,重复的内容,e.g. 定义赋初值的变量 xx DB 1, -1, 0fcH yy DW 1, -1, 0fcH zz DD 1,- 1, 0fcH,注意: (1)DB定义的数据,每个数据元素占据1个存储
4、单元; DW定义的数据,每个数据元素占据2个存储单元; (2)字数据存储时,低字节存储在低地址单元中,高字节存储在高地址单元中;,e.g. 定义字符串变量( 只能用DB定义 ) str1 DB TsingHua str2 DB INPUT: , 0dH , 0aH ,$,注意: 3个及其以上的字符,只能用DB定义 str1 DW abcd ;错 str2 DD abcd;错 str1 DW ab,cd;对,每组字符串中前一字符作高字节,后一字符作低字节。 str2 DD ab;对,前一字符存放于第二字节,后一字符存放于第一字节,两个高字节存放00H。,e.g. 利用DW伪指令可存放偏移地址,D
5、D伪指令可存放偏移地址和段地址 XX DW OFFSETX LIST DD LABEL OFFSETX为XX在其段内的偏移地址 LABEL为双字,一字为偏移地址,一字为段地址,e.g. 表达式中出现?,分配并保留存储空间 ABC DB ?, ? DEF DW ?, 50, ?,ABC,DEF,e.g. 数据复制 D1 DB 3 DUP(11, ?) D2 DW 2 DUP(4, ?) D3 DB 2 DUP(AB, 2, DUP(8),D1,D2,D3,3. 段定义伪指令,段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS,定位类型 说明段的起始地址应有怎样的边界值,BYTE:*
6、* * * *B,即段可以从任何地址开始; WORD: * * * * *0B,即段的起始地址必须为偶地址; PARA: * * * * 0000B,即段从节边界开始,每16个字节为1小段,所以,其起始地址必为16的倍数。 PAGE: * * * 0000 0000B,即段从页边界开始,每256个字节为1页,所以,其起始地址必为256的倍数。,组合类型说明程序连接时的段合并方法,PUBLIC:将同类别名段组装在一起形成一个逻辑段; STACK: 与PUBLIC一样,只用于堆栈段。在汇编及连接后,系统自动为SS及SP分配值,在可执行程序中,SP初值指向栈底。 COMMON:同名段从同一个内存地址
7、开始装入。所以,各个逻辑段将发生覆盖。连接以后,该段长度取决于同名段中最长 的那个,而内容有效的是最后装入的那个。 MEMORY:与PUBLIC同义,只不过MEMORY定义的段装在所有同名段的最后。若连接时出现多个MEMORY,则最先遇到的段按组合类型MEMORY处理,其他段组合类型按PUBLIC处理。 AT exp:段地址为表达式exp的值(长度为16位)。此项不能用于代码段。 e.g. AT 7000H ;定位的段地址为7000H,不用于代码段,类别:不能与程序中变量、标号和其它符号名相同。汇编程序链接时只使同类别的段发生关联,并组成段组的名字,如STACK,CODE。,4. 段寄存器说明
8、伪指令,ASSUME 段寄存器名:段名,段寄存器名:段名,e.g. ASSUME DS:DSEG,CS:CSEG,ES:ESEG,SS:SESG,e.g. ASSUME CS:CODE,DS:DATA,ES:DATA,说明: 该伪指令只是指示各逻辑段使用段寄存器的情况,并没有对段寄存器的内容进行赋值。 DS、ES的值必须在程序段中用指令语句进行赋值,而CS、SS由系统负责设置,程序中也可对SS 进行赋值,但不允许对CS赋值。,例 用程序实现 1234H + 5678H,data SEGMENT value DW 1234H, 5678H result DW ? data ENDS code S
9、EGMENT ASSUME CS:code, DS:data start: MOV AX, data ;给DS赋值 MOV DS, AX MOV AX, value ;取数 ADD AX, value+2 ;两数相加 MOV result, AX ;保存结果 MOV AH, 4CH ;返回DOS INT 21H code ENDS END start,value,result,5. 过程(子程序)定义伪指令,注意: PROC与ENDP必须成对出现; NEAR时表示段内调用,FAR表示段间调用,未指定时,认为是NEAR 一个过程中可以有一个以上的返回指令RET,它们不必放在过程的最后。,过程名
10、PROC 类型属性 RET 过程名 ENDP,6. 模块定义伪指令,注意: NAME和END成对出现 程序开始可以用NAME或TITLE为模块取名字 标号指示程序开始执行的起始地址,如果多个程序模块相连接,则只有主程序要使用标号,其他子程序模块则只用END而不必指定标号。,NAME 模块名 END 标号,7. 定位伪指令,功能:指定其后的程序段或数据块的起始地址的偏移量。数值表达式的值是一个无符号数。,ORG 数值表达式,8. 列表伪指令,自动排版语句 PAGE 行数, 行字数 建立标题语句 TITLE 标题 建立小标题语句 SUBTIL 小标题,二、宏指令语句,1. 宏定义和宏名字(宏指令)
11、 宏名字 MACRO 形式参数1,形式参数2, ENDM 宏定义:为需要多次重复书写的程序段确立(定义)一个名字。 宏调用:经过宏定义的程序段在此后重复书写时用宏名字代替。 宏展开:汇编时,汇编程序遇到宏名字将其对应的宏体展开。,宏体,e.g. 实现两个八位二进制数相乘,结果送BX所指单元,MULTPLY MACRO OPR1, OPR2 PUSH AX MOV AL, OPR1 IMUL OPR2 MOV BX, AX POP AX ENDM,宏名字,形式参数,宏体,宏调用, MULTPLY 3AH, 06H MULTPLY 0C2H, 6BH ,宏展开, PUSH AX MOV AL, 3
12、AH IMUL 06H MOV BX, AX POP AX ,注意: 宏调用前必须进行宏定义 宏调用与子程序调用完全不同,7.3 8086汇编语言程序设计的基本语法,指示性语句与指令性语句: 指令性语句是用指令系统中的指令构成的语句。 格式:标号: 操作码助记符 操作数 ;注释 指示性语句是指示汇编程序进行汇编的操作(伪指令和宏指令)。 格式:名字 定义符 参数 ;注释,指示性语句与指令性语句区别 一个程序经汇编,连接和装入内存后,在执行程序之前: 指示性语句的功能已经完成,故又称伪操作。 而指令性语句的功能尚未完成,需控制CPU去执行,才能完成。,一、源程序语句的组成,NEAR:标号只能做段
13、内转移和段内调用的目标地址。 FAR:标号只能做段间转移和段间调用的目标地址,标号:表示指令所在存储单元的首地址.具有段属性,段基址必须在CS段寄存器中,在段内有偏移量。 两种类性:NEAR和FAR,名字:后不带:,除存储器间接寻址外,名字不作为转移指令和调用指令的目的操作数。,在程序中,标号和名字只能出现一次,助记符由指令系统规定。 定义符由汇编程序规定。 都称为关键字或保留字,不能用作标号、名字、变量名。,二、操作数和参数,可以是常量、变量、寄存器、标号和表达式,不止一个,用,分开,1. 常量,在指令性语句中可以做立即数,也可以做偏移量,e.g. MOV AL, 5AH MOV AX, S
14、I+66H,在指示性语句中一般作为参数或数据项,e.g. ABC DW 1357H ;定义字,2. 变量,代表存放在某存储单元的数据,若变量在名字中出现,称为对变量的定义,就是给变量分配存储单元,且对这个存储单元赋一个符号名变量名。同时将这些存储单元预置初值,可以通过DB、DW、DD等对变量定义。,3. 表达式与运算符,(1) 算术运算符, +、-、*、/:参加运算的数和结果均是整数,除法运算的结果只取整数部分 e.g. 80/9的值为8, MOD:除法取余 SHL/SHR:逻辑左/右移,最右/左边以0补,当移位次数16时,结果恒为0, 表达式1表达式2 :下标运算符,表示加法,把表达式1和表
15、达式2相加形成一个存储器(内存)地址 e.g. MOV AX, DATA110H MOV AX, DATA1+10H,等价,(2) 逻辑运算符 AND、OR、XOR、NOT,注:有些运算符与指令助记符是相同的,但是概念不同 在语句中所处的字段不同,指令位于操作码段,运算符位于操作数段 指令在程序运行时执行,运算符在运算在汇编时完成 指令操作对象是操作数,运算符处理对象是某一个具体的数,(3) 关系运算符 EQ、NE、LT、LE、GT、GE,关系运算符连接两数(这两个数必须同时是数字或同一段内的两个地址)组成一个判定式,若判定式正确(为真),运算结果为0FFFFH,若为假,则运算结果为0000H
16、,e.g. (PORT)=25 MOV AX, 25 EQ PORT 汇编“MOV AX, 0FFFFH” MOV AX, 25 NE PORT 汇编“MOV AX, 0000H”,(4) 分析运算符, SEG 符号名 ;求段基址 e.g. 标号SLAB处于数据段,且段基址为46FFH,则 MOV AX, SEG SLAB ;(AX)=46FFH, OFFSET 符号名 ;求段内偏移量 e.g. 标号SLAB处于数据段,且与数据段基址的距离为10H MOV SI, OFFSET SLAB ;(SI)=0010H, TYPE 符号名 ;求符号名类型值 e.g. DATA1 DB 12H, 34H
17、, 56H DATA2 DW 7890H MOV AX, TYPE DATA1 ;(AX)=1 MOV BX, TYPE DATA2 ;(BX)=2, SIZE 符号名 ;求为符号名分配的字节数 e.g. DATA1 DB 50 DUP (0) DATA2 DD 20 DUP (0) MOV AX, SIZE DATA1 ;(AX)=1*50=50 MOV AX, SIZE DATA2 ;(AX)=4*20=80,必须是用“DUP( )”定义的数据项, LENGTH 符号名 ;求为符号名分配的项数 SIZE、LENGH、TYPE之间的关系: SIZE 符号名=(LENGTH 符号名)*(TYP
18、E 符号名) e.g. 对于“ABC DW 100 DUP (?)” TYPE ABC ;汇编结果为2 LENGTH ABC ;汇编结果为100 SIZE ABC ;汇编结果为200,必须是用“DUP( )”定义的数据项,(5) 属性运算符, 类型 PTR 符号名 ;将符号定义为新类型,BYTE、WORD、DWORD、NEAR、FAR等, THIS 类型 ;指定新类型,规定它所定义的符号名和相邻的下一个语句的符号名具有相同的物理地址 e.g. LABC EQU THIS BYTE LABD DW 1357H, 2468H MOV AL, LABC ;(AL)=57H MOV AX, LABD+
19、1 ;(AX)=6813H, SHORT 标号 ;指出JMP指令的转向地址是在下一条指令的127个字节范围内,(5) 分离运算符, LOW 表达式 ;取低字节 HIGH 表达式 ;取高字节 e.g. SSY=1234H, 则 MOV AL, LOW 5678H ; (AL)=78H MOV AH, HIGH SSY ; (AH)=12H,7.4 汇编语言程序设计的基本方法和技巧,汇编语言的程序设计步骤如下: 1建立数学模型; 2选择算法; 3绘制流程图; 4分配存储空间和工作单元; 5根据流程图编制程序; 6上机调试程序。,1. 顺序程序设计,例 从标号为ADD-BUF的存储单元开始连续存放着
20、两个单字节数,将两数相加,结果送到SUMBUF存储单元中(不考虑进位)。,2. 分支程序设计,选择分支,简单分支,多分支,例 比较两个一字节无符号数X1和X2的大小,把大数存入MAX单元。,分析:比较两个无符号数,可将两数相减,然后根据CF标志位来判断大小。,3. 循环程序设计,WHILE-DO型循环图,REPEAT-UNTIL型循环图,(1)初始化部分 这是循环的准备部分,为程序操作、地址指针、循环计数、结束条件等设置初始值。 (2)循环体,包括以下3个部分: 循环工作部分-这是循环程序的主体,完成程序的基本操作,循环多少次,这部分语句就执行多少次。 循环修改部分-修改循环工作部分的变量地址
21、等,这保证每次重复时,参加执行的数据能发生有规律的变化。 循环控制部分-保证循环条件满足时进入循环;循环结束条件不满足时,退出循环,执行循环体外的后续语句。 (3)循环结束部分 完成循环结束后的处理,如数据分析、结果的存放等。,例 从XX单元开始的10个连续单元中存放有10个无符号数,从中找出最大者送入YY单元。,分析:根据题意,把第一个数先送入AL,将AL中的数与后面的9个数逐个比较,如果AL中的数较小,则两数交换位置,如果AL中的数大于或等于相比较的数,则两数位置不变,在比较过程中,AL中始终保持较大的数,比较9次,则最大者必在AL中,最后把AL中的数送入YY单元。,循环工作部分,循环修改部分,循环控制部分,循环修改部分,初始化部分,循环结束部分,7.7 IBM-PC-DOS系统的功能调用,一、调用方法及注意问题 PC-DOS提供了87个子程序供用户调用,编号为057H(功能号),实现对存储器和I/O设备的管理,1. DOS功能调用的方法,DOS系统功能调用是一种内部中断方式,它是通过INT 21H指令进入功能调用,再通过功能号进入具体子程序。,需要三个语句: 将入口参数送指定寄存器 将功能号(057H)送AH寄存器 使用内部中断指令:INT 21H,2. 注意问题,没有入口参数的子程序,只需要后两条指令
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车辆过户手续代理及车辆购置协议
- 网络域名典当质押贷款合同书模板
- 成品油运输与物流金融合同
- 招标经理面试题及答案
- 电子产品采购合同补充协议示范文本
- 小学家庭教育实施要点
- 私企运营面试题及答案
- 品管进厂考试题及答案
- 高端酒店服务员岗位招聘与劳动合同书
- 医院资源使用方案
- 房颤患者用药护理
- 2025年全国统一高考数学试卷(全国二卷)
- 无菌技术及手卫生
- 托管机构转让合同范本
- 绿电制绿氢及其综合利用技术
- 农村房产抵押协议书
- 2025年中国主控操作键盘市场现状分析及前景预测报告
- “临床营养科建设与管理指南”实施细则-I级标准化临床营养科建设示范基地
- 分拣物流考试试题及答案
- 初步设计及概算评估咨询服务方案投标文件(技术方案)
- 签订屠宰协议书范本
评论
0/150
提交评论