微机原理与接口技术第4章.ppt_第1页
微机原理与接口技术第4章.ppt_第2页
微机原理与接口技术第4章.ppt_第3页
微机原理与接口技术第4章.ppt_第4页
微机原理与接口技术第4章.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第4章8086的汇编语言 4 18086汇编语言源程序的格式 4 1 1汇编语言 Assemblylanguage 汇编语言是一种面向机器的程序设计语言 不同类型的CPU 其汇编指令也不尽相同 它是对机器语言的符号化描述 是一门低级语言 用汇编语言编写的程序叫 汇编语言程序 或 汇编语言源程序 这种程序较机器语言直观 易懂 便于交流和维护 与其他高级语言一样 汇编语言源程序不能直接被计算机识别并运行 它必须通过汇编程序翻译成机器能够识别的机器语言程序 目标程序 ObjectProgram 才能运行 利用汇编程序将汇编语言源程序翻译成机器代码的过程称为汇编 4 18086汇编语言源程序的格式 4 1 2汇编程序 Assembler 汇编程序与汇编语言 源 程序是两个截然不同的概念 汇编语言程序是用户根据实际需求 使用汇编语言程序格式用助记符指令自行编写的程序 而汇编程序是系统程序 是用来将用户编写的汇编语言 源 程序转换为机器代码的系统工具程序 汇编程序以汇编语言 源 程序输入 并由此生成目标程序文件 机器能够识别的二进制代码 汇编语言程序从建立到执行的转换过程如图 4 18086汇编语言源程序的格式 4 1 3汇编语言程序的格式一个汇编语言程序可由若干个 此例有3个 段组成 每个段均以SEGMENT开始以ENDS结束 每个段可以包含若干语句 而语句又可以是指令语句或伪指令语句两种 如程序中用到的ASSUME DB SEGMENT ENDS等为伪指令语句 每条语句可由标识符 保留字 表达式等元素组成 4 18086汇编语言源程序的格式 4 1 4语句类型8086 8088汇编语言程序的语句除指令语句以外 还可以有伪指令语句和宏指令语句在汇编语言中 指令 伪指令和宏指令语句都可由四个域构成 格式如下 标识符 操作符操作数 注释 其中标识符和注释域作为可选项 在语句中根据需要决定是否选择 4 18086汇编语言源程序的格式 1 标识符标识符是源程序中为方便引用或阅读而指定的字符串 即程序员给某个位置给定的一个符号名字 它可以是下列字符的组合 字母A Z或a z 数字0 9 专用字符 下划线 4 18086汇编语言源程序的格式 2 操作符操作符是指令 伪指令或宏指令的助记符 说明本指令将执行一个什么样的操作 指令及伪指令助记符由汇编语言系统规定 宏指令助记符由编程者定义宏指令时设定 如 MOV 为将源操作数传送到目的操作数的指令 ADD 为加法指令等 4 18086汇编语言源程序的格式 3 操作数一般情况下操作数有一个或两个操作数 也可以有多个操作数 若是两个或两个以上的操作数 则各个操作数之间用逗号分隔 操作数字段可以由常数 变量 表达式 寄存器名或标号中的一种或几种组成 常数 二进制常数 八进制常数 十进制常数 十六进制常数符号常量串常数标号和变量 4 18086汇编语言源程序的格式 表达式及运算符 表4 18086汇编语言中的运算符 4 18086汇编语言源程序的格式 6 改属性运算符此类运算符专为存储器地址操作数临时指定一个新属性而设 PTR运算符格式 类型PTR变量名功能 PTR将其左边的类型指定给右边的地址 因此该地址除原有类型外 还具有由PTR指定的临时新类型 THIS运算符THIS运算符像PTR一样 可以用来建立一个特殊类型的存储器地址操作数 而不实际为它分配新的存储单元 用THIS建立的存储器地址操作数的段和偏移量与目前能分配的下一个存储单元的段和偏移量相同 但类型由THIS指定 4 18086汇编语言源程序的格式 4 注释汇编语言中的每一条语句都可以加上注释部分 注释是一行中用 开头的部分 一般用注释来说明程序功能和语句的作用 汇编程序在翻译源程序时 不会处理分号以后的注释部分 4 2常用的伪指令 汇编语言程序的语句除了指令语句外还有伪指令语句 分别简称为指令和伪指令 伪指令属于汇编控制命令 用来告诉汇编程序数据定义的类型 如何分配存储区及指示程序结果等功能 它本身不产生任何目标代码 4 2常用的伪指令 4 2 1符号定义伪指令在编程的过程中 有的表达式或常量可能多次出现 为了方便对源程序的阅读与修改 可用符号定义伪指令为这个表达式或常量指定一个标识符 此时 该标识符具有与表达式或常量相同的值 1 EQU伪指令格式 符号名EQU表达式功能 用表达式来定义符号名 使得符号名具有与表达式相同的值 其中表达式可以是常数 可求出具体值的表达式 寄存器名或指令助记符 例如 NUMEQU25 定义符号常量NUM 其值恒为252 伪指令格式 符号名 表达式功能 与EQU伪指令功能基本相同 两者的区别在于只有 伪指令可对同一标识符作重新定义 4 2常用的伪指令 4 2 2数据定义及存储器分配伪指令该类指令用于为数据分配存储单元 并进行初始化 同时还可为指定的存储单元取名 即变量名 1 DB伪指令格式 变量名 DB数据项表 注释 功能 告诉汇编程序 分配一块连续的内存单元作为字节数据区 并依次将数据项表中的值存放到内存中 存放时地址对应规则为先出现者对应低地址 后出现者对应高地址 若伪指令DB左边给出了 变量名 则此变量名用来标识新定义的内存单元的首地址 偏移地址 2 DW伪指令格式 变量名 DB数据项表 注释 功能 与DB功能相似 但它是用来定义字而不是字节的 其数据项表可以是以下形式 4 2常用的伪指令 3 DD伪指令格式 变量名 DB数据项表 注释 功能 与前两条指令相似 它是双字 4个字节 变量的定义伪指令 它的数据项表可以有以下形式 以双字为单位的常量 不确定常量用 表示以及由操作符DUP给出的重复子句 若定义的是地址表达式时 它将把偏移地址与段地址分别存放在存储器的低字与高字中 单引号引起的1 4个字符组成的串常量 以上情况的任意组合 4 2常用的伪指令 4 2 3标号定义伪指令LABELLABEL伪指令用来给某一变量或标号赋予一个新的类型 格式 名称LABEL类型其中名称是一个标识符 可以是一个标号或变量名 通常与指令语句或用DB DW DD数据定义伪指令语句连用 这时 名称就为与之连用的标号或变量建立一个新的变量或标识符名 以便补充或设置与之连用的指令或变量的类型属性 因此 这个伪指令的名称同样有段 偏移量和类型3个属性 当与指令连用 类型属性分为NEAR和FAR 当与变量连用 类型属性就分为BYTE WORD和DWORD等 它的段偏移量和与之连用的指令或变量相同 4 2常用的伪指令 4 2 4段定义伪指令8086 8088汇编语言程序是分段编写的 段定义伪指令指示汇编程序如何按段组织程序和使用存储器 1 SEGMENT和ENDS伪指令格式 段名SEGMENT 定位类型 组合类型 类别 段体段名ENDS其中段名是程序员为该段取的名字 是满足汇编语言命名规则的字符串 定位类型 组合类型和类别用于说明该段的属性 可以缺省 功能 伪指令SEGMENT与ENDS用于把程序分成若干逻辑段 这些逻辑段根据其用途的不同分为代码段 数据段 堆栈段和附加段 4 2常用的伪指令 2 ASSUME伪指令格式 ASSUME段寄存器 段名 段寄存器 段名 功能 该伪指令用于告知汇编程序源程序中定义的各段与段寄存器之间的对应关系 即CS DS SS或ES被对应到程序员定义的哪些段 从而在汇编时能知道语句中引用的变量 标号或表达式所应属于哪段 例如例4 1中的语句 ASSUMECS CSEG SS SSEG DS DSEG即是用来声明CSEG为代码段 SSEG为堆栈段 DSEG为数据段 4 2常用的伪指令 3 程序计数器 字符 在汇编语言里作为程序计数指针 它的值为程序中下一个即将分配的存储单元的偏移地址 例如 DSEGSEGMENTD1DW1234H 2345H 3456H 定义3个字CTEQU D1 符号CT与表达式 D1等价DSEGENDS其中表达式 D1的值为程序下一个所能分配的偏移地址06H减去D1的偏移地址00H 即CT D1 06H 00H 06H 为分配存储单元的个数 以字节为单位 4 2常用的伪指令 4 ORG伪指令格式 ORG表达式功能 其后表达式的值将作为下一条变量或指令语句存放的偏移地址 表达式的值应为0 65535 即0000H FFFFH 例如 ORG 100 表示其后的指令或数据跳过100个字节存放 4 2常用的伪指令 4 2 5过程定义伪指令在设计程序时 往往把具有某种独立功能的程序段设计成一个模块 即过程 过程定义的格式如下 过程名PROC NEAR或FAR 过程体过程名ENDP其中过程名由程序员指定 且过程名前后必须保持一致 过程体为实现某种功能的指令和伪指令序列 其中NEAR代表远过程 FAR为近过程 参数省略时表示为近过程NEAR 4 3汇编语言程序的上机过程 一个汇编语言源程序必须经过编辑 汇编 连接之后才能执行 一个完整的汇编程序从建立到执行 一般可以分为以下几个步骤 1 用编辑程序建立汇编语言源程序 扩展名必须为ASM 编辑程序可以是EDIT 2 用汇编程序将源程序汇编成二进制的目标代码 即扩展名为OBJ的文件 3 用连接程序将目标文件连接成扩展名为EXE的可执行文件 4 3汇编语言程序的上机过程 4 3 1建立ASM文件汇编语言的编辑器可以是EDIT或其他文本编辑程序 通过编辑器可以建立源程序并以扩展名ASM保存源程序 源程序中每条语句占一行 为便于对源程序的修改及查错等 一般语句的标号 助记符 操作数及注释首字符均应对齐 如例4 1 假设MASM汇编程序及LINK连接程序被安装在C MASM 具体步骤如下 1 从 开始 程序 菜单里找到 MS DOS 并打开 2 键入命令 CDC MASM 并回车 3 键入EDIT并回车即可编辑源文件 编辑完毕后以名4 1 asm保存源程序 4 3汇编语言程序的上机过程 4 3 2生成OBJ文件常用的汇编程序有MASM TASM TURBOASSEMBLER 5 0等 这两种工具的用法基本相同 我们先以MASM汇编程序为例来讨论根据已建立的ASM文件如何生成对应的OBJ文件 具体操作步骤如下 1 用鼠标移到C MASM 即MASM exe所在文件夹 2 双击MASM exe 启动汇编程序 3 汇编时 根据提示输入源程序文件名4 1 asm 扩展名可省略 4 根据提示 用户需要回答3个问题 以便生成3个文件 4 3汇编语言程序的上机过程 汇编过程显示的信息及需输入的信息 图4 5汇编过程显示的信息及需输入的信息 4 3汇编语言程序的上机过程 4 3 3生成EXE文件生成了4 1 obj文件还不能直接被计算机执行 还需用LINK连接程序将它连接成可执行文件 EXE文件 生成EXE文件的步骤如下 1 在目录C MASM下 双击LINK exe文件启动连接程序 2 连接时 根据提示输入上步生成的目标程序文件名4 1 obj obj可省略 3 根据提示 用户需回答3个问题 以便生成3个文件 4 3汇编语言程序的上机过程 连接需输入及显示的提示信息 图4 6连接需输入及显示的提示信息 4 3汇编语言程序的上机过程 4 3 4快速生成可执行文件的方法在用户只需生成源文件 ASM 目标文件 OBJ 和可执行文件 EXE 时 可用下列命令方式来快速生成可执行文件 1 单击 开始 运行 2 在对话框中输入C MASM MASM4 1 后单击 确定 按钮 完成汇编工作 运行过程屏幕显示如图4 7所示 4 3汇编语言程序的上机过程 3 在对话框中输入C MASM LINK4 1 obj 后单击 确定 按钮 完成连接工作 图4 8执行快速连接的方法 4 3汇编语言程序的上机过程 4 3 5程序的执行和调试1 程序的执行由上述方法生成的可执行文件 可以被用户直接执行 方法是在MS DOS下进入C MASM目录 直接输入可执行文件名 如4 1即可 也可以使用类似于快速生成可执行文件的方法 即在 运行 对话框中输入C MASM 4 1即可 2 程序的调试在汇编 连接成功后 只能说明程序没有语法错误 程序执行的结果未必正确 这时可用DEBUG对目标程序进行动态调试 在执行过程中观察各寄存器 相关存储单元及标志寄存器的值 跟踪执行情况 判断结果是否正确 4 3汇编语言程序的上机过程 图4 9debug调入程序的过程 文件调入后 可看到DEBUG命令的状态提示符 此时用U命令对调入程序的机器代码进行反汇编 看程序是否被正确装载 用R命令查看或修改寄存器的值 用D命令查看内存单元的值 用G命令执行程序 以及用T或者P命令单步逐条执行程序 4 3汇编语言程序的上机过程 U Unassemble 反汇编命令 格式 u 地址范围 或 地址 功能 对指定地址范围或地址的目标代码进行反汇编 若不给出地址 则从当前CS IP位置开始显示其后32个字节的目标代码 例如用上述方法对4 1 exe装入后 用U命令显示结果 如图4 10所示 4 3汇编语言程序的上机过程 R Register 查看和修改寄存器内容及状态标志值命令格式 R 寄存器 功能 显示和修改指定寄存器的值 若不指定寄存器 则显示所有寄存器的内容 图4 10U命令执行显示信息 4 3汇编语言程序的上机过程 表4 3在DEBUG中的状态标志位的状态表示符 4 3汇编语言程序的上机过程 D Dump 显示存储单元命令格式 d 地址 d 地址范围 功能 将指定地址或地址范围内的存储单元的内容显示出来 例如 当显示指定地址内存单元的内容时 执行命令 dds 0000当显示指定地址范围的内存单元内容时 执行命令 d00000020执行该命令的结果如图4 12所示 4 3汇编语言程序的上机过程 G Go 执行命令格式 g 起始地址 结束地址 功能 执行指定地址段内的程序 这条命令往往与U命令配合着用 比如前面用U命令观察到程序4 1 exe调入内存后是偏移地址从0000H开始 001E 与INT21对应 结束 所以可用下列命令来执行程序 go0000001E执行该命令的情况如图4 13所示 4 3汇编语言程序的上机过程 T Trace 单步执行命令格式 T 起始地址 指令条数 功能 执行一条或多条指令 当执行多条指令时需在指令条数处指出 每执行一条指令均会将各寄存器及状态标志位的值显示出来 这样就可以观察一步一步执行指令后各寄存器的值是否正确 以达到调试的目的 执行情况如图4 14所示 4 3汇编语言程序的上机过程 P单步执行命令格式 P 起始地址 指令条数 功能 与 T 命令相似 差别在于对于P命令将CALL INT LOOP等指令当成一条指令来执行 T命令将转入到这些指令所代表的服务子程序的内部 所以在遇到INT或者是LOOP等指令的时候往往用P命令而不用T命令 4 3汇编语言程序的上机过程 4 3 6TASM TLINK及TurboDebug的使用1 TASM的使用TASM的作用与MASM相似 均可对汇编源程序进行汇编 编译 命令格式为 TASM源文件名 目标文件名 列表文件名 交叉参考文件名 若用鼠标直接双击TASM EXE 只会看到其帮助信息 所以需要在DOS提示符下输入 在DOS提示符下用命令CDC TASM BIN进入该目录 然后在提示符下输入TASM4 1即可对源程序汇编 过程如图4 16所示 4 3汇编语言程序的上机过程 图4 16TASM汇编源程序过程 4 3汇编语言程序的上机过程 2 TLINK的使用该命令的功能与使用方法与LINK类似 但功能要比LINK强得多 而且它还支持386以上的指令 这是LINK不具有的功能 格式为 TLINK目标文件名 可执行文件名 定位图文件名 库文件名 其使用方法与TASM相似 即在汇编成功生成目标文件后即可在DOS提示符下输入TLINK4 1 obj即可连接生成可执行文件 其中的扩展名及选项 可执行文件名 定位图文件名 库文件名 可以省略 这时连接会自动生成4 1 exe 其过程如图4 17所示 4 3汇编语言程序的上机过程 3 TurboDebug的使用TurboDebug是一个功能强大的源代码级调试器 它可对多种语言编写成的程序进行调试 并且支持32位的源代码 在安装目录下运行 TD可执行文件名即可打开TurboDebug 4 4基本编程方法 程序的基本结构形式有3种 顺序程序 分支程序和循环程序 4 1 1顺序程序设计1 问题分析2 确定算法并编制程序流图3 编码与调试 4 4基本编程方法 4 4 2分支程序设计1 单边选择程序设计单边选择程序具体为二分支结构 相当于高级语言中的IF THEN ELSE或者IF THEN结构 通常根据某一条件成立与否而转向不同的分支 图4 20单边选择程序两种基本结构 4 4基本编程方法 2 多边选择程序设计多边选择程序也叫多分支程序 用来判定条件有多个取值 根据条件取值不同而分别转向不同的程序分支 如图4 22所示 图4 22多条件取值分支结构 4 4基本编程方法 多分支程序结构也可以由多个二分支结构构成 两种结构组合可以构成更为复杂的多分支结构 如图4 23所示 图4 23多分支结构 4 4基本编程方法 3 用比较转移指令实现分支这种分支程序一般是实现两个数的比较 使用CMP指令或者CMPS 串比较 及SCAS 串搜索 指令 然后根据条件实现转移 4 4 3循环程序设计循环程序的基本结构形式可以分为两种 一种是 先判断后执行 的 当型 循环 另一种是 先执行后判断 的 直到型 循环 4 4基本编程方法 在 当型 循环中 程序先判断循环的初始条件 如果循环初始条件满足循环要求的话 则执行 循环体 否则退出循环的执行 在 直到型 循环中 程序先执行 循环体 然后再判断循环的条件 如果条件满足循环要求的话 则继续执行 循环体 否则退出循环的执行 它们的执行流程图如图4 26所示 4 5子程序的编程方法 在编制程序时 经常会遇到某一程序段在程序的若干不同地方多次用到 或被不同的程序用到 这些程序段少则几条 多则几十条 几百条 如果在每处都用到的地方都重复地写一遍 这样既浪费编程时间 也浪费存储空间 因此可将这段程序抽取出来编成一个独立的程序 当需要执行这段程序时 就去调用它 人们称调用它的那个程序为主程序或调用程序 称被调用的程序为子程序或过程 在设计一个比较复杂的程序时 为使程序清晰 易维护 可以根据程序完成的主要功能 将程序划分成几个可独立汇编的程序单元 我们把这些程序单元称为模块 子程序或过程是模块化程序设计的主要手段 4 5子程序的编程方法 4 5 1子程序设计过程定义伪操作用在过程的前后 使整个过程形成清晰的 具有特定功能的代码块 其格式为 过程名称PROC属性过程体内语句过程名称ENDP 过程的正确执行是由过程的正确调用和正确返回保证的 1 过程的调用语句格式 CALL属性被调过程名 2 过程的返回语句格式 RET 4 5子程序的编程方法 4 5 2过程的参数传递程序在调用子程序时经常需要传送一些参数给子程序 子程序运行完后也经常要回送一些信息给调用程序 这种调用程序和子程序之间的信息传送称为参数传送 如果过程的调用语句与过程处于同一模块中 包括它们处于同一代码段 不同代码段 两种情况均可以共用主程序的数据段中所说明的变量 此时主程序中定义的变量名虽然是局部变量 但可在整个程序模块中起作用 如果过程的调用语句与过程在不同的程序模块中 常用的参数传递方法有 约定寄存器法约定存储单元法及堆栈法 4 5子程序的编程方法 1 约定寄存器法通过寄存器进行参数传递又称为约定寄存器法 这对于参数个数不多的情况下 只需在调用过程前将过程所需要的有关参数传送给某几个通用寄存器 然后调用过程 2 约定存储单元法约定存储单元法是事先约定某些存储单元进行参数传递 其优点是每个子程序要处理的数据或送出的处理结果都有独立的存储单元 参数传递个数不受限制 但要占用一定数量的存储单元 该法适用于参数传递较多的情况 3 伪指令EXTRN PUBLIC的使用在主程序和过程所在的程序模块分别设置一个具有相同存储区分配的公用数据段进行参数传递 4 5子程序的编程方法 4 用寄存器传送参数地址表的地址这个方法实质是约定寄存器法的一种改进 在约定寄存器法中 由于寄存器数量的限制 当参数的个数较多时 尤其是数组类型的参数 没有足够的寄存器使用 这时 可以先将参数的地址组成一个数组 形成参数地址表 然后只需将此表的地址偏移量传送给一个寄存器 通过寄存器把地址传送给过程 5 用堆栈传送参数子程序 过程 中所要处理的数据可以由寄存器或存储单元来传递 但是用寄存器传递 经常需要保护主程序中寄存器的内容返回时再恢复 对系统数据流的控制是不方便的 时间也不经济 将数据放在存储区中也影响了存储空间的利用率 因为有的只需暂时保留 而采用堆栈可以随时存放和删除一些临时性的数据 用堆栈传递参数特别适用于参数较多 子程序有嵌套和递归调用的情况 4 6其他类程序 例4 16 从键盘输入一字符串存放在以BUF 2开始的存储单元中 现要求将字符串传送到以BUF 10开始的存储单元 存储区有重叠 试编此程序 程序如下 DATASEGMENTBUFDB50 计划输入的最大字符数DB 实际输入的字符数DB50DUP DATAENDSSTACSEGMENTPARASTACK STACK DB100DUP 0 STACENDSCODESEGMENTASSUMECS CODE DS DATA SS STAC 4 6其他类程序 STARTPROCFARPUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AXMOVES AXMOVDX OFFSETBUF 利用DOS10号功能调用键入字符串MOVAH 10INT21HLEASI BUF 2 取键盘输入的第一个字符LEADI BUF 10MOVCL BUF 1 要取的字符数MOVCH 0CLDPUSHSI 4 6其他类程序 ADDSI CXDECSICMPSI DI 源串的末地址与目的串首址比较POPSIJLINM 小于无重叠 否则有重叠 要从末地址开始传送STDADDSI CXDECSIADDDI CXDECDIINM REPMOVSBRETSTARTENDPCODEENDSENDSTART 4 6其他类程序 例4 17 以BUF开始的存储单元内存放有10个十六进制数的ASCII编码 请将它们转换成相应的十六进制数并存放在以BUF1开始的5个字节单元中 程序如下 DATASEGMENTBUFDB30H 3FH 41H 45H 5AHDB50H 47H 39H 34H 53HBUF1DB5DUP DATAENDSSSEGSEGMENTPARASTACK STACK DB100HDUP 0 SSEGENDSCODESEGMENTASSUMECS CODE DS DATA SS SSEGMAINPROCFARPUSHDSMOVAX 0 4 6其他类程序 PUSHAXMOVAX DATAMOVDS AXMOVDI OFFSETBUF1MOVBX OFFSETBUF

温馨提示

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

评论

0/150

提交评论