汇编语言程序设计基础-1.ppt_第1页
汇编语言程序设计基础-1.ppt_第2页
汇编语言程序设计基础-1.ppt_第3页
汇编语言程序设计基础-1.ppt_第4页
汇编语言程序设计基础-1.ppt_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

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

文档简介

第3章汇编语言程序设计基础 3 1汇编语言的注释与指令格式3 2汇编语言程序的需求3 3EXE文件的初始化3 4源程序的实例 3 1汇编语言的注释与指令格式 3 1 1汇编语言注释栏注释的使用可增强程序的可读性 尤其是对一组令人费解的汇编语言指令 注释栏是以分号 开始的 当程序中出现分号时 汇编程序就把右侧的所有字母视为注释 注释栏可以使用包括空格在内的任何可显示的字母 符号和数字 注释栏可跟在同一行指令的右侧或自成一行 如下面例子所示 1 Thisentirelineisacomment 2 ADDAX BX Commentonsamelineasinstruction 注释栏只出现在汇编语言的源程序中 并不产生机器码 所以它不影响程序的执行 在本章中汇编语言指令是以大写字母来编写的 这样做的目的是使程序更容易阅读 3 1 2汇编语言的语句格式汇编语言符号指令的一般格式如下所示 名称 助记符操作数 一个或多个 名称 若存在的话 助记符 以及操作数之间至少要使用一个空格或跳格 Tab 分隔 虽然一行最多可容纳132个字符 但由于屏幕显示为80个字符 因此一般人还是以80个字符来处理一行 方括号表示该项是可选择项 下面是两个例子 名称助记符操作数注释COUNTDB1 变量名 操作码 一个操作数MOVAX 0 操作码 两个操作数 1 名称汇编语言的名称可用下列的字符来组成 字母 A Z与a z数字 0 9特殊字符 名称的第一个字符必须是字母或是特殊字符 其最大长度限制在31个字符 例如 CONT PGE25以及 E10皆为合法的名称 而且应尽量使用具有意义与可描述的名称 寄存器名称 诸如AX DI与AL是保留字 专门用来表示寄存器名 不能作为名称使用 所以 像下面这条指令 ADDAX BX 汇编程序会自动知道AX与BX是寄存器 然而像下面这条指令 MOVREGSAVE AX则只有在数据段内定义过REGSAVE后 汇编程序才能识别这个名称 注意 名称使用在数据段中时被称为变量名 若是用在指令段 即程序 中则称标号名 简称标号 用在过程中时又称为过程名 当作为标号使用时 必须以冒号 结束 如 START MOVAX DATA 2 助记符 操作码 助记符表示所要执行的操作 也被称为操作码 在数据段中 操作码则定义了一个工作区或常数 而在指令段中 操作码则表示了一个诸如MOV或ADD的操作 3 操作数操作码 即助记符 表示了要执行何种操作 而操作数则指出被操作的对象 操作数在数据段中一般为变量的初值 在指令段中一般为操作的对象 下面的例子在数据段 定义了变量COUNTR 其操作数表示所定义的值为0 名称操作码 助记符 操作数注释COUNTRDB0 COUNTR定义了一个值为0的字节 在指令段中 一个操作数可以包含1个 2个或0个项目 项与项之间用逗号隔开 下面有三个例子 操作码 助记符 操作数注释没有操作数RET 返回一个操作数INCCX 递增CX 即 CX 1 CX两个操作数ADDAX 12 把12加入AX中 名称 变量名 标号 操作码以及操作数不需要从特定的列开始 然而 这些项目一般均从相同的列开始编写 以提高程序的易读性 DOSEDIT编辑软件提供了Tab键 它能在每隔8个字符的位置停住 3 2汇编语言程序的需求 当汇编程序对汇编语言源程序进行汇编时 必须得到一些指示才能进行 汇编语言提供了一些伪指令 可以满足汇编程序的需求 这些伪指令只能在汇编程序对汇编语言源程序的汇编过程中产生作用 并不会产生任何可执行的机器指令码 下面将介绍一些常用的伪指令 1 SEGMENT段定义伪指令任何一个汇编语言源程序至少含有一个指令段 以容纳可执行的机器指令码 某些程序同时也定义堆栈段作为堆栈存储使用 以及定义数据段来定义变量的初值 定义段的汇编语言伪指令为SEGMENT 其格式如下所示 名称操作码 助记符 操作数段名SEGMENT 选择项 段名ENDS 此格式必须含有段名 且是唯一的 除此之外 段名称必须符合汇编语言的名称命名规则 ENDS指示段的结束 并且与SEGMENT含有相同的段名 SEGMENT的选择项含有下列三种 起始边界类型 结合类型与分类 Class 1 起始边界类型此项指示段的起始边界地址 一般是PARA 其作用是使得段的起始地址与节边界位置地址对齐 即它的物理地址能被16整除 nnnn0 若没有此选择项 汇编程序就将它默认为PARA 2 结合类型此项指示当汇编后进行链接时 是否需要与其他段结合 其类型有STACK COMMON PUBLIC ATexpression以及MEMORY 例如 STACK SEGMENTPARASTACK你可以使用PUBLIC COMMON以及MEMORY将各个已独立汇编过的程序链接起来 若程序无需与其他程序结合时 就可省略这个选择项 3 类型此项目用引号括起来 当链接时 它会把相关的段集合在一起 如下所示 STACK SEGMENTPARASTACK stack 2 PROC过程定义伪指令指令段内含程序的机器指令码 此段同时也含有一个或数个由PROC伪指令所定义的程序段 称为过程 Procedure 下面是仅含有一个过程的指令段 段名SEGMENTPARA过程名PROCFAR 一个包含在指令段内的过程 RET 返回DOS过程名ENDP段名ENDS 过程也必须有名称 且是唯一的 除此之外 此过程名必须符合汇编语言名称的命名规则 操作数FAR告诉DOS的装载程序 PROC是此程序的执行进入点 ENDP伪指令指示一个过程的结束 它与PROC具有相同的过程名 一个指令段可以同时含有数个过程 3 ASSUME段指定伪指令微处理器使用SS寄存器作堆栈段的定址 以DS寄存器定址数据段 且以CS寄存器定址指令段 你必须告诉汇编程序 每一段所对应的段寄存器是哪个 ASSUME伪指令可以完成此工作 它在指令段中的编程格式如下所示 助记符操作数ASSUMESS 堆栈段名 DS 数据段名 CS 指令段名 例如 SS 堆栈段名 表示汇编程序将使SS寄存器指向堆栈段 操作数项可依任意的顺序出现 除此之外 它也可以含有ES寄存器项 若程序中没有使用到ES寄存器 则可将ES项省略或写成ES NOTHING 4 END伪指令如前所述 ENDS伪指令结束一个段 ENDP伪指令结束一个过程 而END伪指令可用来结束整个源程序 其格式如下 操作码 助记符 操作数END 过程名 若程序不用执行 则操作数项可为空白 对于仅含有一个模块的典型程序 END的操作数应为PROC的名称 即类型为FAR的过程名 3 3EXE文件的初始化 EXE与COM为两种可执行磁盘文件 在本节中 我们将探讨EXE文件的程序格式 而在以后的学习中再介绍COM文件的程序格式 在DOS环境下 对汇编语言EXE文件的程序初始化 有四项需求 分别为 告知汇编程序哪些段寄存器指向哪些段 当程序开始执行时 把DS的内容压入堆栈中 将一个0地址压入堆栈中 把数据段的起始地址装入DS 当退出一个程序并返回DOS时 可以利用RET指令实现返回 图3 1说明了启动与退出EXE文件程序的全部 DATASGSEGMENTPARA Data 定义数据段 DATASGENDS 数据段结束 CODESGSEGMENTPARA CODE 定义代码段BEGINPROCFAR 定义过程1 ASSUMECS CODESG DS DATASG SS STACKSG2 PUSHDS DS压入堆栈3 SUBAX AX AX清0000PUSHAX 堆栈压入00004 MOVAX DATASG 数据段起始地址送入DS MOVDS AX 5 RET 返回DOSBEGINENDP 过程结束CODESGENDS 代码段结束ENDBEGIN 源程序结束 图3 1EXE程序的初始化1 1 ASSUME伪指令告诉汇编程序 将哪些段寄存器指向哪些段 图3 1中 CS指向CODESG DS指向DATASG SS指向STACKSG 在此例子中并没有定义STACKSG 若定义则将写成下列的形式 STACKSGSEGMENTPARASTACKStack Stack STACKSGENDS 借助使用段寄存器指向段 汇编程序就能够计算出每个项的差距值 偏移地址 例如 指令段中每一条指令都有特定的长度 第一条指令位于差距0处 若其长度为一个字 则第二条指令就位于差距为2的地址 其余依次类推 2 存储器中 在可执行程序之前的256 十六进制100 个字节区域 称为程序段前缀区 PSP DOS装载程序时使用DS寄存器来建立PSP的起点 你的程序必须将此地址 压入 堆栈存储起来 以供后面的RET指令利用这个地址返回DOS 3 系统要求堆栈中的下一个地址值为0 为了达到这个目的 可以利用SUB指令把AX清成0 再把0值压入堆栈 4 DOS装载程序会正确地把堆栈的起始地址存放在SS寄存器中 并把指令段的起始地址置入于CS寄存器中 因为装入程序已经把DS作别的用途 所以你必须按如图3 1所示的方式 利用MOV指令设置DS的初值 使DS指向DATASG数据段的起始地址 在下一节的源程序例3 1中 将详细地介绍DS的初始化 5 借助开始压入堆栈中的地址 PUSHDS和PUSHAX RET指令将使控制权退出程序而返回到DOS 另一种退出程序返回DOS的方法是使用MOVAH 4CH和INT21H指令 其特点是程序不通过过程实现执行 程序格式如图3 2所示 DATASGSEGMENTPARA Data 定义数据段 DATASGENDS 数据段结束 CODESGSEGMENTPARA CODE 定义代码段ASSUMECS CODESG DS DATASG SS STACKSG START MOVAX DATASG 数据段起始地址送入DSMOVDS AX MOVAH 4CH 返回DOSINT21HCODESGENDS 代码段结束ENDSTART 源程序结束 图3 2EXE程序的初始化2 3 4源程序的实例 例3 1把前面所介绍的EXE文件程序架构 编写成一个汇编语言源程序 此程序包含了一个称为STACKSG的堆栈段与一个称为CODESG的指令段 STACKSG包含了一项DB 定义字节 它重复定义了 STACKSEG 12次 以后的程序不会再用此方式来定义堆栈段 但当你使用DEBUG来观察汇编 链接过的程序时 此定义将有助于你找到堆栈段的位置 EXE程序格式的源程序清单如下 L31 ASM STACKSGSEGMENTPARASTACK stack DB12DUP STACKSEG STACKSGENDS CODESGSEGMENTPARA Code BEGINPROCFARASSUMESS STACKSG CS CODESG DS NOTHINGPUSHDS pushdsontostackSUBAX AX pushzerooffsetPUSHAX ontostackMOVAX 0123H Movehex0123toax ADDAX 0025H Addhex25toaxMOVBX AX MoveAXtobxADDBX AX AddAXtobxMOVCX AX MoveCXtoaxMOVAX AX MoveAXtoaxNOPRETBEGINENDPCODESGENDSENDBEGIN CODESG包含了程序中所有可执行的指令 但第一条陈述ASSUME并不产生可执行指令码 ASSUME伪指令指定了STACKSG给SS寄存器以及CODESG给CS寄存器 实际上 此程序告诉汇编程序使用SS寄存器的值来对STACKSG定位 以及使用CS寄存器的值来对CODESG定位 当系统将程序装入到内存储器中执行时 它会设定实际的地址给SS与CS寄存器 因为此程序并没有定义数据 故它没有数据段 所以ASSUME无需指定DS寄存器 紧接在ASSUME之后的指令 PUSH SUB与PUSH是初始化的标准操作 它先把DS寄存器的内容压入堆栈 其次再把一个0压入堆栈 因为通常是从DOS执行一个程序 所以这些指令使得在程序执行后能够正确地返回DOS 例3 1的程序没有显示功能 汇编 链接后生成的 EXE程序直接执行时会看不到结果 你可以使用DEBUG执行该程序 方法可参考第2章的2 4 1和2 4 3小节 例3 2用MOVAH 4CH和INT21H返回DOS的EXE格式的源程序 源程序清单如下 L32 ASM DATASGSEGMENTPARA Data DATAW1DW0123H dataw1 0123HDATAW2DW0025H dataw2 0025HDATAW3DW dataw3预留一个字单元DATASGENDS STACKSGSEGMENTPARASTACK sta

温馨提示

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

评论

0/150

提交评论