




已阅读5页,还剩112页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章微型计算机汇编语言及汇编程序 7 1宏汇编语言的基本语法7 2伪指令7 3宏指令7 4系统功能调用7 5汇编程序的功能及汇编过程7 6汇编语言程序设计习题 汇编语言和机器语言相比 使用汇编语言来编写程序的突出优点就是可以使用符号 具体地说 就是可以用助记符来表示指令的操作码和操作数 可以用标号和符号来代替地址 常量和变量 助记符一般都是表示一个操作的英文字母的缩写 很便于识别和记忆 不过 用汇编语言编写的程序不能由机器直接执行 而必须翻译成由机器代码组成的目标程序 这个翻译过程称为汇编 在微型机中 当前绝大多数情况下 汇编过程是通过软件自动完成的 用来把汇编语言编写的程序自动翻译成目的程序的软件叫汇编程序 汇编过程的含义如下图7 1所示 用汇编语言编写的程序叫源程序 前面讲的指令系统中的每条指令都是构成源程序的基本语句 汇编语言的指令和机器语言的指令之间有一一对应的关系 所以 汇编语言是和机器密切相关的 是面向机器的语言 CPU不同的机器有不同的汇编语言 采用汇编语言进行程序设计时 我们可以充分利用机器的硬件功能和结构特点 从而可有效地加快程序的执行速度 减小目标程序所占用的存储空间 因此 与高级语言相比 汇编语言为我们提供了直接控制目标代码的手段 而且可以对输入 输出端口进行控制 实时性能好 执行速度快和节省存储空间等明显优点 所以 汇编语言大量被用于编写计算机系统程序 实时通信程序 实时控制程序等 8086和80286 80386 80486系统的汇编程序完全相同 简称作ASM 86 在此基础上进一步扩展其功能 成为当前广泛使用的8086宏汇编程序 简称作MASM 86 7 1宏汇编语言的基本语法7 1 1伪指令语句格式 伪指令语句与指令语句不同 伪指令语句又叫命令语句其伪指令本身不产生对应的机器目标代码 它仅仅是告诉汇编程序 对后面的指令语句和伪指令语句的操作数应该如何产生机器目标代码 每一条伪指令语句共分4个字段 它的指令格式如图7 2所示 图7 2 1 标号名字段这是一个任选字段 标号名后面不能用冒号 这是它与指令语句的突出区别 伪指令的标号名可以是常量名 变量名 过程名 结构名 记录名等 它们可以作为指令语句和伪指令语句的操作数 这时 标号名就表示一个常量或存储器地址 2 伪指令字段这是伪指令语句不可省略的主要成分 伪指令种类很多 如定义数据伪指令DB DW DD 段定义伪指令SEGMENT 定义过程伪指令PROC等 它们是伪指令语句要求汇编程序完成的具体操作命令 3 操作数字段本字段是否需要 需要几个 需要什么样的操作数等都由伪指令字段中伪指令来确定 操作数可以是一个常数 二进制 十进制 十六进制等 字符串 常量名 变量名 标号 一些专用的符号 如BYTE FAR PARA等 4 注释字段这是一个任选字段 必须以分号为开始 其作用与指令语句的注释字段相同 7 1 2常数 变量和标号 常数 变量和标号是汇编语言能识别的数据项 它是指令和伪指令语句中操作数的基本组成部分 一个数据项包含有它的数值和属性两部分 这两部分对一条语句汇编成目标代码都有直接关系 1 常数常数是没有任何属性的纯数值 在汇编期间 它的值已能完全确定 且在程序运行中也不会发生变化 它可以有以下几种类型 1 二进制数 以字母B结尾 由0和1组成的数字序列 如01011010B 2 八进制数 以字母O或Q结尾的0 7数字序列 如723Q 35O 3 十进制数 0 9数字序列 可以用字母D结尾 也可以没有结尾字母 如129 129D 4 十六进制数 以字母H结尾 由数字0 9和字母A F 或a f 组成的序列 如3A5BH 0FH 为了区别由A F组成的是一个十六进制数还是一个标识符 凡以字母A F为起始的一个十六进制数 必须在前面冠以数字 0 否则汇编程序认作标识符 5 实数 它由整数 小数和指数 部分组成 这是计算机中的浮点表示法 实数一般用十进制数形式给出 其具体格式如下 整数部分 小数部分E 指数部分其中 整数和小数部分形成这个数的值 称作尾数 它可以是带符号的数 指数部分由指数标识符E开始 它表示了值的大小 如5 213E 4 6 字符串常数 用引号括起来的一个或多个字符 这些字符以ASCII码形式存储在内存中 如 AB 在内存中就是41H 42H 在程序中 常数主要出现在 1 指令语句中源操作数中作立即数 它应与目的操作数的位数相一致 可以是8位或16位 例如 MOVAX 0A5F1H 2 在指令语句的基址加变址的寻址方式中作位移量 例如 MOVBX SI 32H 3 在数据定义伪指令中 例如 DB12H 定义一个字节数据DW1234H 定义一个字数据DD12345678H 定义一个双字数据DB ABCD 定义4个字节的字符串数据2 变量变量是代表存放在存储单元中的数据 这些数据在程序运行期间可以被随时访问或修改 为了便于对变量的访问 它常常以变量名的形式出现在程序中 可看作是存放数据存储单元的符号地址 1 变量的定义与预置 定义变量就是给变量分配存储单元 且对这个存储单元赋于一个符号名 变量名 同时将这些存储单元预置初值 定义变量是用数据定义伪指令DB DW DD等 例如 VAR DATASEGMENTDATA1DB12HDATA2DB34HDATA3DW5678HVAR DATAENDS经过定义的变量 每个变量均有3个属性 段属性 SEG 表示变量存放在哪一个逻辑中 即变量所在段的段基值 例如 变量名为DATA1 DATA2 DATA3的3个变量都存放在VAR DATA逻辑段中 用SEGMENT ENDS伪指令定义一个逻辑段 当在指令中要对这些变量进行存取操作时 事先要把它们所在段的段基值存放在某一个段寄存器 如DS 中 偏移量属性 OFFSET 表示变量在逻辑段中离段起始点的字节数 例如 变量DATA1的偏移量为0 而DATA2的偏移量为1 DATA3的偏移量为2 上述段和偏移量两个属性就构成了变量的逻辑地址 类型属性 TYPE 表示变量占用存储单元的字节数 这一属性是由数据定义伪指令DB DW DD来规定的 变量DATA1 DATA2是用DB定义的 它的类型属性为字节 而DATA3是用DW定义的 类型属性为字 如果用DD定义 类型属性为双字 2 数据定义伪指令 该伪指令的主要作用是为变量或数据项分配存储单元并预置初值 其语句组成结构格式如下 DB变量名DW表达式1 表达式2 DD其中表达式1 表达式2 是给变量赋予的初值 表达式可以有以下几种形式 数值表达式 例如 DA BYTEDB50H 50DA WORDDW0A3F1H 4981H变量DA BYTE的内容为50H 它的下一个字节为32H 即DA BYTE 1字节单元的内容为十进制50 DA WORD字单元内容为0A3F1H 低字节为F1H 高字节为0A3H 它的下一字单元内容为4981H 即DA WORD 2字单元 表达式 不带引号的 表示可预置任何内容 例如 DA BDB DA WDW 第1条语句是要求汇编程序分配两个字节单位 第2条语句是要求分配两个字单元 这些单元里现在可以是任意值 字符串表达式 对于DB伪指令 为字符串中每一个字符分配一个字节单元 字符串必须是用单引号括起来且不超过255个字符 字符串自左至右以字符的ASCII码按地址递增的排列顺序依次存放 例如 STRING1DB ABCDEF 在存储器中存放的情况如图7 3 a 所示 对于DW伪指令 可以给两个字符组成的字符串分配两个字节存储单元 而且这两个字符ASCII码的存储顺序是前一字符在高地址 后一字符在低地址 每一个数据项不能多于两个字符 例如 STRING2DW AB CD EF 在存储器中存放的情况如图7 3 b 所示 对于DD伪指令 仅可给两个字符组成的字符串分配4个字节单元 且这两个字符ASCII码是存储在两个低字节 存储顺序与DW伪指令相同 中 两个高字节均存放00H 例如 STRING3DD AB CD 在图7 3 c 显示了它们存储器中的存放情况 图7 3 STRING1DB ABCDEF STRING3DD AB CD STRING2DW AB CD EF 带DUP表达式 DUP是定义重复数据操作符 在表达式中 使用DUP操作符格式是 DB变量名DW表达式1DUP 表达式2 DD其中表达式1是重复的次数 表达式2是重复的内容 例如 D B1DB20HDUP D B2DB10HDUP ABCD D W1DW10HDUP 4 第1语句表示保留20H个字节 每个字节可预置任意内容 第2语句是重复10H个字符串 ABCD 共占有40H个字节 第3语句是重复10H个字单元 每个单元预置为4 共占有20H个字节 3 标号标号是一条指令目标代码的符号地址 它常作为转移指令 含子程序调用指令 的操作数 例如 LOP1 LOOPLOP1 JNZNEXT NEXT 与变量类似 每个标号亦具有3个属性 1 段属性 SEG 表示这条指令目标代码在哪个逻辑段中 2 偏移量属性 OFFSET 表示这条指令目标代码的首字节在段内离段起始点的字节数 同样 上述两个属性构成了这条指令目标代码首字节的逻辑地址 3 距离属性 表示本标号可作为段内或段间的转移特性 距离属性分为两种 NEAR 近 本标号只能被标号所在段的转移和调用指令所访问 即段内转移 FAR 远 本标号可被其他段 不是标号所在段 的转移和调用指令访问 即段间转移 7 1 3表达式与运算符 表达式由操作数和运算符组成 在汇编时一个表达式得到一个值 用一个运算符可以对一个操作数或几个操作数进行运算 这就构成了一个表达式 从而得到一个新的值 ASM86中分6类运算符 包括算术运算符 逻辑运算符 关系运算符 分析运算符 组合运算符和分离运算符 它们在汇编时完成相应运算 常用运算符及表达式如下 1 算术运算符 是加减乘除运算符 MOD是除法取余运算符 例如 32MOD5 2 SHL是左移操作符 例如 21HSHL2 84H SHR是右移操作符 2 逻辑运算符AND是逻辑 与 操作符 例如 24HAND0FH 04H OR是逻辑 或 操作符 例如 24HOR0FH 2FH XOR是 异或 操作符 例如 24HXOR0FH 2BH NOT是逻辑 非 操作符 例如 NOT24H 0DBH 3 关系运算符关系运算是逻辑判定式的 当为 真 时结果取0FFFFH 当为 假 时结果取0 关系运算是数值型的 EQ等于 例如 已赋给符号PP为25 则25EQPP 0FFFFH NE不等于 例如 25NEPP 0 为假LT小于 例如 25LT26 0FFFFH 为真LE小于等于 例如 25LEPP 0FFFFH 为真GT大于 例如 26GT25 0FFFFH 为真GE大于等于 例如 24GEPP 0 为假4 分析运算符 1 SEG求段基址格式 SEG 符号名 2 OFFSET求偏移地址格式 OFFSET 符号名 3 TYPE求符号名类型值格式 TYPE 符号名 4 SIZE求为符号名分配的字节数格式 SIZE 符号名 为符号名定义的数据项必须是用重复格式DUP 定义的 5 LENGTH求为符号名分配的项数格式 LENGTH 符号名 为符号名定义的数据项必须是用重复格式DUP 定义的 SIZE 符号名 LENGTH 符号名 TYPE 符号名 5 组合运算符组合运算符是用来改变或建立符号名的新类型 1 定义符号名为新类型格式 类型 PTR 符号名 例如 设内存变量D1是字节属性 把它的两个字节内容送到AX中 MOVAX WORDPTRD1这里的符号名可以是间址 变址寻址 基址加变址寻址表示的存储器操作数 2 指定新类型格式 THIS 类型 与PTR类似 可为某个符号名建立新类型 例如 LABCEQUTHISBYTELABDDW4321H 2255HMOVAL LABC AL 21HMOVAX LABD AX 4321H符号名LABC与LABD有相同的段地址和偏移地址 但LABC是字节类型 而LABD是字类型 伪指令PTR与THIS的区别 PTR可用来对事先已经定义的符号名改变其类型属性 而THIS可用来指定一个新变量或新符号名的类型属性 但该变量的段和偏移量属性与紧跟THIS指令语句之后的一条对该变量或符号名进行类型定义伪指令中的属性相同 6 分离运算符 1 LOW取低字节格式 LOW 表达式 2 HIGH取高字节格式 HIGH 表达式 例如 设SSY 2050HMOVAL LOW3080H AL 80HMOVAH HIGHSSY AH 20HMOVCL LOW3A4BH CL 4BH7 汇编运算符的优先级见表7 2 见书第160页 所示 7 2伪指令 伪指令没有对应的机器指令 它不是由86系列CPU来执行 而是由MASM 86识别 并完成相应的功能 它在很大程度上规定了MASM 86的性能 因此也可称之为汇编命令 MASM 86中允许使用的伪指令相当丰富 必须搞清楚这些伪指令的功能及其用法 才能编制出高质量的汇编语言源程序 MASM 86中使用的伪指令可分成14类 下面分别介绍各伪指令用途 1 符号定义伪指令 赋值语句 作用 对所用符号进行赋值 1 符号名 EQU 表达式 2 符号名 表达式 该语句把表达式的值赋给符号名 在同一程序中 用EQU语句赋值的符号名不能被重新赋值 但用 号赋值的符号名可以被重新赋值 号表示此项不能默认 但该符号不需要输入 2 内存数据 即变量 定义伪指令作用 定义内存变量的类型属性 1 字节定义伪指令 符号或变量名 DB 表达式或数据项表 表达式值或项表中的每一项是一个字节数 它们从符号名地址开始按字节以地址递增方向连续存放 直到表中数据项结束 方括号 表示该项可以默认 2 字定义伪指令 符号或变量名 DW 表达式或数据项表 除表达式值或项表中的每一项是两个字节数之外 其它与DB伪指令相同 3 4字节定义伪指令 符号或变量名 DD 表达式或数据项表 表达式值或项表的每一项是4个字节数 该语句可以定义有小数点的十进制数或用科学表示法表示的数据 此时在汇编时被译成4字节浮点数 尾数在低地址一端 阶码在高地址一端 浮点数格式见7 1节中所述 例如 N1DD25ABH 0A002677HN2DD2 5 3 2E 2 4 8字节定义伪指令 符号或变量名 DQ 表达式或数据项表 表达式值或数据项表的每一项是8字节数 各项从小地址一端连续存放 允许浮点数形式 与DD伪指令相同 高4个字节填0 5 10字节定义伪指令 符号或变量名 DT 表达式或数据项表 表达式值或数据项表的每一项是10字节数 允许浮点数形式 与DQ伪指令相同 若项表中的数据项是十进制整数书写的 汇编程序按组合的BCD码格式 存放 最低字节在高地址一端存放 数据的最高字节的最高位是符号位 0 表示正 1 表示负 当表达式或数据项表多于一项时 项与项之间应用逗号 或空格分隔 表达式或数据项重复书写时 可用重复格式简写 例如 在指令中引用上述定义的符号名时 必须考虑符号名的类型 否则会出现错误提示 例如 D1DB12H 34H 56HMOVAX D1 D1类型错误MOVAX WORDPTRD1 正确 3 段定义伪指令存储器在逻辑上是分段的 各段的定义由伪指令实现 格式 段名 SEGMENT 定位方式 连接方式 类别名 段名 ENDS段定义伪指令为程序的汇编和连接说明了段名 分段的各种属性以及分段的开始和结束 段名是自定义符 开始的段名与结束的段名必须相同 段的长度不超过64KB SEGMENT后面的参数是可选项 其作用如下 1 定位方式 定位类型 定位方式指定段的起始地址边界 方式有4种 PAGE 指定起始地址的低8位为0 即其值能被256整除 称为页边界 PARA 指定起始地址的低4位为0 即其值能被16整除 称为段边界 这是系统隐含定位方式 WORD 指定起始地址的最低位为0 即其值能被2整除 称为字边界 BYTE 指定起始地址是任意值 以上4种边界如下所示 00000000PAGE页边界 0000PARA段边界 0WORD字边界 BYTE任意 2 连接方式 组合类型 连接方式告诉连接程序本段与其他段可按某种方式连接 它有6种选择 PUBLIC 告诉连接程序把本段与其他同名同类别的段连接起来 公用一个段的起点地址 形成一个物理段 STACK 表示本段是堆栈段 连接方式同PUBLIC 连接后的段起始地址在SS寄存器中 连接程序要求源程序至少要有一个堆栈段 否则提示错误 此时 系统取约定堆栈段值 空缺 NONE 表示本段不与任何段连接 这是系统隐含连接方式 COMMON 表示本段与同名同类别的段共用同一段起始地址 即同名同类段相重叠 段的长度是最长段的长度 MEMORY 表示本段在连接时定位在所有段之上 即高地址处 AT表达式 表示本段定位在表达式值指定的段地址处 3 类别名 类别名是合法的自定义符 它必须用单引号括起来 凡是类别名相同的段在连接时均按先后顺序连接起来 4 段寄存器说明伪指令格式 ASSUME段寄存器 段定义名1 段寄存器 段定义名2 该伪指令告诉汇编程序在汇编时 段寄存器CS DS SS 和ES 应具有的符号段基址 以便汇编指令时确定段和建立错误信息 但是段寄存器实际值 CS除外 还要由传送指令在执行程序时赋值 5 过程 子程序 定义伪指令格式 过程名 PROC NEAR 或 FAR 过程名 ENDP过程名是自定义符 定义过程是为实现子程序调用而设的 调用格式为 CALL 过程名 过程由RET指令返回 它可以不是最后一条指令 它在过程中可以设多点返回 过程起始名和终止名必须相同 类型NEAR和FAR 默认时系统约定是近过程 当选NEAR时 过程是段内调用 过程中的RET是段内返回 当选FAR时 过程是段间调用 过程中的RET是段间返回 6 模块开始伪指令格式 NAME模块名该伪指令指明程序模块的开始 并指出模块名 模块名是自定义符 它不能是系统保留字 每次汇编只能出现一次 若该伪指令默认 则取TITLE语句中的页标题前6个字符 若没有TITLE语句 则取源程序文件名为模块名 7 模块结束伪指令格式 END 启动标号或过程名 该伪指令告诉汇编程序源文件结束 并给出执行程序的入口位置 启动地址只有在主模块才有意义 8 定位伪指令格式 ORG 表达式 该伪指令把以下语句定义的内存数据或程序 从表达式指定的起点 偏移地址 开始连续存放 直至遇到新的ORG指令 表达式的值是一个无符号数 9 列表伪指令 1 建立标题格式 TITLE标题为列表文件每页第一行定义大标题 2 建立小标题格式 SUBTTL小标题为列表文件每页定义小标题 输出在大标题之后 3 自动排版 行数 列数 格式 PAGE行数 每行字数为列表文件定义每页行数 10 255 和每行字符数 60 132 默认值是66行 80列 10 系统隐含进位制伪指令格式 RADIX表达式定义在源程序中书写数据时的隐含进位制方式 表达式的值是2 16之间的十进制数 要遇到新的 RADIX语句后才改变隐含进位制 例如 表达式取值是8时 书写默认后缀的数据是八进制而不是十进制 11 连接伪指令连接伪指令主要解决多模块的连接问题 对一个大程序来说 往往要分模块编程 分模块调试 最后再进行连接与调试 连接伪指令为多模块连接进行说明 1 公用符号伪指令格式 PUBLIC 符号名1 符号名2 本模块用PUBLIC伪指令说明的自定义符号名可由其他程序模块引用 没有说明的符号名不能被其他模块引用 符号名可以是变量名 标号 过程名或符号常量等 2 引用符号伪指令 格式 EXTRN 符号名1 类型 符号名2 类型 在本模块引用的在其他模块定义的符号名必须用EXTRN进行说明 否则不能引用 此外还应注意 所引用的外模块定义的符号名还应是用PUBLIC伪指令说明过的 类型是指符号名的类型 它们可以是 内存变量型 BYTE WORD DWORD或过程型 NEAR FAR或数值型 ABS 3 插入伪指令 或称包含伪指令 格式 INCLUDE 模块名 在本模块汇编时 把另一模块插入该伪指令处一起汇编 被插入的模块可以是不完整的 4 合段伪指令 或称组合伪指令 格式 组名GROUP 段名1 段名2 段名3 把其后指定的段组合在一个64KB的物理段中 组名和段名都是自定义符 但不可重名 12 记录伪指令 1 记录定义伪指令格式 记录名RECORD 字段名1 字段宽 字段名2 字段宽 记录定义伪指令完成对内存单元二进制位的定义 这在实际应用中可以实现按位开关量或按位组合信息的处理 记录名和字段名是自定义符 字段宽度是1 16常数 记录是把1 16个二进制位分为段并赋于一个字段名 记录定义伪指令不真正为记录分配内存单元 它只是在汇编时进行记录名 字段名以及记录长度的说明 2 记录存储单元分配及赋值格式 变量名 记录名 字段值表 变量名是自定义符 字段值表中的各字段值赋给记录的各字段中 其顺序与记录定义的顺序相同 若字段值表中的某些项默认 则默认值为0 应用时尖括号 不能默认 例如 TANRECORDX 6 Y 4 Z 6APTAN 5 10 BPTAN 12 20 此例在存储器中分配两个记录 每个记录长是两个字节 16位 3 记录操作符 WIDTH格式 WIDTH记录名 或字段名 用该操作符可求出记录或字段所占的位数 例如 MOVAX WIDTHTAN AX 16MOVBH WIDTHY BH 4 MASK格式 MASK记录字段名用该操作符可返回记录字段位或使用情况 它是8位或16位二进制数 1表示是该字段位 0表示不是该字段位 例如 MOVAL MASKZ AL 00111111BMOVBL MASKX BL 11111100B 13 结构伪指令结构伪指令是把多个数据定义语句组织成一个结构 而把每一个数据定义语句称为一个结构字段 内存变量名称为字段名 1 结构定义格式 结构名STRUC 数据定义语句 结构名ENDS结构定义不真正为结构分配存储空间 它是在汇编时进行结构说明的 2 结构存储单元分配及赋值格式 变量名 结构名 字段值表 变量名是自定义符 字段值表的各字段值赋给结构的各字段中 其顺序与结构定义的顺序相同 若字段值表中某些项默认 则保留初始值 应用时尖括号 不能默认 例如 TAN1STRUCD1DB2 25 10HD2DB WTAN SYYDB TAN1ENDSSUNTAN1 DOG1 2 CATTAN1 beg 在存储器中分配了两个结构单元 3 结构引用格式 结构变量名 结构字段名例如 MOVDH SUN SYY DH 2MOVAL CAT SYY AL 014 块注释伪指令格式 COMMENT定界符注释定界符定界符是自定义任何非空字符 例如 COMMENT 注释文 为了简化汇编语言源程序的书写 把一些频繁出现的程序段定义为 宏指令 当程序中遇到这个程序段时 只需用一条宏调用语句 这样可有效缩短源程序的长度 使源程序易读 也减少了由于重复书写而引起的错误 从某种意义上讲 它与前述的 过程 或子程序有相似之处 也可以将构成一条宏指令的程序段定义为一个 过程 或子程序 但两者具有明显的区别 主要表现如下 1 宏调用语句由宏汇编程序MASM 86中的宏处理程序来识别 并完成相应的处理 而调用过程的CALL语句由CPU来执行 2 汇编语言源程序在汇编过程中要将宏指令所代替的程序段汇编成相应的机器代码 并插入到源程序的目标代码中 每次调用均要插入 这样 使用宏调用并不能缩短目标代码的长度 但被定义的 过程 经汇编后的机器代码是与主程序分开而独立存在的 其目标代码在存储器中只需保留一份 因此 采用过程调用能有效地缩短目标代码的长度 即节省内存空间 而宏指令却没有这一优点 7 3宏指令 3 过程调用时需要保留程序的断点和现场 待过程执行完毕还要恢复现场和断点 这些操作需要耗费CPU的时间 而宏调用则不需进行这些操作 因此 过程调用可节省程序占用的存储空间 但会降低程序的执行速度 而宏调用不能节省存储空间 却能有较快的执行速度 4 在每次宏调用时允许修改有关参数 使得同一条宏指令在各次调用过程中可完成不同的操作 而 过程 一旦被定义 一般不允许修改 因此 任何一个 过程 在各次调用中只能完成完全相同的功能 从上述特点可看出 当需要多次执行的程序段比较长 对速度要求不很高 并且不要求修改参数的情况下 宜采用过程调用方式 若要求多次执行的程序段比较短 或希望在各次调用中能修改某些参数时 则宜采用宏调用方式 在使用高级语言时 各语句的定义 即它对应哪些机器指令 是由相应的编译程序去处理的 但宏指令却不一样 它需要定义 宏指令的使用要经过如下3个步骤 1 宏定义 对各个宏指令进行定义 并分别起一个名字 2 宏调用 在需要使用的地方 通过宏指令名来调用它 3 宏扩展 由宏汇编程序用宏定义中的指令来代替宏调用中的宏指令名 下面介绍各种宏语句及其功能 1 宏代换语句格式 宏名MACRO 形式参数1 形式参数2 宏体 指令序列 ENDM功能 宏代换语句为指令序列定义一个宏名 称为宏指令 宏名可以像指令一样在程序中引用 形式参数是任选项 可用来代换宏体中某些参数或符号 当代换指令中的符号时 在其前面需加一个宏代换符 例如 AHMACROY X AH为宏名 Y X为形式参数MOVCL XRO YAL CLENDM 经宏代换语句定义的宏名 在应用时可直接引用 称为宏调用 宏调用时 形式参数要用实在参数取代 顺序也应与形式参数顺序相同 例如 AHR 5 该宏调用指令经展开后如下 MOVCL 5 RORAL CL源程序在汇编后 在引用宏名的地方 插入了宏体 它在 LST文件列表时可以看到 其中有 号的指令便称为宏扩展 宏指令可以嵌套 并可与子程序联合嵌套 2 局域符号定义语句格式 LOCAL符号1 符号2 功能 指出符号1 符号2 仅在宏代换中有意义 其目的是在宏扩展时不会引起符号重复定义的错误 LOCAL语句必须紧跟在MACRO之后 3 删除宏定义语句格式 PURGE宏定义名1 宏定义名2 功能 删除 注销 程序中引用的宏指令 使之在宏调用的地方不再生成宏扩展 4 退出宏定义格式 EXITM功能 在宏体或重复定义的语句中 遇到EXITM语句时 终止以后的宏扩展 5 重复定义语句 1 格式 REPT 表达式 指令序列ENDM功能 重复执行REPT与ENDM之间的指令 表达式是重复次数 6 重复定义语句 2 格式 IRP形式参数 参数1 参数2 指令序列ENDM功能 重复执行IRP与ENDM之间的语句 每次重复 将一个参数代入形式参数中 直到最后一个参数代换完为止 7 重复定义语句 3 格式 IRPC形式参数 字符串 指令序列ENDM功能 重复执行IRPC与ENDM之间的语句 每次重复 将一个字符代入形式参数中 直到最后一个字符代换完为止 8 包含汇编语句格式 INCLUDE文件名功能 在程序汇编时 把INCLUDE指示的文件插入该语句处一起汇编 7 4系统功能调用 为给编写汇编语言源程序提供方便 MS DOS系统中设置了几十个内部子程序 它们可完成I O设备管理 存储管理 文件管理和作业管理等功能 对用户来说 它们是几十个独立的中断服务程序 它们的入口地址已由系统事先置入到系统的中断向量表中 在汇编语言源程序中可用软中断指令调用它们 一般我们常用的软中断指令有8条 系统规定它们的中断类型码为20H 27H 它们各自的功能及入口 出口参数如表7 3所示 见P168页 从表7 3中可看出 这些软中断完全隐蔽了设备的物理特性和接口方式 调用它们时只需要先设置好入口参数 随后安排一条软中断指令 INTn n 20 27H 即可转去执行相应的子程序 其中 INT21H 是系统功能调用 它本身包含80多个子程序 每个子程序对应一个功能号 其编号从0 57H 系统功能调用中的几十个子程序成为汇编语言程序员的重要工具 程序员不必了解所使用设备的物理特性 接口方式及内存分配等 不必编写繁锁的控制程序 调用它们时采用统一的格式 只需使用以下3个语句 1 向指定寄存器设置入口参数 有的子程序无入口参数 此步骤可省去 2 确定功能号并送入AH寄存器中 3 INT21H 软中断调用指令 调用结束后 系统将出口参数送到指定寄存器中或从屏幕显示出来 例如 2号系统功能调用可用如下指令 调用结果是将DL寄存器中的可打印字符通过屏幕显示输出 或打印机打印输出 下面对常用的系统功能调用作简要说明 键盘输入单字符 1号功能调用 即 AH 1 作用 输入单个按键码入口参数 无 出口参数 AL 键入字符码 调用号 AH 1 调用指令 INT21H这是1号系统功能调用 使用格式如下所示 它没有入口参数 执行1号系统功能调用时 系统等待键盘输入 待程序员按下任何一键 系统先检查是否Ctrl Break键 如果是则退出 否则将键入字符的ASCII码置入AL寄存器中 并在屏幕上显示该字符 键盘输入字符串 0AH号功能调用 即 AH 0AH 作用 输入多个按键码入口参数 键入数据缓冲区指针DX 调用号 AH 0AH 调用指令 INT21H这是0AH号系统功能调用 其功能是将键盘输入的字符串写入到内存缓冲区中 因此在调用前必须事先在内存中定义一个键盘输入数据缓冲区 该数据区的第1字节为该缓冲区中能存放的字节个数 第2字节留给系统填写实际键入的字符个数 从第3个字节开始用来存放键入的字符串 最后键入回车键表示字符串结束 如果实际键入的字符数不足填满缓冲区时 则其余字节填 0 如果实际键入的字符数超过缓冲区的容量 则超出的字符将被丢失 而且响铃 表示向程序员发出警告 0AH号系统功能调用的使用举例 DATASEGMET 定义数据段BUFDB20 定义键盘输入数据缓冲区字节个数存放单元DB 定义键盘实际输入数据字节个数存放单元DB20DUP 定义键盘输入数据存放区 DATAENDS MOVDX OFFSETBUF 设置入口参数 建立键盘输入数据缓冲指针MOVAH 0AH 确定系统功能调用号INT21H 执行软件中断调用指令 以上程序中 由变量定义语句定义了一个可存放20个字节的缓冲区 当执行到INT21H指令时 系统便等待用户键入字符串 用户每键入一个字符 则键盘输入的ASCII码便被存入到键入数据缓冲区中 待用户输入完所有字符并最后键入回车键时 由系统将统计出的实际键入的字符数显示或输出 并将其写入缓冲区的第2字节中 输出单字符 2号功能调用 即AH 2 作用 输出显示单个字符入口参数 DL 待显示字符的ASC码 调用号 AH 2 调用指令 INT21H这是2号系统功能调用 执行2号系统功能调用时 将置入DL寄存器中的字符从屏幕上显示输出 或打印机打印输出 使用格式如下所示 MOVDL A MOVAH 2INT21H输出字符串 9号功能调用 即AH 9 作用 输出显示多个字符或字符串入口参数 输出数据缓冲区指针DX 调用号 AH 9 调用指令 INT21H这是9号系统功能调用 其功能是将指定的内存缓冲区中的字符串从屏幕显示输出 或从打印机打印输出 缓冲区中的字符串以 字符作为结束标志 9号系统功能调用的使用格式如下所示 DATASEGMET 定义数据段BUFDB goodbye 建立屏幕显示数据缓冲区 DATAENDS MOVDX OFFSETBUF 设置入口参数 建立键盘输入数据缓冲指针MOVAH 9 确定系统功能调用号INT21H 执行软件中断调用指令 5 直接控制台输入 输出单字符这是6号系统功能调用 如果 DL 0FFH 则表示是从键盘输入单字符送AL寄存器中 如果 DL 0FFH 则表示是将DL寄存器中内容送屏幕显示输出 它们的使用方式如下 MOVDL 0FFH 建立入口参数执行功能调用MOVAH 6 将键盘输入单字符送AL寄存器中INT21H MOVDL A 建立入口参数执行功能调用MOVAH 6 将DL中的字符 A 送屏幕显示INT21H 以上程序的前3条指令产生的功能调用是将键盘输入单字符送AL寄存器中 后3条指令产生的功能调用是将DL中的字符 A 送屏幕显示 6 无回显直接控制台输入单字符 7号功能调用 即AH 7这是7号系统功能调用 无入口参数 等待从标准输入设备输入单字符置入AL寄存器中 但不送屏幕显示 其使用方式如下 MOVAH 7 设置功能调用号 无入口参数INT21H 执行调用指令它没有入口参数 系统等待从控制台标准输入设备输入单字符后 将其ASCII码置入AL寄存器中 7 无回显键盘输入单字符 8号功能调用 即AH 8这是8号系统功能调用 无入口参数 等待从键盘输入单字符 将其ASCII码置入AL寄存器中 但不送屏幕显示 其使用方式如下 MOVAH 8 设置功能调用号 无入口参数INT21H 执行调用指令它没有入口参数 与1号系统功能调用的区别仅在于键入的字符不送屏幕显示 8 从串口输入单字符 3号功能调用 即AH 3 无入口参数这是3号系统功能调用 其使用格式如下 MOVAH 3INT21H它没有入口参数 系统将从异步通信口串行输入的字符置入AL寄存器中 9 向串口输出单字符 4号功能调用 即AH 4 入口参数DL 输出字符ASC码这是4号系统功能调用 执行结果将DL寄存器中的字符通过异步通信口串行输出 其使用方式如下 MOVDL MOVAH 4INT21H10 返回操作系统 4CH号功能调用 即AH 4CH 无入口参数这是4CH号系统功能调用 它没有入口参数 执行结果是结束当前正在执行的程序 并返回操作系统 屏幕显示操作系统提示符 N N为当前使用的驱动器名 其使用方式如下 MOVAH 4CHINT21H 11 设置日期 2BH号功能调用 即AH 2BH 入口参数 当前日期这是2BH号系统功能调用 其功能是设置有效日期 例如 当前需要设置的日期是1990年12月26日 那么应将年号1990以压缩的BCD码形式置入CX寄存器中 将月号12置入DH寄存器中 将日期26装入DL寄存器中 其使用方式如下 MOVCX 1990H 设置当前年份MOVDH 12H 设置当前月份 或用 MOVDX 1226H MOVDL 26H 设置当前日MOVAH 2BHINT21H执行的结果是将有效日期设置为1990年12月26日 如果设置成功 则0 AL寄存器 否则0FFH AL寄存器 从此以后日期会自动修改 12 获取日期 2AH号功能调用 即AH 2AH 出口参数 当前日期这是2AH号系统功能调用 其功能是将当前有效日期取到CX和DX寄存器中 存放格式与设置日期时相同 其使用格式如下 MOVAH 2AHINT21H它没有入口参数 执行结果是将年份置入CX寄存器中 月份和日期置入DX寄存器中 13 设置时间 2DH号功能调用 即AH 2DH 入口参数 当前时间这是2DH号系统功能调用 其功能是设置有效时间 例如 当前有效时间是8点15分20 5秒 那么应将小时数8置入CH寄存器中 分钟数15置入CL寄存器中 秒数20置入DH寄存器中 百分之一秒数50置入DL寄存器中 其使用格式如下 MOVCX 0815H 设置当前时 分MOVDX 2050H 设置秒和1 100秒MOVAH 2DH 设置功能调用号INT21H 执行调用指令执行结果是将当前有效时间设置为8点15分20 5秒以后会自动修改时间 如果设置成功 则将AL寄存器内容清 0 否则将AL寄存器置全 1 14 获取时间 2CH号功能调用 即AH 2CH 出口参数 当前时间这是2CH号系统功能调用 其功能是将当前时间置入CX和DX寄存器中 存放格式与设置时间相同 其使用格式如下 MOVAH 2CHINT21H它没有入口参数 执行结果是将当前时间送入CX和DX寄存器中供使用 其他的系统功能调用 有的不常用 有的比较繁锁 不再一一介绍 7 5汇编程序的功能及汇编过程7 5 1汇编程序的功能 汇编程序的主要功能是将由汇编语言 助记符 编写的源程序翻译成用机器语言 二进制代码 编写的目标程序 图7 4可用以说明这个功能 图7 4 从图7 4中可以看到 汇编语言源程序作为汇编程序 MASM或ASM 这个 翻译 的输入 而这个 翻译 的输出是3个文件 其中 目标代码文件就是机器码文件 在目标代码文件中的地址数据还是浮动的 相对的 因此 它还不能直接运行 列表文件包含了程序的逻辑地址 代码程序及源程序对照清单 并在该文件后附有引用符号表 该文件可用DOS的TYPE命令输出 交叉索引文件包含了符号定义行号和引用行号 该文件不能用TYPE命令输出 它需要执行CREF文件后生成索引列表文件 REF 才能输出 汇编语言的程序一般要经过编辑 汇编 MASM或ASM 连接 LINK 和调试 DE BUG 这些步骤 如图7 5所示 图7 5 1 建立源程序文件建立源程序文件用编辑软件完成 常用的编辑软件有行编辑EDLIN 全屏幕编辑WORDSTAR等 2 汇编 MASM或ASM 源程序IBMPC微机提供了两种汇编程序版本 一种是全型版本 MASM 另一种是小型版本 ASM 全型版本比小型版本增加了宏汇编 条件汇编及错误信息全部打印输出功能 小型版本占用存储空间小 有64KB的内存就可以运行 而全型版本至少要有90KB以上的内存 汇编程序有两种启动方式 1 提问方式在MS DOS下输入命令行 MASM或ASM 这时 MS DOS将装入并启动执行汇编程序 然后汇编程序就逐次向用户提问 用户必须根据要求予以回答 在回答信息的最后 可输入一个或多个开关 汇编程序将按照回答信息及开关的定义做相应处理 在回答提示信息时 可以使用以下两个命令字符 用于省略对后续提示的回答 仅取默认值 CTRL C当因为输入了错误的文件名或其他原因而想中途退出汇编程序时 按下CTRL C键即可退出 2 命令方式以命令方式启动汇编程序时 必须在MS DOS下打入下列格式的命令 MASM 或ASM 源文件 目标文件 列表文件 交叉参考文件 开关 于是在装入汇编程序后将立即开始进行汇编 命令中MASM 或ASM 后面的项目 分别顺次对应于提问方式中对各提示信息的回答 各项目之间用逗号隔开 开关可放在任一项目之后 如果对某一提示信息采用默认值 则只需在对应的项目处连续输入两个逗号 例如 MASMFUN FUN D X FUN3 程序连接连接程序LINK用来连接汇编程序生成的目标代码文件 OBJ 以及指定的库文件 产生一个可执行的装入文件 EXE 连接程序有3种启动方式 1 提问方式在MS DOS下输入命令行 LINK 这时MS DOS将把连接程序装入内存 并向用户提问 用户根据要求输入相应的回答 除了在汇编程序一段中叙述过的两个命令字符以外 连接程序的回答信息中还可使用命令字符 号 它用以分隔多个要连接的目标代码模块或库文件 当显示器上一行输入不下时还可使用 号另起一行 2 命令方式以命令方式启动连接程序时 必须在MS DOS下输入如下格式的命令 LINK 目标代码模块表 装入模块名 列表文件名 库文件名表 开关 命令中LINK后面的各项目顺次对应于提问方式中对各提示信息的回答 各项目之间用逗号隔开 如对某一项提示信息采用默认值 则只需在对应的项目处连续输入两个逗号 例如 LINKFUN TEXT TABLE CARE P M FUNLIST COBLIB LIB 3 文件方式以文件方式启动LINK的命令格式为 LINK 文件名 其中 文件名用来指出一个包含有对于LINK提示信息回答的正文文件 文件中每一行正文对应一个回答 因而用户可以不必一一回答LINK的提示 而由LINK程序直接从文件中取得回答 当然 在使用文件方式之前 用户必须建立一个这样的响应文件 4 执行程序在DOS提示符下 键入连接程序所产生的可执行文件的名字后 即可执行该程序 例如 A ABCD 扩展名 EXE可默认 就会把文件ABCD EXE装入内存 并从程序指定地址开始执行 执行程序其结果不一定正确 有时会 死机 死机 时要重新启动机器 然后用DEBUG调试 EXE文件 5 调试程序调试程序DEBUG是专为宏汇编语言设计的一种调试手段 是我们必须掌握的一种调试工具 在操作系统提示符下 按如下格式键入命令 A DEBUG 驱动器名 路径 文件名 扩展名 例如 A DEBUGA ABCD EXE 键入此命令后 就启动了DEBUG程序 DOS的COMMAND COM程序首先装入DEBUG COM文件 并把控制权交给DEBUG DEBUG程序再装入ABCD EXE文件 但控制权并不交给ABCD EXE 而是由DEBUG掌握着 在DEBUG程序中 为我们提供了18条子命令 利用这18条子命令 我们可以对程序进行汇编和反汇编 可以观察和修改内存及寄存器的内容 可以执行或跟踪程序 并观察每一步执行的结果 可以读 写盘上的扇区或文件等 但令人遗憾的是 如果被调试的文件是可执行文件 EXE文件 则调试好的文件不能写回到盘上去 这是因为 可执行文件是带有重定位信息文件头的 调试程序不能产生这些重定位信息 因此不能把它写回到盘上去 惟一的办法就是在调试过程中把发现的错误记载下来 待调试完毕后 重新编辑 汇编和连接 产生新的可执行文件 7 6汇编语言程序设计 在第4章中已经讲过 8086 8088 80286 80386等CPU把存储器分成若干段 每个段是一个可独立寻址的逻辑单位 段是8086系列汇编语言程序的基础 一个段就是一些指令和数据的集合 8086系列汇编语言源程序就是建立在段结构的基础上 所以 在编制汇编语言源程序时 首先要使用段定义伪指令和段寻址伪指令来构成一个由若干指令和数据组成的程序 一个程序有几个段 完全根据实际情况来确定 通常是按照程序中的用途来划分段 如存放数据的段 作堆栈使用的段 存放程序的段 存放子程序的段等等 我们在刚开始编制程序时 不妨先设3 4个段 由4个段寄存器CS DS SS ES分别存放这些段的段基值 这样 构造一个源程序的基本格式如下 DATASEGMENT 定义数据段见P178页 存放数据项的数据段DATAENDSEXTRASEGMENT 定义附加段 存放数据项的附加段EXTRAENDSSTACK1SEGMENTPARASTACK 定义堆栈段 作堆栈用的堆栈段STACK1ENDSCOSEGSEGMENT 定义代码段ASSUMECS COSEG DS DATAASSUMESS STACK1 ES EXTRABEING MOVAX DATAMOVDS AX 存放指令序列COSEGENDSENDBEING上述4个段排列的先后顺序可以是任意的 例7 1 1 设计要求 在源程序中设置数据段 堆栈段及代码段 在数据段中定义8个字节数据 把这些数据转换成十六进制数的ASCII码存在上述数据之后 然后在屏幕上显示这些数据 显示数据用DOS功能2号调用 每个数据用空格分隔 2 程序流程 程序流程如图7 6和图7 7所示 3 程序清单 二进制数对十六进制数转换及显示主程序如下 图7 6 图7 7 1 NAMEEX1 程序命名伪指令 程序名为EX12 PAGE50 703 4 DATSEGMENTPARA DAT 5 A1DB12H 34H 56H 78H 9AH6 DB0BCH 0DEH 0F0H7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 数字信号处理课件陈睿
- 对讲机教学课件
- 散装白酒知识培训总结
- 散装机操作知识培训课件
- 七匹狼品牌价值与营销策略优化研究-洞察及研究
- 工具的演变课件
- cad教学课件下载软件
- 台阶课件教学实录
- 社区支持体系构建分析-洞察及研究
- 城市更新社会资本动员-洞察及研究
- 2025年昆山校医考试题库
- 2024年黔西南州畅达交通建设运输有限责任公司招聘考试真题
- (高清版)T∕CES 243-2023 《构网型储能系统并网技术规范》
- 公共场所卫生管理员安全教育培训手册
- 2025年全国高校辅导员素质能力大赛基础知识测试题及答案(共3套)
- 大气监测培训课件
- 中国高熔体强度聚丙烯行业市场调查报告
- 2025年河南省中考历史试卷真题(含答案)
- 广告与设计专业介绍
- 标准预防与手卫生
- 工程量计算培训课件
评论
0/150
提交评论