微机原理 第八章1_第1页
微机原理 第八章1_第2页
微机原理 第八章1_第3页
微机原理 第八章1_第4页
微机原理 第八章1_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第八章汇编语言程序设计 1 什么叫指令 指令由哪两个部分构成 什么是助记符 指令语句的基本格式 2 什么是寻址方式 操作数可能在什么地方 3 8088 8086的六大类指令 数据传送类算术运算类逻辑运算与移位类串操作类控制转移类处理器控制类 汇编语言 AssemblyLanguage 汇编语言是一种面向机器的程序设计语言 它是一种低级语言 它直接利用机器提供的指令系统编写程序 具体地说 用助记符表示指令的操作码和操作数 用标号或符号代替地址 变量和常量 因此可以说 汇编语言是对机器语言的符号化描述 汇编语言源程序 SourceFile 用汇编语言指令编写的程序称为汇编语言源程序或汇编源程序 通常 汇编源程序以 ASM为扩展名 这是汇编程序默认的扩展名 汇编程序 Assembler 汇编程序是将汇编源程序转变为相应目标程序的翻译程序 这个转变的过程称为汇编 汇编程序按其功能范围又可以分为基本汇编 小汇编和宏汇编 Micro Assembler 宏汇编能够对包含宏指令及大量伪指令的汇编语言源程序进行汇编 相对而言 功能较强 我们常用的宏汇编程序有微软公司的MASM EXE和Borland公司的TASM EXE TurboAssembler 机器码 助记符 机器码 反汇编 汇编 ASCII码 面向用户 B81514 MOVAX 1415H B81514 宏汇编程序的主要功能 1 检查源程序 2 检测出源程序中的语法错误 给出相应的出错信息 3 若没有语法错误 产生目标文件 并可给出列表文件 LST 同时列出汇编语言和机器语言的文件 4 展开宏指令 目标程序 ObjectProgram 目标程序也称为机器语言程序 是微处理器真正可以执行的程序 这种程序的指令都是用二进制代码来表示其操作码和操作数的机器语言指令 汇编语言源程序同其他高级语言源程序一样都需要将它翻译成目标程序才能在计算机中运行 连接程序 LinkProgram 汇编后 程序中每个段的开始地址值都置为0 程序装入内存 各段的段地址必须在0地址的基础上浮动一个值 此值要在连接时才确定 连接程序还有一个更重要的功能是可以把多个程序模块连接起来形成一个装入模块 这样 对于每个单独的模块中的外部符号的值是汇编程序无法确定的 因为每个模块是单独汇编的 必须由连接程序来确定 连接程序可以将各种语言编写的源程序经各自的编译程序编译产生的目标程序 扩展名为 obj 目标程序库装配成一个可执行程序 当然各目标程序间必须建立必要的通信接口 连接程序的主要工作是 1 找到要连接的所有目标模块 2 对所有的目标模块中的所有的段分配内存单元 即确定所有的段地址值 3 确定所有汇编程序不能确定的偏移地址值 符号地址 4 构成一个装入模块 即可执行程序 也可给出 MAP文件 文件中记录的是每个段在内存中的分配情况 可执行程序 ExecutiveProgram 可执行程序或称可执行文件是指可以被系统装入内存运行 执行指令 的程序 扩展名为 COM EXE等 可执行程序依然是一个存放在外存中的静态程序 它们可以直接被MS DOS操作系统 调试程序DEBUG装入内存 由微处理器执行 运行 从连接程序生成的可执行程序的连接映象文件 MAP可以看出 可执行程序的内存分配起始地址依然为0 因此还需要最终确定这个起始地址 将这个可执行程序安全地装入内存 不能同其他内存数据地址发生冲突 例如 从00000H 003FFH存放的是中断向量表 DOS操作系统也有常驻内存的部分等等 假设在DOS下执行用户程序SAMPLE EXE C SAMPLE回车后就开始运行 其过程大致为 首先由DOS的COMMAND COM在内存中用户程序可以使用的区域建立一个256个字节的程序段前缀PSP ProgramSegmentPrefix 它包含了执行程序的有关信息和返回DOS的路径 断点保存 建立PSP以后 可执行程序才被调入内存 将可执行程序放在PSP的后面 也就是最终确定了可执行程序中所有的代码在内存中的实际地址 此时CS IP的值指向可执行程序代码段的第一条指令 可执行程序开始运行 语句类型l指令语句 格式为 标号 助记符 操作数 注释 每条语句一般占一行 支持续行符 l伪指令语句伪指令语句是为汇编程序和连接程序提供一些必要的控制信息的管理性语句 伪指令不产生目标代码 伪指令语句对应的伪操作是在汇编过程中完成的 而指令语句对应的操作是在可执行程序运行时完成 伪指令语句的格式为 名字 伪操作指令 操作数表 注释 其中 名字不能用 作为结尾 名字可以是符号常量名 段名 变量名 过程名 宏名 结构名 记录名等 由不同的伪指令决定 操作数是由 分开的一系列操作数 参数 宏指令语句宏指令是具有名称的一段由指令和伪指令语句组成的序列 它实际上是一段汇编语句序列的缩写 在汇编时 汇编程序用对应的代码序列替代宏指令 这个过程又称宏展开 展开后在逐条进行汇编 因此 宏指令只节省源程序篇幅 宏指令语句的格式 宏名MACRO 形式参数表 名字和标号统称为标识符 Identifier 标识符的命名必须遵循以下规则 标识符由字母 a z A Z 数字 0 9 或某些特殊符号 如 等 组成 标识符不能以数字开头 不能单独作为标识符 标识符是一串连续的符号 中间不能有空格符 标识符中若使用点号 点号必须是第一个字符 标识符有效长度为31个字符 若超过只保留前31个字符 在一个特定的源程序文件中 用户定义的标识符必须是唯一的 不能使用汇编语言的保留字 汇编语言的保留字为硬指令助记符 伪指令助记符 操作符 运算符 寄存器名和预定义符号等组成 由于汇编程序不区别字母大小写 大小写不敏感 所以标识符ABC abc Abc是相同的 这一点和C语言不同 常量 变量和标识符汇编语言的数据可简单地分为常量和变量 常量可作为指令语句的立即数或伪指令的参数 变量主要作为内存操作数 名字和标号 标识符 具有逻辑地址和类型属性 主要用做地址操作数 也可以作为立即数和存储器操作数的名称 常量是没有任何属性的纯数值 在汇编期间 它的二进制值已能完全确定 且在程序运行中 它也不会发生变化 它可以有如下几种表达形式 2 字符串字符串常量是由单引号和双引号括起来的单个字符或多个字符 其数值是每个字符的ASCII码值 例如 d 64h AB 4142h Hello Assembly 等 3 符号常量符号常量用标识符表达一个数值 常量若用有意义的符号名来表示 可以提高源程序的可读性 MASM提供等价机制 用来为常量定义符号名 4 数值表达式数值表达式是指由操作符 Operator 连接而构成 具有固定数值 能被计算并产生固定数值 的表达式 汇编程序在汇编过程中计算数值表达式 最终得到一个确定的数值 所以也是常量 由于数值表达式是在汇编阶段计算 所以组成数值表达式的各部分必须在汇编时就能确定 常量 变量实质上就是内存数据 这些数据在程序运行期间可以修改 为了便于对变量的访问 它常常以变量名的形式出现在程序中 也可将变量名当作是内存单元的符号地址 变量需事先定义才能使用 名字和标号是汇编语言语句 指令或伪指令语句 的第一部分 是由用户命名的标识符 名字存在于一条伪指令语句中 标号存在于一条指令语句中 后面跟 名字可以是符号常量名 段名 变量名 过程名 宏名 结构名 记录名等 由不同的伪指令决定 名字和标号一经使用便具有两个属性 符号常量名除外 1 地址属性 名字和标号对应确定的内存单元的逻辑地址 包括段地址和偏移地址 2 类型属性 可以是下列类型 1 符号定义伪指令符号定义伪指令有 等价EQU 和 等号 伪指令 它们的格式为 符号名EQU表达式符号名 表达式其中 表达式可以是一个常数 一个可以求出常数值的数值表达式或一个寄存器名 一个指令助记符等 例如 CNEQU100CN1EQUCN 100CEQUCXMEQUMOVBEQUES BX 20 注意 A 由EQU定义的符号在整个程序中不能被再次定义 但 允许重复定义 后的表达式只能是数值表达式 B EQU和 定义的符号不占用内存单元 C 用符号定义伪指令可以增强程序的可读性 并且便于程序的修改 2 数据定义伪指令数据定义 Define 伪指令可以为数据分配存储单元 为该存储单元赋予一个变量名及初值 数据定义伪指令格式 变量名 DB DW DD DQ DT初值表达式1 初值表达式2 注释 其中 DQ DT伪指令可用于浮点数 中的内容为可选项 各初值表达式可以是整数 字符 字符串 数值表达式 使用重复操作符DUP来定义的数值 表示初值不确定 即未赋初值 变量具有逻辑地址 在程序代码中 通过对变量名的直接引用 指向定义的第一个数据 通过变量名加减位移量存取 访问 以第一个数据为基地址的前后数据 例 变量名的定义和应用 数据段BVAR1DB100 01100100B 144Q 64H D 156 字节变量 不同进制表达同一数值 内存中有连续的6个64H 注意 156是容易让人糊涂的表达 尽量避免 注意 若用BCD码表示十进制数 十进制数的每一位是用二进制码代替的 MININT 5 符号常量不占内存BVAR2DB 1 MININT MININT 5 内存中的数据依次为FFH 5 0AHDB 2DUP 20H 预留一个字节空间 重复定义两个内容为20H的字节空间WVAR1DW2010H 4 4 字变量 2010H 0010H 占4个字节WVAR2DW 没有初值的字变量DVARDD12347777H 87651111H 两个双字数据 预留一个双字空间 ABCDB A B C MAXINTEQU0AH 符号常量 MAXINT 10STRINGDB ABCDEFGHIJ 定义字符串CRLFSDB13 10 字符 回车 换行 24HARRAYDWMAXINTDUP 0 10个初值为0的字变量ARRAY1DB2DUP 2 3 2DUP 4 8个字节的内容依次为0203040402030404HSTR1DB ABCDEF 内存单元的内容依次为41H 42H 43H 44H 45H 46HSTR2DW AB CD EF 内存单元的内容依次为42H 41H 44H 43H 46H 45HSTR3DD AB CD 内存单元的内容依次为42H 41H 00H 00H 44H 43H 00H 00H MOVDL BVAR1 DL 100DECBVAR2 1 BVAR2位移量为1的数据减1 MININT仍为5MOVABC 3 DL 字符串成为 ABCD MOVAX WORDPTRDVAR 0 AX 7777HMOVDX WORDPTRDVAR 2 DX 1234H 取双字到DX AXADDAX WORDPTRDVAR 4 ADCDX WORDPTRDVAR 6 加双字到DX AXMOVWORDPTRDVAR 8 AXMOVWORDPTRDVAR 10 DX 保存双字到DVAR的第3个双字单元 MOVCX MAXINT 循环次数 10MOVBX 0AGAIN ADDSTRING BX 3 STRING中的每个值加3INCBXLOOPAGAINLEADX ABCMOVAH 09HINT21H 显示的结果为 ABCDDEFGHIJKLM 3 EVEN伪指令格式 EVEN功能 将程序计数器置为偶数 汇编程序使用一个程序计数器来指向当前的 内存数据或代码 偏移地址 若该偏移地址为偶数 则EVEN什么也不做 若为奇数 则该伪指令将使程序计数器加1 以便使下一个单元的地址为偶数 若EVEN伪指令在代码段中 若偏移地址需要调整 则汇编程序将一个空操作指令NOP插入该偏移地址指向的字节单元处 以调整程序计数器为偶数 例如 DATASEGMENTXDB EVENYDB DATAENDS 4 ORG伪指令格式 ORG表达式ORG 表达式功能 程序定位 使程序计数器的值设置成表达式给出的值 以确定当前的偏移地址 其中 表达式的值必须为常数 表示程序计数器当前的值 当前的偏移地址 例如 ORG100HMOVAX BX表明MOV指令将从偏移地址100H处开始存放 而对于ORG 100HXDW 表明数据X从当前的偏移地址再跳过256个字节后开始存放 THIS建立一个指定类型 BYTE WORD或DWORD 的或指定距离 NEAR或FAR 的地址操作数 该操作数的段地址和偏移地址与下一个存储单元地址相同 6 SEGMENT和ENDS伪指令格式 段名SEGMENT 定位类型 组合类型 类别 指令或伪指令序列 段名ENDS功能 定义程序中的段 SEGMENT伪指令表示段的开始 ENDS伪指令表示段的结束 其中 段名由用户确定 段名具有地址属性 对于代码段名 MOVBX SEGCODE SEG BX CSMOVDX OFFSETCODE SEG DX 0对于数据 附加和堆栈段名 MOVBX SEGDATA SEG BX DS或ES或SSMOVBX DATA SEG 等价于上一条指令 MOVDX OFFSETDATA SEG DX 下一个可以分配的 数据的偏移地址 DATASEGMENTADB1 2 3 4BDB22 23 45DATAENDS MOVAX DATAMOVDS AX MOVAL A 4 AL 1 定位类型 或称边界类型 Align 用于指定逻辑段的起始地址 物理地址 20位 它有五种选择 2 组合类型 Combine 告诉连接程序 本段和其他段之间的关系 主要用于多模块的程序设计 3 类别 Class 类别指定了逻辑段的类型 连接程序通过段的类别属性将所有同类别的段相邻分配 段的类别必须位于单括号中 段类别原则上可以为任意名称 但代码段一般要求使用 CODE 而堆栈段和数据段通常使用 STACK 和 DATA 7 ASSUME伪指令完整的段定义伪指令声明了逻辑段的名称及其属性 它必须配合ASSUME伪指令指明逻辑段的类型 代码段 数据段 附加段或堆栈段 格式 ASSUME段寄存器名 段名 段寄存器名 段名 功能 ASSUME伪指令通知汇编程序用指定的段寄存器来寻址对应的逻辑段 即建立段寄存器和段的缺省关系 访问内存数据时段隐含 规定了段超越的前提 ASSUME伪指令只是告诉汇编程序逻辑段与段寄存器之间的关系 它并没有为段寄存器赋初值 因此 各段寄存器的初值需要在程序中设定 段寄存器的装填 初始化 CS和IP的装填CS和IP寄存器的初值不能在程序中设置 它是通过伪指令END指定的地址来装填的 实际上是由连接程序自动设置的 DS和ES的装填可执行程序由操作系统调入内存后 ES DS PSP的段地址 若用户程序中没有堆栈段 SS PSP的段地址 SP 00H 为安全起见 程序应该设置足够大的堆栈空间 由于DOS给DS ES所赋的初值不等于用户程序数据段 附加段的段基址 因此 DS和ES必须在程序中赋初值 由于不能将一个常量直接赋给段寄存器 因此要使用下面的四条指令来完成 SS和SP的装填SS和SP也可以由连接程序设置 SS被设置成组合类型为STACK的段的段地址 而SP被设置成该堆栈段的长度 这样 SS SP就指向了栈尾 SS和SP也可在程序中设置 用户可以使用自己定义的堆栈空间 例 DS ES和SS寄存器的初始化 DSEGSEGMENTPARA DATA XDW0ABCDHDSEGENDSESEGSEGMENTPARA DATA YDW ESEGENDSSSEGSEGMENTPARASTACK STACK DB100DUP SSEGENDSCSEGSEGMENTPARA CODE ASSUMECS CSEG DS DSEG ES ESEG SS SSEG START MOVAX DSEGMOVDS AX 初始化DS寄存器MOVAX ESEGMOVES AX 初始化ES寄存器MOVAX SSEGMOVSS AX 初始化SS寄存器MOVSP 100 设置堆栈指针SP的初值 MOVAH 4CHINT21HCSEGENDSENDSTART 8 过程定义伪指令汇编语言用定义过程的方法来实现子程序的功能 过程可以用CALL指令来调用 用RET指令返回到调用处 过程定义包含两条伪指令 PROC和ENDP PROC表示过程的开始 ENDP表示过程的结束 格式 过程名PROC 属性 NEAR或FAR 过程中的语句序列 过程体 标号 RET 常数 过程名ENDP功能 定义一个过程 即子程序 调用参考p97页 9 END伪指令格式 END 起始地址 功能 表明源程序的结束 并指出程序装入后执行的起始地址 其中 方括号中的 起始地址 是可选项 它可以是标号或过程名 表示程序第一条要执行的指令的地址 10 INCLUDE伪指令格式 INCLUDE文件名功能 告诉汇编程序将该伪指令指出的文件 使用汇编语言书写的 完整地插入到当前源程序文件的INCLUDE伪指令处 例如 INCLUDEC MASMFIL MACRO MAC 8 2 4汇编语言操作符及其应用汇编语言支持许多操作符 这些操作符在指令和伪指令语句的操作数中构成表达式 共有六种类型的操作符 它们是算术 移位 逻辑 关系 回送值和类型操作符 另外还有DUP 记录操作符和宏操作符等 只有双目的 和 操作符可以用在内存地址操作数中 运算结果仍为内存地址 例 算术操作符的使用 算术操作符用于数值表达式 VALUE 15 2 VALUE 30VALUE VALUE 4 VALUE 30 4 7VALUE VALUEMOD4 VALUE 7MOD4 3VALUE VALUE 2 VALUE 3 2 5VALUE VALUE VALUE VALUE 5 5 10算术操作符用于内存地址操作数表达式 ORG100HXDB100 变量X的偏移地址为100HYDB200 变量Y的偏移地址为101HMEM1EQUX 5 MEM1 100H 5 105HMEM2EQUX 5 M

温馨提示

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

评论

0/150

提交评论