汇编语言程序设计(46).ppt_第1页
汇编语言程序设计(46).ppt_第2页
汇编语言程序设计(46).ppt_第3页
汇编语言程序设计(46).ppt_第4页
汇编语言程序设计(46).ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

1 4 1程序设计语言概述 4 28086 8088汇编语言的基本语法 4 38086 8088汇编语言程序设计基本方法 第4章8086 8088汇编语言程序设计 2 4 1程序设计语言概述 汇编语言程序的上机与处理过程 3 4 28086 8088汇编语言的基本语法 引例 求从1开始连续50个奇数之和 并将结果存放在名字为SUM的字存储单元中 4 5 汇编源程序一般由若干段组成 每个段都有一个名字 叫段名 以SEGMENT作为段的开始 以ENDS作为段的结束 这两者 伪指令 前面都要冠以相同的名字 段可以从性质上分为代码段 堆栈段 数据段和附加段4种 代码段是不可少的 堆栈段 数据段与附加段可根据需要设置 代码段部分开始要设置段寄存器 要加载DS内容 在上面这个例子中 一共定义了3个段 1个数据段1个堆栈段1个代码段 6 每一行只有一条语句 且不能超过128个字符 从MASM6 0开始可以是512个字符 但一条语句允许有后续行 最后均以回车作结束 每一条汇编语句最多由4个字段组成 它们均按照一定的规则分别写在一个语句的4个区域内 各区域之间用空格或制表符 TAB键 隔开 整个源程序必须以END语句来结束 它通知汇编程序停止汇编 END后面的标号START表示该程序执行时的起始地址 汇编语言程序中至少要有一启动标号 作为程序开始时目标代码的入口地址 启动标号常用START BEGIN MAIN等命名 7 一 汇编语言语句的种类和格式1 语句的种类在8086 8088汇编语言中 有3种基本语句 指令语句伪指令语句宏指令语句 1 指令语句 是一种执行性语句 它在汇编时 汇编程序将为之产生一一对应的机器目标代码 例 汇编指令机器码MOVDS AX8ED8ADDAX BX03C3 8 2 伪指令语句 是一种说明性语句 它在汇编时只为汇编程序提供进行汇编所需要的有关信息 如定义符号 分配存储单元 初始化存储器等 而本身并不代表生成目标代码 例 DATASEGMENTAADW20H 30HDATAENDS 3 宏指令 是以某个宏名字定义的一段指令序列 在汇编时 凡有宏指令出现的地方都将用相应的指令序列的目标代码插入 宏指令语句是一般性指令语句的扩展 9 1 指令语句 指令语句的格式 标号 前缀 指令助记符 操作数表 注释 1 标号标号代表 后面的指令所在的存储地址 这里是逻辑地址 供JMP CALL和LOOP等指令作操作数使用 以寻找转移目标地址 2 语句格式 10 2 前缀8086 8088中有些特殊指令 它们常作为前缀同其他指令配合使用 例如和 串操作指令 连用的5条 重复指令 REP REPE REPZ REPNE REPNZ 以及总线封锁指令LOOK等3 指令助记符4 操作数表操作数表可以是一个或两个操作数 对宏指令来说 可能有多个操作数 操作数之间用逗号分隔 5 注释以 开始 用来简要说明该指令在程序中的作用 11 伪指令语句的格式 名字 伪指令 参数表 注释 2 伪指令语句 12 1 标号的属性标号表示指令地址 是指令的符号地址 它具有3种属性 段地址 段内偏移量 或相对地址 以及类型 段值 SEG 标号所在段的起始地址偏移量 OFFSET 段起点距离标号所指存储单元位置的字节数类型 TYPE NEAR FAR 在指令的助记符之前 使用标号并紧跟一个冒号 表示该标号被定义为一个类型为 的标号 当然 标号也可单列一行例如 subrout movax 3000h3 使用过程定义 为过程取的名字也是一个标号RightPROCNEARRightENDP4 通常 标号 只在循环 转移和调用指令中使用 1 标号 二 指令语句 13 表达式是操作数的一种 由常量 变量 标号 寄存器与相关运算符组成 包括数值表达式和地址表达式 它的求值是由汇编程序完成的 2 指令助记符 3 操作数 4 表达式 14 常量是指那些在汇编过程中已经有确定数值的量 分 数值常量 与 符号常量 两种 符号常量的定义需用伪操作命令 伪指令 或 3 一个能被计算并产生数值的表达式称为数值表达式一个数值表达式可由常量 字符串常量以及代表常量或串常量的名字等以算术 逻辑和关系运算符连接而成 1 常量与数值表达式 15 例1 即把 送 例2 ANDAX NUMBLT5 AND30 OR NMBGE5 AND20 当NUMB 时 指令含意为 当NUMB 时 指令含意为 此例中 操作符 与操作数表达式中的 具有不同的含意 前者是助记符 后者是伪运算 16 1 变量变量是内存中的一个数据区的名字 即数据所存放地址的符号地址 一方面代表所表示的值 另一方面代表相应存储空间地址 它可以作为指令中的存储器操作数 直接寻址 变量一般都是在数据段或附加段中使用伪指令 即伪操作命令 DB DW DD和DT来进行定义 变量名 数据区定义伪指令表达式变量具有段 偏移 类型三个属性 2 变量与地址表达式 17 1 段属性 指该变量定义所在段的段地址 称为变量的段值 2 偏移属性 指该变量定义所处位置至段地址的字节距离 称为变量的偏移值 3 类型属性 指存取该变量所需字节数 可以是字节 字 双字 四字和十字节之一 注意 变量和标号的区别1 变量是数据区的名字 表示存储器操作数的地址 而标号是指令地址的符号表示2 变量的类型是数据项存取单位的字节数大小 而标号的类型是NEAR和FAR变量和常量的区别常量不占存储单元 而变量具有相应的存储空间 18 数值表达式 在汇编时产生一数值 仅具有大小而无其他属性 可作为执行性指令中的立即操作数和数据区中的初值使用 地址表达式 由变量 常量 标号 寄存器的内容和相关运算符组成的有意义的式子 它表示存储器地址 其值一般都是段内的偏移地址 因此它具有段属性 偏移值属性 类型属性 地址表达式主要用来表示执行性指令中的多种形式的操作数 单个变量 标号 寄存器的内容是地址表达式的特例 在上一章中介绍的各种存储器寻址方式均属于简单的地址表达式 2 地址表达式 19 段超越运算符 用于临时给变量或地址表达式指定段属性 格式 段寄存器或段名 地址表达式属性指定操作PTR用来明确指出或临时指定地址表达式的类型属性 格式 数据类型PTR地址表达式数据类型可以是BYTE WORD DWORD NEAR FAR等 20 例 ADDBYTEPTR DI 23HPRT指定地址表达式 DI 的类型为字节 此句表示将23H与内存字节单元 DI 中的字节数据相加 结果送回内存字节单元 DI 例 INCBYTEPTRES BP 3 ES 为跨段前缀 冒号 前的ES段寄存器指明了操作数当前所在的段为附加数据段 这时 操作数的物理地址将由ES中的内容左移4位与偏移地址 BP 3 相加而求得 此句表示将附加数据段中偏移地址为 BP 3 的内存单元中的数据加1后仍保留在该单元中 如果没有跨段前缀 ES 那么 由 BP 3 地址表达式所表示的偏移地址将被系统默认为是在堆栈段中 21 3 分析运算符 又叫取值运算符 可以获得变量 标号 过程名的段 偏移及类型属性值 包括SEG OFFSET TYPE SIZE LENGTH HIGH LOW等 SEG 得到变量 标号 过程名等的段地址 OFFSET 得到变量 标号 过程名等的移地址 TYPE 得到变量 标号的类型 SIZE 得到分配给变量的字节总数 LENGTH 得到分配该变量的数据项数 HIGH 取地址表达式的高位字节 LOW 取地址表达式的低位字节 22 1 数据定义伪指令 三 伪指令语句 格式 变量名 助记符操作数列表 注释 变量名 是可有可无的 它用符号地址表示 其作用与指令语句前的标号相同 但它的后面不跟冒号 如果语句中有变量则汇编程序使其记以第一个字节的偏移地址 注释 用来说明该伪操作的功能 它也是可有可无的 助记符 说明所用伪操作的助记符 常用的有以下几种 DB DW DQ DD DT 23 定义字节 用于申请一个数据项为字节的数据区 需要时可以用数值表达式赋予初值 如果该数据区定义作为一个变量 则变量类型是 定义字 数据项为字 允许用地址表达式为数据项赋初值 即偏移量属性 变量类型是 定义双字 数据项为双字 允许用地址表达式为数据项赋初值 即段属性及偏移量属性 变量类型为 定义4字 数据项为4字 变量类型为 BYTE 定义10字节 数据项为10个字节 变量类型为 24 25 变量 语句表示利用该变量的偏移量来初始化相应的存储字 变量 语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字 低位字中是偏移量 高位字中是段分量 可用于初始化存储器 这些伪指令的右边有一表达式 表达式之值即该存储 单位 的初值 26 内容为 内容为 即高位字为 低位字为 内容为 内容为 内容为 27 28 例操作数也可以是字符串 如 MESSAGEDB HELLO 则存储器存储情况如右图所示 注意 DB AB 和DW AB 的存储分配空间的不同 如下图 29 例操作数 可以保留存储空间 但不存入数据 如 ABCDB0 0DEFDW 52 经汇编后的存储情况如右图所示 30 操作数字段还可以使用复制操作符来复制某个 或某些 操作数 其格式为 repeat countDUP operate operate 其中repeat count可以是一个表达式 它的值应该是一个正整数 用来指定括号中的操作数的重复次数 例ARRAYlDB2DUP 0 1 2 ARRAY2DB100DUP 汇编后的存储情况如下图所示 ARRAYlDB2DUP 0 1 2 和以下语句是等价的 ARRAYlDB0 I 2 0 1 2 31 汇编语言中所有的变量名 标号名 过程名 指令助记符 寄存器名等统称 符号 这些符号可以通过伪指令重新命名 也可以通过伪指令为其定义其他名字及新的类型属性 1 EQU 赋值伪指令 EQU可以给表达式赋予一个名字 其后指令中凡需要用到该表达式的均可以用这个名字代替 不申请分配内存 格式 符号名 表达式 符号定义伪指令 32 等号伪指令 格式 符号名 表达式它与 基本类似 起赋值作用 区别在于 使用 定义的符号名可以被重新定义 使符号名具有新值 例 先将12赋于符号名X 将符号名X重新定义使其具有新值则在第2个语句经过汇编后 最终 33 3 段定义伪指令 段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器 所用命令主要有SEGMENT ENDS ASSUME ORG等 汇编源程序一般由若干段组成 以SEGMENT作为段的开始 以ENDS作为段的结束 这两者 伪指令 前面都要冠以相同的名字 34 段名 一系列汇编指令段名 1 SEGMENT和ENDS伪指令 35 2 设定段寄存器伪指令ASSUME ASSUME段寄存器名 段名 段寄存器名 段名 告诉汇编程序用SEGMENT伪操作定义过的段的段地址将要存放在哪个段寄存器中 其中段寄存器名必须是CS DS ES和SS中的一个 而段名则必须是由segment定义的段中的段名 36 伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量 其格式为 表达式汇编程序把语句中表达式之值作为起始地址 连续存放程序和数据 直到出现一个新的 指令 若省略 则从本段起始地址开始连续存放 3 ORG伪指令 37 1 过程定义伪指令格式 过程名 类型 指令序列过程名 2 调用过程调用过程用 过程名 来实现 4 过程返回通常子程序中包括一至多条返回指令 即当过程运行至某种条件满足时返回至主程序中调用指令的下一条指令继续执行 4 过程定义伪指令 38 一 顺序结构程序 顺序结构是最基本 最常用的程序结构 其特点是 完全按照程序指令编排的顺序依次执行 例 对两个 字节无符号数求和 这两个数分别用变量 及 表示 将两数之和的最高位进位放在 中 两数之和的其他位按从高到低顺序依次放在 中 4 3 汇编语言程序设计基本方法 39 DSEGMENTD1DB12H 34H 56H 78H 9AH 0ABH 0BCH 0CDHD2DB0CDH 0BCH 0ABH 9AH 78H 56H 34H 12HDENDSCSEGMENTASSUMECS C DS D 说明代码段 数据段BG MOVAX DMOVDS AX 给DS赋段值LEADI D1 将D1表示的偏移地址送DI MOVDX DI 取第1操作数到寄存器中MOVCX DI 2 MOVBX DI 4 MOVSI DI 6 LEADI D2 将D2表示的偏移地址送DIADDDX DI 将D1和D2相加 结果存放在SI BX CX DX中ADCCX DI 2 ADCBX DI 4 ADCSI DI 6 MOVAL 0ADCAL 0MOVAH 4CHINT21HCENDSENDBG 40 二 分支结构程序 程序中按照所设置的逻辑条件 在判定当前的状态标志位是否满足后 决定程序两个可能的出口 当满足条件时 后续程序将转向条件转移指令所指的转移地址 当条件布满足时 程序将继续顺序执行 例 比较以存储器变量 和 表示的两个有符号字数据的大小 将其中较大数据放在 寄存器中 41 DATASEGMENTD1DW 123 补码为FF85HD2DW 120 补码为FF88HDATAENDSCODESEGMENTASSUMECS CODE DS DATA 说明代码段 数据段BEGIN MOVAX DATAMOVDS AX 给DS赋段值MOVBX D1CMPBX D2JGENEXT 若D1 D2 则不交换 转NEXTMOVBX D2 若D1 D2 则交换NEXT MOVAH 4CHINT21HCODEENDSENDBEGIN 42 三 循环结构程序 程序按照所设置的循环条件 自动判断是否继续循环地重复执行循环体 还是终止循环体中程序段地操作 顺序执行后续程序指令 例 找出从无符号字节数据存储变量 开始存放的 个数中的最大数放在 中 DSEGSEGMENT 定义数据段VARDB5 7 19H 23H 0A0HNEQU5DSEGENDS 43 CSEGSEGMENTASSUMECS CSEG DS DSEG 说明代码段 数据段BG MOVAX DSEGMOVDS AX 给DS赋段值MOVCX N 1 置循环控制数MOVSI 0MOVBH VAR SI 取第1字节数到BHJCXZLAST 如果CX 0则转AGIN INCSICMPBH VAR SI JAENEXT 若BH中已为较大的数 则转移MOVBH VAR SI 改变BH的值 使其为较大的数NEXT LOOPAGIN CX CX 1 若CX不等于0则转LAST MOVAH 4CHINT21HCSEGENDSENDBG 44 所谓DOS及BIOS中断调用 就是为了节省编程工作量与优化程序结构 在DOS及BIOS中预先设计好了一系列的通用子程序 以便供DOS及BIOS调用 由于这种调用采用的是以中断指令INTn的内部中断方式进行的 因此常称为DOS及BIOS中断调用 又因为在一个中断服务程序中往往包含多个功能相对独立的子程序 所以也将中断调用称为系统功能调用或功能调用或中断功能调用 四 DOS及BIOS中断调用 45 DOS的功能调用是指DOS为系统程序员和用户提供的一组常用子程序如何使用的问题 DOS规定用中断指令INT21H进入各功能调用子程序的总入口所有DOS提供给用户的功能调用格式 包括ROM BIOS调用 都是一样的 一般分为4个步骤 在AH寄存器中设置系统功能调用号 在指定的寄存器中设置中设置入口参数 用INT21H指令执行功能调用 根据出口参数分析功能调用的执行情况 常用功能调用举例 46 返回 向量号 功能号 该功能使系统结束程序运行后返回DOS状态 例 键盘输入并显示向量号 功能号 该功能从键盘输入一个字符 将其 码保存在 中 输入字符回显在CRT上 例 中断返回时 输入字符的 码被存放在 中 该字符并显示在屏幕上 47 键盘输入但不显示输入字符向量号 功能号 该功能输入一字符 其 码存放在 中 但不显示 这种功能往往在设置口令时使用 例 显示一字符向量号 功能号 入口参数 待显示字符的 码该功能显示 中的字符 例 显示字母 b 2 62H 48 在打印机上打印一字符向量号 功能号 入口参数 待打印字符的 码 显示以 结尾的字符串向量号 功能号 入口参数 指向字符串的首地址例 在显示器上显示 Howareyou 49 7 字符串输入向量号 功能号0AH入口参数 DS DX指向输入缓冲区 输入缓冲区格式如下 第1字节为预定的最大输入字符数 第2字节空出 待中断服务程序填入键盘连续输入到回车前实际输入字符数 第3字节及以后字节 待中断服务程序填入字符串的ASCII码 例 从键盘输入字符串DSEGM

温馨提示

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

评论

0/150

提交评论