西南交大第四章PPT.ppt_第1页
西南交大第四章PPT.ppt_第2页
西南交大第四章PPT.ppt_第3页
西南交大第四章PPT.ppt_第4页
西南交大第四章PPT.ppt_第5页
已阅读5页,还剩123页未读 继续免费阅读

下载本文档

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

文档简介

第四章汇编语言程序设计 1 2 学习目的 1 掌握宏汇编语言程序的结构 2 掌握宏汇编语言程序设计与调试方法 3 掌握宏汇编语言语法规则 语句 伪指令 表达式 运 算符 4 能用MASM DOS功能调用和BIOS功能调用设计程序 第一节概述 3 4 概述 几个术语 1 汇编语言源程序 指按汇编语言语法规则编写的源程序 2 汇编 过程 将汇编语言源程序翻译成机器码的过程 称为汇编过程或简称汇编 3 手工汇编与机器汇编 4 小汇编与宏汇编 5 目标程序 汇编后所得的机器码程序称为目标程序 5 必须按严格的语法规则和规定的格式来编写源程序 才能正确汇编成可执行程序 手写汇编语编辑程序言源程序 汇编语言源程序 ASM 汇编程序汇编 Masm 机器语言目标程序 OBJ 连接程序连接 Link 机器语言执行程序 EXE 6 汇编语言源程序一般结构 1 程序在内存中的段结构 2 把程序设计成一个过程 子程序 我们用汇编语言设计 的用户程序都是运行在操作系统下 因此 从操作系统角度来看 用户程序都是操作系统中的一个子程序 3 设计时应考虑程序运行结束后如何返回操作系统 7 一 完整的汇编语言实例 例 在屏幕上显示字符串 Hello thisisasampleprogram DATA SEGMENT 数据段 MSG1DB Hello thisisasampleprogram 0DH 0AH DATASTACK ENDSSEGMENT ST1 DB 100DUP 堆栈段 TOPSTACK EQU ST1ENDS CODE SEGMENT 代码段 MAIN PROC FAR ASSUME CS CODE DS DATA SS STACK 8 START MOVAX STACK 送堆栈段段地址 设置自己的堆栈段 MOVMOV SS AXSP TOP 正常返回所需段地址及偏移地址 PUSHDSMOVAX 0PUSHAX MOVAX DATA 送数据段段地址 MOV DS AX MOV AH 9 DOS9号功能调用 显示字符串 MOV DX OFFSETMSG1 INT21HRETMAINENDPCODEENDSENDSTART MOVAH 4CINT21H 9 三段式结构 数据段 堆栈段 代码段每段均由伪指令SEGMENT开始 ENDS结束 整个源程序用END语句结尾 END后面可跟该程序执行的起始地址START 返回指令 是使用4CH号DOS功能调用 MOVAX 4C00H 或MOVAH 4CH INT 21H 二 汇编语言上机过程 1 源程序的建立 2 汇编 3 连接 建立DOS格式的可执行文件 NEXT10 11 编辑 源程序的编辑建立 可用多种编辑程序建立源程序 但要求源程序用ASCII码 存储 源程序文件的扩展名应为 ASM 也可用WORD来编辑修改 存盘时存为扩展名为 TXT的文本文档 然后用DOS命令将其改为扩展名为 ASM即可 返回 汇编用宏汇编MASM EXE或小汇编ASM EXE对源文件进行汇编 检查源程序中语法错误 给出出错信息 产生目标文件 OBJ文件 列表文件 LST文件 和对照文件 CRF文件 展开宏指令 一个EXAMPLE ASM源程序的汇编过程及屏幕显示如下 C MASMEXAMPLE 返回12 13 连接汇编程序产生的二进制目标文件 OBJ文件 仍不可执行 必 须经过连接 将它转换成 EXE文件 连接程序为 LINK EXE 它把多个模块连接在一起 这些模块可以是库文 件或目标文件 连接指令如下 C LINKEXAMPLE 如果连接多个目标文件 将多个目标文件名一次输入 中间用加号 连接 源程序没有堆栈段 连接结果给出无堆栈段的警告错误 但不影响程序执行 如果需要 可用EXE2BIN文件将 EXE文件转换成 COM文 件 COM文件也是可运行文件 返回 第二节汇编语言程序格式 14 汇编语言程序格式 1 指令性语句 指令性语句与机器指令相对应 格式为 标号 指令助记符操作数 操作数 注释 2 伪指令语句 伪指令语句没有对应的机器指令 汇编程序汇编源程序时对伪指令进行处理 可完成数据定义 存储器分配 段定义 段设定 指示程序结束等功能 格式为 名字 伪指令指示符操作数 操作数 注释 15 3 宏指令语句 宏指令语句由标号 宏指令和注释组成 宏指令是由编程者按一定的规则来定义的一种较 宏大 MACRO 的指令 一条宏指令可包括多条指令或伪指令语句 4 语句中的操作数 数据项 汇编语言中使用的操作数 可以是常数 寄存器 存储器 变量 标号或表达式 其中常数 变量和标号是三种基本数据项 16 17 1 常数 固定值 没有属性 是确定的数据 2 变量 通常指存放在存储单元中的值 是可以修改的 所有的变量都具有三个属性 段属性 SEGMENT 指变量所在段的段基址 它必须在一个段寄存器中 如 DS ES CS SS偏移属性 OFFSET 指变量所在地址与所在段的段首地址之间的地址偏移字节数 类型属性 TYPE 变量的类型属性指变量中每个元素所包含的字节数 类型包括字节变量 BYTE 字变量 WORD 及 双字变量 DWORD 等 3 标号 指令性语句所在地址的符号表示 标号也具有三个属性 段属性 SEGMENT 标号所在段的段基址 标号的段是它所出现的那个代码段 所以由CS指示 偏移属性 OFFSET 标号所在地址与所在段的段首址之间的偏移地址字节数 类型 TYPE 标号的类型属性指在转移指令中标号可转移的距离 也称距离属性 类型NEAR 只能实现本代码段内转移或调用 类型FAR 可以作为其它代码段中的目标地址 实现段间转移或调用 18 4 保留字 保留字是汇编语言中预先保留下来的具有特殊含义的符号 只能作为固定的用途 凡是8086的指令 伪指令 寄存器名等都是保留字 因此 标号 变量名 段名 过程名 符号名等都不能使用保留字 19 第三节程序块定义伪指令 20 一 程序分段定义伪指令 1 段定义伪指令SEGMENT ENDS 段名SEGMENT 定位类型 组合类型 类别 段内语句序列 段名ENDS 功能 将一个逻辑段定义成一个整体 NEXT 1 定位类型 用来规定对段起始边界的要求 可以有4种 选择 PAGE PARA WORD BYTE若定位类型缺省 则缺省值为PARA paragraph 21 22 定位类型 用来规定对段起始边界的要求 可以有4种选择 PAGE 段起始地址的最低8位必须为0 即从一页 PAGE 的 起点开始 起始地址 00000000 PARA 段起始地址的最低4位必须为0 即从某一节 PARAGRAPH 的边界开始 起始地址 0000WORD段起始地址的最低位必须为0 从偶地址开始 起始地址 0BYTE段起始地址为任意值 即从任何字节开始都行 返回 起始地址 23 2 组合类型表示本段与其它段的关系 为连接程序提供信息的 可以有6种选择 NONE 表示本段与其它段逻辑上不发生关系 每段都有自己的基地址 这是缺省的组合类型 PUBLIC 连接程序首先将本段与其它同名同类别的段相邻地连接在一起 然后为所有这些PUBLIC段指定一个共同的段基址 STACK 与PUBLIC同样处理 但此段作为堆栈段 当多个程序模块连接在一起时 各模块中至少有一个模块内有 一个STACK段 24 COMMON 连接程序为本段和其它同名同类别的段指定相 同的段基址 因而这些段是相互重叠的 段的长度取决于 最长的COMMON段的长度 AT 表达式 表示该段按绝对地址定位 段基值为数值表达式的值 位移量为0 但这种方式不能用来指定代码段 MEMORY 连接程序将把本段定位在被连接在一起的其它所有段之上 若有多个MEMORY段 汇编程序认为所遇到的第一个为MEMORY 其余为COMMON 返回 25 3 类别 这是编程者给各段赋予的一种名字信息 连接程序将类别名相同的段组成一个段组 用它们共同的类别名作为这个段组的名字 类别必须用单撇号撇起来 通常使用的类 别有 STACK CODE DATA 等等 返回 2 段指示伪指令ASSUME ASSUME伪指令是用来指示程序中的段与各段寄存器之间的关系的 其格式为 ASSUME段寄存器名 段名 段寄存器名 段名 段名为程序中已定义过的任何段名或组名 也可以是表达式 SEG变量 或 SEG标号 或者关键字NOTHING 段寄存器必须正确赋值才能指向指定的段26 注意 使用ASSUME伪指令 仅仅告诉汇编程序哪个段寄存器指向哪一个段 并没有给各段寄存器装入实际的值 而段地址的真正装入必须通过给段寄存器赋值的执行性指令来完成 所以要用指令来完成给段寄存器赋初值 例如 CODESEGMENTASSUMECS CODE DS DATA ES NOTHING SS STOCK MOVMOV AX DATADS AX 27 28 一般地 由ASSUME指示过的段寄存器都应赋值 但CS寄存器例外 CS值是由DOS把 EXE模块装入内存时自动设定的 但ASSUME伪指令中一定要给出CS段寄存器对 应的正确段名 对堆栈段若不指示不赋值 此时利用的是系统设置的堆栈 29 3 分组伪指令GROUP GROUP是群或组的意思 用来把程序块中若干不同名 的段集合成一个组 并赋予一个组名 使它们都装入一个 物理段中 64KB 这样 组内各段间的转移都可以看作段 内转移 格式如下 组名GROUP段名1 段名2 其中段名也可为表达式 SEG变量名 或 SEG标号 30 4 定位伪指令ORG和当前位置计数器 汇编程序汇编源程序时 为每一个新定义的段设置一个初值为0的位置计数器 对该段进行汇编时 对需要占用存储器的语句 包括伪指令及指令性语句 分配存储单元 所有被占用的存储单元数累加到一起作为位置计数器的值 反映位置计数器的当前值 表示汇编程序所能分配的下一个存储单元的偏移地址 可出现在表达式中 为了能改变该位置计数器的内容 可用伪指令ORG来实现 格式 ORG表达式 表达式的值应该是非负的整数 而且保证计数器指针定位在0 65535之间 例 CSEGSEGMENT ORG2 目标代码从0002H开始产生 ORG 3 跳过三个字节后生成目标代码 CSEGENDS 表示位置计数器的当前值 可以在表达式中使用 它的值是下一个所能分配的存储器单元的偏移地址 31 32 5 程序结束伪指令END 格式 END 标号名 功能 标记汇编源程序结束 END是伪指令助记符 不可缺省 放在源程序的最后一行 每个模块只有一个END 汇编程序到END语句停止 汇编 标号名是该程序中第一条可执行语句的标号名 可以 缺省 若一个程序包含多个模块 END后面带的标号为主 程序模块中的标号名称 6 文件标题伪指令TITLE 格式 TITLE文本名功能 将文本名赋给源程序目标模块作名字 TITLE是伪指令助记符 文本名可写60个字符 但汇编程序只将前6个字符作为模块名 在列表文件中打印出标题来 33 34 二 过程定义伪指令PROC ENDP在程序设计中 往往将一些重复出现的语句组定义为子程序 过程 由CALL指令来调用 过程定义的格式为 过程名 PROC NEAR FAR RETn 语句序列 语句序列 过程名 ENDP 35 注意 过程名是由用户设定的标识符 在程序中可以作为标号使 用 PROC和ENDP必须成对出现 每一过程中至少得有一个RETn语句 n可缺省 整个过 程执行的最后一条语句必须是RETn 过程的类型有NEAR和FAR 缺省为NEAR类型 过程可以 嵌套 使用 即过程又可以调用别的过程 过程还可以 递归 使用 即过程又可以调用过程本身 ENDS SEGMENT PROCFAR CALLSUB2 过程 嵌套 RETENDP PROCNEAR RETENDP CALLFARPTRSUB1 段内调用但要用段间调用来实现 ENDSSEGMENT CALLFARPTRSUB1 段间调用36 SEGXSUB1SUB1SUB2SUB2SEGXSEGYSEGY 37 三 程序块间通信 伪指令PUBLIC和EXTRN 汇编语言程序设计可采用多模块结构 在多模块间相 互访问时 应在每一模块内交待清楚以下两方面信息 本模块内定义的变量和标号 包括过程名 哪些可以作为 外部标识符被其它模块访问 这是PUBLIC的功能 本模块将访问哪些外部标识符 这是由EXTRN提供的 38 格式 PUBLIC符号1 符号2 EXTRN符号1 类型 符号2 类型 其中符号可以是符号常数 变量 标号或过程名 在一个模块内或者一个段内由PUBLIC定义过的符号 可以在别的模块或段内直接引用 EXTRN说明本模块中使用的 符号已在别的模块或段内定义过 类型可以是 BYTE WORD DWORD NEAR FAR 等 这里所有符号的类型必须和它们在其它模块内定义的类型保持一致 39 分别汇编下面两个程序 EXTRNRECEIVE FAR SUBSEG SEGMENT CSEG SEGMENT RECEIVE PROC FAR RECEIVE FARRECEIVE RECEIVE STARTPROC CALL STARTENDP PUBLIC RETENDP CSEG SUBSEG ENDSEND ENDSEND 程序 中无RECEIVE子程序 由EXTRN声明来自外部 程序 声明RECEIVE此子程序可以共享 第四节MASM中的表达式和运算符 40 41 1 算术运算符 2 逻辑运算符 3 关系运算符 运算结果为0FFFFH 0FFH或0 4 数值返回运算符 数值返回运算符是对存储器地址进行运算的 它可以将存储器地址的三个重要属性 即段 偏移量和类型分离出来 1 SEG 2 OFFSET 3 TYPE 求变量或标号的类型值 4 LENGTH 确定某个变量所含的数据元素的个数 由 DUP定义数据个数时才有效 42 5 SIZE 确定变量所含的字节存储单元的总数 由 DUP定义数据个数时才有效 5 属性修改运算符 这种运算符为存储器地址操作数临时指定一新的属性 而忽略当前的属性 故称为属性修改运算符 1 PTR 2 段超越前缀 3 SHORT 4 THIS 5 HIGH和LOW 字节分离符 6 其它运算符 7 表达式由运算对象及运算符组成 汇编程序完成表达式的 运算 运算结果作为语句的操作数使用 NEXT43 44 算术运算符 算术运算符包括 MOD 求余 SHL 左移 左移1位相当于乘2 和SHR 右移 右移1位相当于除2 共七 种运算 以上七种运算可直接对数字进行运算 但对地址的运算 只用加法和减法才具有实际意义 并且要求进行加 减的两个地址应在同一段内 否则运算结果便不是一个有效地 址 通常是在标号上加 减某一个数字量 例如 DA1 2 K2 3各表示一个存储单元的地址 45 应用举例 DATABUFFERDATACODE SEGMENTDB2 3 5 7 4ENDSSEGMENT MOVAL BUFFER 3 将BUFFER字节单元以后的第三单元的内容送ALMOVAH 3 2 5MOD3 将表达式3 2 5MOD3的值送ALMOVBH 010lBSHL4 将二进制数0101B左移四次后送BH 01010000BMOVBL 01010000BSHR4 将二进制数01010000B右移四次后送BL CODE ENDS 返回 逻辑运算符逻辑运算符有 AND OR XOR和NOT 其中NOT是单操作数运算符 其它是双操作数运算符 举例 MOV AX 0FF00HAND10AEH 将两个数相 与 的结果送AX 汇编成 MOVAX 1000H ANDCX 00FFHAND10AEH 将表达式的值算 出后 再和CX相 与 汇编成 ANDCX 00AEH46 47 从以上两例可看出 逻辑运算是在汇编时完成的 表达式的值由汇编程序确定 不影响标志位 而逻辑指令是在程序执行时完成逻辑操作的 0FF00H和00FFH与一个16位数相 与 可以分别提取其 高8位和低8位 这种技术通常称为 屏蔽 返回 48 关系运算符 关系运算符有EQ 相等 NE 不相等 LT 小于 GT 大于 LE 小于或等于 GE 大于或等于 共六种 关系运算都是双操作数运算 它的运算对象只能是两个性 质相同 数据或地址 的项目 对两个性质不同的项目进行关 系运算是无意义的 关系运算的结果只可能是两种情况 即关系成立或不成立 当关系成立时 运算结果为0FFFFH 否则为0 49 应用实例 MOVAX 2LT5 汇编成 MOVAX 0FFFFH 2小于5关系成立 MOVAX 2GT5 汇编成 MOVAX 0 2大于5关系不成立例 ANDAX NUMBLT5 AND30 OR NUMBGE5 AND20 当NUMB 5时 汇编成ANDAX 30NUMB 5时 汇编成ANDAX 20 AND出现在操作符位置是助记符 出现在操作数位置是伪指令 返回 50 SEG运算符 格式 SEG变量名或标号名 SEG用来求取一个变量或标号的段基址 例 DATA是从存储器实际地址02000H开始的一个数据段如下 DATASEGMENTVAR1DB20 30VAR2DW2000H 3000HVAR3DD22002200H 33003300HDATAENDS MOVBX SEGVAR1汇编成 MOVBX 0200H MOVCX SEGVAR2汇编成 MOVCX 0200H MOVDX SEGVAR3汇编成 MOVDX 0200H 返回 OFFSET运算符 格式 OFFSET变量名或标号名 OFFSET运算符返回一个变量或标号的段内偏移地址值 是程序设计中常用的运算符 51 52 例 对上例中定义的数据段 用OFFSET可以求出VAR2的段 内偏移地址 DATASEGMENTVAR1DB20 30VAR2DW2000H 3000HVAR3DD22002200H 33003300HDATAENDS MOV汇编成 BX OFFSETVAR2MOVBX 2 变量VAR2的偏移量为2 汇编程序将变量的偏移地址送到BX中 相当于指令 LEABX VAR2 返回 TYPE运算符 格式 TYPE变量或标号 TYPE运算符可加在变量或标号的前面 求出的是这些存储器操作数的类型值 TYPE加在变量前面返回的是这个变量的字节数 TYPE加在标号的前面 返回该标号的属性是 1 NEAR 或是 2 FAR 例 DATA SEGMENT VAR1VAR2VAR3DATA DB20 30DW2000H 3000HDD22002200H 33003300HENDS 对于上面定义的数据段 则 TYPEVAR1 1TYPEVAR2 2TYPEVAR3 4返回54 55 LENGTH运算符 LENGTH运算符返回变量所含的数据元素的个数 即以变量类型 字节 字或双字 为单位的数据存储单元的个数 格式为 LENGTH变量 LENGTH的取值 根据定义变量时 数据定义伪指令助记 符后面第一个表达式的形式来确定 如果助记符后面的第一个表达式为重复子句 nDUP 简单表达式 则取值为n 如果是其它形式表达式 则返回的结果都是1 56 例 DATA SEGMENT N1N2N3 DWDBDW 10DUP 0 2367H 3DUP 1 BASIC 8DUP 0 20 5DUP 2 DATACODE ENDSSEGMENT 10 AL 1 BL 1 CL MOVAL LENGTHN1MOVBL LENGTHN2MOVCL LENGTHN3 CODE ENDS 返回 Duple dju pl 57 SIZE运算符SIZE确定返回其后的变量所含的字节存储单元的总数 格式为 SIZE变量 SIZE返回的值是LENGTH返回的值与TYPE返回的值的乘 积 即 SIZE变量 LENGTH变量 TYPE变量 例 DATA SEGMENT 10DUP 0 2367H 3DUP 1 BASIC 8DUP 0 20 5DUP 2 N1N2N3DATA DWDBDWENDS 对上面定义的数据段 SIZEN1 LENGTHN1 TYPEN1 10 2 20SIZEN2 1 1 1SIZEN3 1 2 2返回58 59 PTR运算符 PTR用来生成一个新的存储器地址操作数 并不实际分配存储器 其格式为 类型PTR存储器地址表达式 PTR将它左边的类型指定给右边的地址表达式 在PTR表达式中出现的类型可以是BYTE WORD DWORD NEAR FAR等 例 VAR1DW2030H 此时 VAR1的当前类型为WORD 应用1 用PTR建立新的变量VAR2和VAR3 VAR2EQUBYTEPTRVAR1VAR3EQUBYTEPTRVAR1 1VAR1与VAR2为同一存储单元 但类型却不同 TYPEVAR1 2 VAR1是字型的TYPEVAR2 1 VAR2是字节型的返回60 段超越前缀 格式 段寄存器名 地址表达式 例如 MOVAX ES BX SI 本运算符还有两种形式 段名 地址表达式组名 地址表达式返回61 SHORT运算符本运算符用来修饰JMP指令中转移地址的属性 指出转移地址是在下一条指令地址的 128 127个字节范围之内 格式 SHORT标号 例如 JMPSHORTTAG TAG 则标号TAG与JMP指令的距离不能大于127个字节 返回62 63 THIS运算符 THIS运算符像PTR一样 用来建立一个特殊类型的存储 器地址操作数 而不实际为它分配新的存储单元 用THIS建立的存储器地址操作数的段和偏移量与目前所 能分配的下一个存储单元的段和偏移量相同 但类型由 THIS指定 格式 THIS类型 凡是在PTR中可以出现的类型 在THIS中也允许出现 例 提高访问变量的灵活性 VAR2EQUTHISBYTEVAR1DW2030HVAR1和VAR2的段基址和偏移量都相同 但它们的类型不同 即 TYPEVAR1 2TYPEVAR2 1返回64 65 HIGH和LOWHIGH和LOW被称为字节分离符 它们将一个16位的数或表达式的高字节和低字节分离出来 例 COUNTEQU2030H COUNT为一个符号常数 它等 值于2030H 则 MOVAH HIGHCOUNT MOVAL LOWCOUNT汇编成 MOVAH 20H MOVAL 30H 返回 66 其它运算符其它运算符有 MASK和WIDTH等6种 1 圆括号 圆括号用来改变运算符的优先级别 中的运算符具有最高优先权 2 方括号 方括号主要用来表示地址表达式或多重变量的下标值 用 表示地址表达式 用 来表示多重变量的下标值 3 尖括号及圆点 和 运算符在结构中专用 具体说明在结构中解释 4 MASK和WIDTH MASK和WIDTH运算符在记录中专用 返回 67 运算符优先级 高1 中的项目 LENGTH SIZE WIDTH MASK 2 段超越前缀运算符 3 PTR OFFSET SEG TYPE THIS4 HIGH LOW 5 MOD SHL SHR6 7 EQ NE LT LE GT GE8 NOT 9 AND10 OR XOR 低11 SHORT 属性修改与数值返回类 算术运算符关系运算符 逻辑运算符 第五节 伪指令及宏指令 68 数据定义及存储器分配伪指令 格式 变量名 DB DW DD DQ DT 注释 变量名是任选项 它代表所定义的第一个单元的地址 DB定义字节变量 占一个字节 DW定义字变量 二个字节 DD定义双字变量 占四个字节 DQ定义四字变量 占八个字节 DT定义十个字节 占十个字节 69 70 表达式可以是常数 数值表达式 地址表达式 字符串和数据表格 其中 地址表达式只适用于DW和DD两条伪指令 如果该地址表达式为一变量 或标号 名 DW取其偏移地址来初始化变量 DD取其逻辑地址来初始化变量 两个字 VAR2DWVAR1 取VAR1的偏移地址来初始化VAR2 VAR3DWVAR1 4取VAR1的偏移地址 4来初始化VAR3 VAR4DWVAR4 取VAR4自己的偏移地址来初始化自己 VAR5DDVAR5 取VAR5自己的逻辑地址来初始化自己 71 DUP定义重复数据 格式 变量名DB DW DD DQ DTnDUP 初值 n表示要重复的次数 可以是n 0的数值表达式或常数 初值以圆括号括起来 表示要重复的内容 它可以是下列的 内容之一 一个问号 表示只分配存储单元 但无确切的初值 一个数据项表格 一个数值表达式或地址表达式 实例已知数据段定义如下 DATA SEGMENT ARRAY1DB2DUP 0 1 ARRAY2DW100DUP ARRAY3DB20DUP 0 1 4DUP 2 5 DATA ENDS 存储器分配图见P153图4 372 73 例 AT55H DATAZERO SEGMENTDB0 ONETWOFOUR 5ZERO TWO5 6 ONETWOFOURSIXATEDATA DWDDDWDWDBENDS ATE 1E FF TWOFOURSIX 030055000C00FD ONE 0100 ZERO 00 0000H 0001H0002H 0003H0004H0005H0006H0007H0008H0009H 000AH 000BH 74 符号定义伪指令EQU和 1 EQU伪指令 格式 符号名EQU表达式符号名应为一个有效的标识符 表达式可以是表达式 常数 寄存器名甚至是一个指令助记符 此伪指令并不申请分配内存 其功能为 为常数定义一个符号 如 ONETWOSUM EQUEQUEQU 12ONE TWO SUM为3 75 给变量或标号定义新的类型属性并取一个新名字 如 BYTESFIRST WFIRST DW DBEQUEQU 4DUP WORDPTRBYTESDWORDPTRBYTES 给由地址表达式指出的任意存储单元定义一个名字 格式 符号名EQU地址表达式 XYZAP EQU BP 3 EQUARRAY BX SI EQUES ALPHA 用来给汇编语言中的任何符号定义一个新名字 格式 新名字EQU原符号名 COUNTLD EQUEQU CXMOV 使用EQU时注意 一个符号经EQU赋值后 在整个程序中 这个符号不能重新再赋值 鉴于这一点 给编程带来了一些不便 因此 8086宏汇编语言还设置了一个 伪指令 76 77 2 伪指令功能与EQU相似 很多情况下可以相互代替 并且打破了EQU的上述限制 即经 赋值符号是可以重新定义的 如 COUNTEQU 20 20 1 COUNTEQU但 COUNT 20COUNT 20 1 设LAB1是代码段的一个标号 由于EQU语句中不允许标号出现 所以 下列语句是错误的 LAB2EQULAB1 10 但 LAB2 LAB1 10 78 三 LABEL伪指令 LABEL伪指令用于在原来变量 标号的基础上定义一个类型不同的新的变量 标号 格式 变量名或标号名LABEL类型 变量的类型有BYTE WORD和DWORD 标号的类型有NEAR和FAR 例 用LABEL定义变量 VAR1LABELBYTEVAR2DW10DUP VAR1是一个字节型变量 它的开始地址总是与它下面可以分配的第一个存储单元的地址相同 VAR1和VAR2地址相同 但类型不同 VAR1是字节型变量 而VAR2是字型变量 79 80 三种情况的作用相同 1 GO1 LABELFAR GO 则有 JMPGO 段内转移 JMPGO1 段间转移 2 GO1GO EQUTHISFAR 则有 JMPGO 段内转移 JMPGO1 段间转移 3 GO 则有 JMPGO 段内转移 JMPFARPTRGO 段间转移 四 结构定义伪指令STRUC ENDS结构将一组关联数据以某种形式组合在一起 它定义了一种类型的变量 结构变量使用结构的三个步骤 定义结构类型 建立结构变量 引用结构 1 结构的定义 格式 结构名STRUC 数据定义语句序列 结构名ENDS81 例 对于学生成绩情况 可定义一个结构STUDENT ABCD STUDENTSTRUCNAME1DBNODB ENGLISHDBMATHSDBPHYSICSDB STUDENTENDS其中 STUDENT叫做结构名 结构内数据定义语句中的变量名叫做结构字段名 如NAME1 NO ENGLISH MATHS和PHYSICS都是结构字段名 82 结构名 结构字段名 83 注意 结构仅仅是一种数据结构的模式 并不为它分 配实际的存储单元和赋值 故称为形式参数 它仅仅告诉汇编程序存在着这样一种形式的数据结构 因此 使用结构之前还必须进行预置 即分配实际的存储单元并赋值 2 结构的预置 建立 结构的预制就是为结构变量命名 分配存储单元并赋初值 格式 结构变量名结构名 注意事项 结构名是结构定义时用的名字 结构变量名是程序中具体使用的变量 它与具体的存储空 间及数据相联系 程序中可直接引用它 字段值表用来给结构变量赋初值 表中各字段的排列顺序 及类型应与结构定义时一致 各字段间以逗号分开 84 85 例如 对前面定义的STUDENT结构 这里可以定义一些结构变量 每个变量代表一个学生的信息S1STUDENTS2STUDENTS3STUDENT 结构变量名 结构名 86 通过结构预置语句 可以对结构中某些字段进行初始化 但初始化时有一定的限制和规定 在结构定义中具有一项数据的字段才能通过预置来代替初 始定义时的值 而用DUP定义的字段或一个字段后有多个数据项的字段 则不能在预置时修改其定义时的值 DATASTRUC 简单元素 可以修改 多重元素 不能修改 简单元素 可以修改 可用同长度的字符串修改 多重元素 不能修改 A1A2A3A4A5DATA DB29HDB20 30DW DB ZXC DW20DUP ENDS 各字段的排列顺序及类型应与结构定义时相一致 以 分隔 若某些字段的内容采用定义时的初值 则在预置语句中这 些字段的位置仅写一个逗号即可 若所有的字段都如此 则仅写一对尖括号即可 在任何时候不可省略 如果所替换或者以 保留的形参少于结构字段的总和 则其后的形参也被确认为实参 字符串的处理 多于形参定义的串长度则截去 少于串长 度的后面补空格 87 88 3 结构的引用程序中引用结构变量 可直接写结构变量名 若要引用结构变量中的某一字段 则采用如下形式 结构变量名 结构字段名或者 先将结构变量的起始地址的偏移量送某个地址寄存器 再用 地址寄存器 结构字段名例如 若要引用结构变量S1中的ENGLISH字段 则以下两种用法都是正确的 MOVAL S1 ENGLISHMOVBX OFFSETS1MOVAL BX ENGLISH 结构应用举例 例 有三个学生的姓名 学号及ENGLISH成绩用结构的形式 存入内存中 试编程显示出ENGLISH不及格的学生的姓名 源程序 DATASEGMENT STUDENTSTRUC NAME1DBNODBENGLISHDB ABCD STUDENTENDS S1STUDENTS2STUDENTS3STUDENTDATAENDS 结构定义 结构预置89 CODESTART SEGMENTASSUMECS CODE DS DATAPROCFAR PUSHDS 保存返回地址 MOVAX 0PUSHAXMOVAX DATA MOVDS AXMOVDH 3 建立数据段基址 人数 MOVBX OFFSETS1 BX指向SI的第一字节90 BEGIN MOV AL BX ENGLISH 取ENGLISH字段CMPAL 60 JGENOSHOW 大于或等于60分 不显示 MOVCX 4 控制下面的循环次数 SHOW MOVDL BX 显示姓名 MOVAH 2INT21H INCBXLOOPSHOWSUBBX 491 2号DOS功能调用 92 NOSHOW ADD BX 6 BX指向下一个结构 DECJNZRET DHBEGIN 三个学生处理完毕后 返回DOS START ENDP CODE ENDS END START MOVAH 4CH INT21H 六 宏指令程序中重复出现的一组语句可定义成 宏指令 目的是简化汇编语言源程序的书写过程 1 宏定义伪指令MACRO ENDM 格式 宏名MACRO 形式参数1 形式参数2 宏体 重复使用的语句序列 ENDM形式参数是可选项 展开时用来定义宏体中某些参数和符号 93 94 例如 SHIFTMACRO MOVCL 4SALAL CLENDM经宏定义语句定义的宏名 在应用时可直接引用 称为宏调 用 在需出现AL值算术左移4次的指令序列时只需要用一条宏 指令SHIFT来替代即可 95 2 宏调用 格式 宏指令名 实在参数1 实在参数2 例如 定义宏指令如下 SHIFT MACROMOVSAL X YCL XY CL ENDM宏调用时 形式参数要用实在参数取代 顺序也应与形式参数顺序相同 例如 SHIFT4 AL AL的内容算术左移4次 SHIFT4 BX BX的内容算术左移4次 96 当宏指令中的形式参数定义的是指令中的符号时 应在其前面加一个分隔符 方能当成形式参数 例如 定义宏指令如下 SHIFTMACRO X Y Z MOVCL X S Z Y CL ENDM则宏调用时 通过填写不同的实在参数 以实现不同的功能 例如 SHIFT4 AL AL AL的内容算术左移4次SHIFT6 BX AR BX的内容算术右移6次 SHIFT8 SI HR SI的内容逻辑右移8次 将在程序中经常用到的显示字符串的功能调用用宏指令来实现 定义宏指令如下 DISPLAYMACRO STR MOVAH 9MOVDX OFFSETSTRINT21HENDM要显示MSG1指示的字符串 只需写DISPLAYMSG1即可 源程序在汇编后 在引用宏名的地方 插入了宏体 称为宏扩展 97 第六节汇编语言程序设计方法 98 99 汇编语言程序设计方法 五种基本程序结构 顺序 IF THEN ELSE 简单分支 CASE 多分支 DO WHILE 先判断 后循环 DO UNTILE 先循环 后判断 N N N Y Y Y 100 程序设计的步骤 解题任务分析数据组织算法 编写代码 设计优秀的程序与编程经验 是否掌握相关学科知识等 内容有关 例一 例1 编写程序将一个数组中正数与负数分成两个数组并分别 显示正数与负数的个数 课本P191页4 12 为简单起见 假定数组的每一个元素为字节数据 且数组长度小于255 算法分析 判断一个数为正数或负数 只需判断其符号位为0或1 解题时数据结构安排 就本题来说 显然应设置几个变量 两个数组变量 存储正数与负数数组 三个字节变量 分别计数原数组 正数与负数数组长度 程序流程图 101 处理完 显示正数与负数个数 开始初始化取一个数是正数 Y存入正数数组正数个数加1数组长度减1 Y N 结束 返回DOS地址设置 地址指针设置 数据段设置 计数器赋初值 N存入负数数组负数个数加1DOS功能调用 DATEMSG1MSG2MSG3 SEGMENTDB Numberofpositivenumber DB Numberofnegativenumber DB H 0DH 0AH STR1COUNT DB EQU STR1 原数组 原数组长度 255 PLUSMINUS DBCOUNTDUP DBCOUNTDUP 正数数组 负数数组 NUM PLUSDB NUM MINUSDB 计数正数个数 计数负数个数 DATA ENDS CODESORT SEGMENTPROCFAR ASSUMECS CODE DS DATASTART MOVAX DATA MOVDS AX 建立数据段基址 MOVSI OFFSETSTR1MOVDI OFFSETPLUS MOVBX OFFSETMINUS 建立地址指针 原数组长度 MOVCX COUNTMOVNUM PLUS 0 MOVNUM MINUS 0 变量初始化 LA1 MOVAL SI TESTAL 80H JZPLMOV BX AL 正数转pl 负数处理 INCNUM MINUSINCBXJMPLA2PL MOV DI ALINCNUM PLUSINCDILA2 INCSILOOPLA1 计算完毕 以下为显示程序MOVDX OFFSETMSG1MOVAH 9INT21H 显示 Numberofpositivenumber MOV AL NUM PLUS CALL DISPLAY 显示正数个数 十六进制 MOV DX OFFSETMSG3 MOV AH 9 显示H 回车换行 INTMOVMOV 21HDX OFFSETMSG2AH 9 INT 21H 显示 Numberofnegativenumber MOV AL NUM MINUS CALL DISPLAY 显示负数个数 十六进制 MOV DX OFFSETMSG3 显示H 回车换行 MOVINTMOVINTSORT AH 921HAX 4C00H21H 返回DOSENDP DISPLAYPROCNEARMOVDL AL 提出高四位 高四位移至低四位 低于等于时转移 转换为ASCII码 ANDDL 0F0HMOVCL 4SHRDL CLADDDL 30HCMPDL 39HJBELA3ADDDL 7LA3 MOVAH 02 显示高位 提出低四位 INT21HMOVDL ALANDDL 0FHADDDL 30HCMPDL 39HJBELA4ADDDL 7 LA4 MOVAH 02 INT21HRETDISPLAYENDPCODEENDSENDSTART子程序Display将AL中的两位16进制数输出到屏幕 调用2号DOS功能中断 入口参数 AL 要显示之数字 出口参数 无 本例主程序与子程序之间通过寄存器传递参数 109 例二 查表程序 例二 查表程序 查立方表 y x3 STACK SEGMENTPARASTACK STACK DB 100DUP STACKDATA ENDSSEGMENT XVARYVAR DBDW 待查数据X 查询结果Y 0 1 8 27 TABLEDATA DWENDS CODE SEGMENTASSUMECS CODE DS DATA SS STACKMOVAX DATA MOVDS AX DS赋初值 MOVBX OFFSETTABLEMOVAH 0MOVAL XVARSHLAX 1 X 2ADDBX AXMOVAX BX MOVYVAR AXMOVAH 4CHINT21H 返回DOS系统 CODE ENDSEND 111 例三 散转程序 STACK SEGMENTPARASTACK STACK DB 100DUP STACKDATA ENDSSEGMENT ADDR T DW R0 R1 R9 定义散转表 DATACODE ENDSSEGMENTASSUMECS CODE DS DATA SS STACKMOVAX DATAMOVDS AX MOV AH 01 键盘输入 结果存AL INTMOVAND 21HAH 0AL 0FH 保留低四位 ASCII 2进制 ADD AL AL 乘2操作 MOVADDMOVJMP R0 R1 R9 BX OFFSETADDR TBX AXAX BX AX MOVAH 4CH 返回DOSINT21H CODE ENDSEND 例四 例四 有四个学生参加5门课程考试 试计算每个学生的平均 成绩和每门课的平均成绩 课本P191页4 21 解题分析 利用结构变量解题 双重循环 每个学生成绩累加为内圈循环 处理四个学生的成绩为外圈循环 113 datasegmentstudentstrucname1db abcd grade1db grade2db grade3db grade4db grade5db averagedb 保存学生平均成绩studentendszhaostudentqianstudentsunstudentwangstudent 定义数组保存课程平均成绩 s averagedw5dup dataends 定义数据结构 预置结构变量 codeavr segmentprocfar assumecs code ds datastart pushdsxorax ax pushaxmovax datamovds ax 建立返回地址 建立数据段基址 leadi s average movcx 5moval 0cldrepstosbleasi zhaomovbl 4 5门课程 定义方向 清零课程平均成绩单元 数据起始地址 外圈循环计数器赋初值 la1 movcx addsi leadi movdx movah la2 lodsb 5 内圈循环

温馨提示

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

评论

0/150

提交评论