




已阅读5页,还剩147页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章汇编语言程序格式 河南师范大学计算机与信息技术学院 2 2020 2 22 硬指令和伪指令 硬指令 使CPU产生动作 并在程序执行时才处理的语句 就是第3章学习的处理器指令 伪指令 伪操作 Directive 不产生CPU动作 在程序执行前由汇编程序处理的说明性语句 例如 处理器选择 定义程序模式 定义数据 分配存储区 指示程序结束等等 伪指令与具体的处理器类型无关 但与汇编程序的版本有关 河南师范大学计算机与信息技术学院 3 2020 2 22 本章内容提要 河南师范大学计算机与信息技术学院 4 2020 2 22 4 1汇编语言程序的开发 河南师范大学计算机与信息技术学院 5 2020 2 22 4 1 1汇编程序功能 河南师范大学计算机与信息技术学院 6 2020 2 22 1 汇编语言程序的建立及汇编过程 在计算机上运行汇编语言程序的步骤是 用编辑程序建立ASM源文件 汇编语言程序的建立及汇编过程 如图4 1所示 用MASM程序把ASM文件转换成OBJ文件 用LINK程序把OBJ文件转换成EXE文件 用DOS命令直接键入文件名就可执行该程序 河南师范大学计算机与信息技术学院 7 2020 2 22 2 汇编程序的主要功能 检查源程序 测出源程序中的语法错误 并给出出错信息 产生源程序的目标程序 并可给出列表文件 同时列出汇编语言和机器语言的文件 称为LST文件 展开宏指令 河南师范大学计算机与信息技术学院 8 2020 2 22 3 常用的汇编程序 Microsoft公司推出的宏汇编程序MASM MacroAssembler Borland公司推出的TASM TurboAssembler 本课程采用MASM6 11 河南师范大学计算机与信息技术学院 9 2020 2 22 4 1 2汇编语言程序的语句格式 汇编语言语句格式 说明性语句 由伪指令构成的语句 它通常指示汇编程序如何汇编源程序 执行性语句 由硬指令构成的语句 它通常对应一条机器指令 出现在程序的代码段中 name operationoperand comment 标号 硬指令助记符操作数 操作数 注释 名字伪指令助记符参数 参数 注释 河南师范大学计算机与信息技术学院 10 2020 2 22 1 名字 name 项 源程序中用下列字符来表示名字项 name 注意 字母A Z数字0 9专用字符 名字不能以数字开头 名字中如果用到 则必须是第一个字符 汇编程序只识别名字的前31个字符 默认情况下 汇编程序不区别标识符中的字母大小写 河南师范大学计算机与信息技术学院 11 2020 2 22 1 名字 name 项 name可以是标号或变量 它们都用来表示本语句的符号地址 都是可有可无的 只有当需要用到符号地址来访问该语句时 它才需要出现 标号 在代码段中定义 是反映硬指令位置 逻辑地址 的标识符 后跟一个冒号分隔 经常在转移指令或CALL指令的操作数字段出现 用以表示转向地址 河南师范大学计算机与信息技术学院 12 2020 2 22 1 名字 name 项 名字 标识符 Identifier 每个标识符的定义是唯一的 还不能是汇编语言采用的保留字 是反映伪指令位置 逻辑地址 和属性的标识符 后跟空格或制表符分隔 没有冒号 可用LABEL或EQU伪操作来定义 还可以作为过程名定义 第六章中介绍 河南师范大学计算机与信息技术学院 13 2020 2 22 2 保留字 保留字 ReservedWord 是汇编程序已经利用的标识符 主要有 硬指令助记符 例如 MOV ADD伪指令助记符 例如 DB EQU操作符 例如 OFFSET PTR寄存器名 例如 AX CS预定义符号 例如 data 河南师范大学计算机与信息技术学院 14 2020 2 22 3 指令助记符 硬指令助记符可以是任何一条处理器指令 也可以是一条宏指令 伪指令助记符将在本章和下章学习 前一章引入的定义字节数据和字符串的DB就是伪指令 河南师范大学计算机与信息技术学院 15 2020 2 22 4 操作数与参数 处理器指令的操作数可以是立即数 寄存器和存储单元 伪指令的参数可以是常数 变量名 表达式等 可以有多个 参数之间用逗号分隔 河南师范大学计算机与信息技术学院 16 2020 2 22 5 注释 comment 项 用来说明程序或语句的功能 汇编程序在翻译源程序时将跳过该部分 不对它们做任何处理 为注释的开始 可以从一行的第一个字符开始 此时整行都是注释 常用来说明下面一段程序的功能 河南师范大学计算机与信息技术学院 17 2020 2 22 6 分隔符 语句的4个组成部分要用分隔符分开 其他部分通常采用空格或制表符 标号后用冒号 注释前用分号 操作数之间和参数之间使用逗号分隔 多个空格和与一个制表符的作用相同 MASM支持续行符 河南师范大学计算机与信息技术学院 18 2020 2 22 4 1 3汇编语言程序的程序格式 完整的汇编语言源程序由段组成 一个汇编语言源程序可以包含若干个代码段 数据段 附加段或堆栈段 段与段之间的顺序可随意排列 需独立运行的程序必须包含一个代码段 并指示程序执行的起始点 一个程序只有一个起始点 所有的可执行性语句必须位于某一个代码段内 说明性语句可根据需要位于任一段内 通常 程序还需要一个堆栈段 汇编语言源程序段定义格式有两种 简化段定义格式 从MASM5 0开始支持完整段定义格式 MASM5 0以前就具有 河南师范大学计算机与信息技术学院 19 2020 2 22 4 1 3汇编语言程序的程序格式 Mainprocfarassumecs program ds datareaStart pushdssubax axpushaxmovax datareamovds ax retMainendp 首先把DS的内容和0作为段地址和偏移地址入栈 以便在程序结束时用RET指令返回DOS 这是一种工作方式 movax 4c00hint21h 如果在主程序开始时没有这三条指令在堆栈段建立返回信息 则在程序结束时就不能直接用RET返回指令 而应该用DOS功能调用4CH 河南师范大学计算机与信息技术学院 20 2020 2 22 4 1 4汇编语言程序的上机过程 1 建立汇编语言的工作环境 2 建立ASM文件 3 用MASM程序产生OBJ文件 4 用LINK程序产生EXE文件 5 程序的执行 河南师范大学计算机与信息技术学院 21 2020 2 22 1 建立汇编语言的工作环境 为运行汇编语言程序至少要在磁盘上建立以下文件 必要时 还可建立如CREF EXE EXE2BIN EXE等文件 编辑程序 如EDIT EXE汇编程序 如MASM EXE连接程序 如LINK EXE调试程序 如DEBUG COM 河南师范大学计算机与信息技术学院 22 2020 2 22 2 建立ASM文件 用编辑程序EDIT在磁盘上建立如下的源程序EX MOVS ASM 例4 30把40个字母a的字符串从源缓冲区传送到目的缓冲区 河南师范大学计算机与信息技术学院 23 2020 2 22 3 用MASM程序产生OBJ文件 用汇编程序对源程序文件汇编 产生二进制的目标文件 OBJ文件 其操作与汇编程序回答如下 C masmex movsMicrosoft R MacroAssemblerVersion5 00Copyritht C MicrosoftCorp1981 1985 1987 Allrightsreserved Objectfilename ex movs obj Sourcelisting NUL LST ex movsCross reference NUL CRF ex movs51646 447778Bytessymbolspacefree0WarningErrors0SevereErrors 河南师范大学计算机与信息技术学院 24 2020 2 22 3 用MASM程序产生OBJ文件 例4 30的列表文件EX MOVS LST 这个文件同时列出了源程序和机器语言程序清单 并给出符号表 方便程序调试 这个文件可有可无 如果不需要 则直接在 NUL LST 后敲回车 否则 可回答文件名 这里是ex movs 程序请看教材P148 151 河南师范大学计算机与信息技术学院 25 2020 2 22 4 用LINK程序产生EXE文件 OBJ文件不是可执行文件 还需要用连接程序LINK把OBJ文件转换为可执行的EXE文件 C linkex movsMicrosoft R MacroAssemblerVersion5 00Copyritht C MicrosoftCorp1981 1985 1987 Allrightsreserved RunFile EX MOVS EXE ListFile NUL MAP ex movsLibraries LIB LINK WarningL4021 nostacksegment 如果一个程序是由多个模块组成时 也要通过连接程序LINK把它们连接在一起 操作方法及机器回答如下 河南师范大学计算机与信息技术学院 26 2020 2 22 4 用LINK程序产生EXE文件 LINK程序有两个输入文件OBJ和LIB LINK程序有两个输出文件EXE和MAP OBJ是需要连接的目标文件 LIB是程序中要用到的库文件 如无需要 则直接敲回车 EXE是最后得到的可执行文件 直接敲回车 MAP是连接程序的列表文件 又称为连接映像 linkmap 它给处每个段在存储器中的分配情况 例4 30的连接映像EX MOVS MAP文件 河南师范大学计算机与信息技术学院 27 2020 2 22 5 程序的执行 在建立了EXE文件后 就可以直接从DOS执行程序 如下所示 如果用户程序中 有在终端显示结果的语句 则程序运行结束 可在终端看到运行结果 程序运行结束并返回DOS EX MOVS程序没有显示结果的语句 则可通过调试程序DEBUG的D命令来检查附加段是否已得到了从源缓冲区传来的40个字母a C ex movsC 河南师范大学计算机与信息技术学院 28 2020 2 22 4 2参数 变量 标号及相关伪操作 河南师范大学计算机与信息技术学院 29 2020 2 22 4 2 1数值型参数 参数是指令的操作对象 在学习硬指令时被称为操作数 由一个或多个表达式组成 参数之间用逗号分隔 参数根据指令不同可以没有 可以有1个 2个或多个 汇编语言程序中 参数可以是常数 寄存器 标号 变量或由表达式组成 指令参数有数值型 它的主要形式是常数和数值表达式 硬指令的操作数有立即数 立即数就要用数值型参数表达 河南师范大学计算机与信息技术学院 30 2020 2 22 4 2 1数值型参数 河南师范大学计算机与信息技术学院 31 2020 2 22 1 常数 常数 常量 表示一个固定的数值 它又分成多种形式 十进制常数 表达式赋值伪操作EQU 十六进制常数 二进制常数 字符串常数 符号常数 基数控制伪操作 河南师范大学计算机与信息技术学院 32 2020 2 22 1 十进制常数 由0 9数字组成 以字母D或d结尾 缺省情况下 后缀D或d可以省略 汇编语言大小写不敏感 D和d通用 例如 100 255D 河南师范大学计算机与信息技术学院 33 2020 2 22 2 十六进制常数 由0 9 A F组成 以字母H或h结尾 以字母A F开头的十六进制数 前面要用0表达 以避免与其他符号混淆 汇编语言大小写不敏感 H和h通用 例如 64H 0FFh 0B800H 河南师范大学计算机与信息技术学院 34 2020 2 22 3 二进制常数 由0或1两个数字组成 以字母B或b结尾 汇编语言大小写不敏感 B和b通用 例如 01101100B 河南师范大学计算机与信息技术学院 35 2020 2 22 4 八进制常数 由0 7数字组成 以字母Q或q结尾 汇编语言大小写不敏感 Q和q通用 例如 144Q 各种进制的数据以后缀字母区分 默认不加后缀字母的是十进制数 河南师范大学计算机与信息技术学院 36 2020 2 22 5 基数控制伪操作 MASM提供基数控制 RADIX伪指令可以改变默认进制 其格式是 RADIXn 其中 n用来表示基数值 用十进制数表示 例如 MOVBX 0FFH RADIX16与MOVBX 178MOVBX 0FFHMOVBX 178D是等价的 RADIX16把基数定位十六进制后 十进制数后面都应跟字母D 如果某个十六进制数的末字符为D 则应在其后跟字母H 以免与十进制数发生混淆 河南师范大学计算机与信息技术学院 37 2020 2 22 6 字符串常数 用单引号或双引号括起来的单个字符或多个字符 其数值是每个字符对应的ASCII码的值 例如 d 64H AB 4142H Hello Everybody 河南师范大学计算机与信息技术学院 38 2020 2 22 7 符号常数 利用一个标识符表达的一个数值 MASM提供等价机制 用于常量定义 符号定义伪指令 常数若使用有意义的符号名来表示 可以提高程序的可读性 同时更具有通用性 等价EQU伪指令 等号 伪指令 河南师范大学计算机与信息技术学院 39 2020 2 22 8 表达式赋值伪操作EQU 符号定义伪指令 用于常量定义 利用一个标识符表达的一个数值 等价EQU伪指令 Expression nameEQUExpression 符号名EQU数值表达式符号名EQU 其中符号名不允许重复定义 等号 伪指令 符号名 数值表达式 符号名允许重复定义 常数若使用有意义的符号名来表示 可以提高程序的可读性 同时更具有通用性 二者区别 示例2 示例1 河南师范大学计算机与信息技术学院 40 2020 2 22 2 数值型表达式 数值表达式一般是指由运算符连接的各种常数所构成的表达式 MASM对除伪指令外各种汇编时处理的指令统称为操作符 Operator 程序运行之前 就已经计算出了表达式 所以 程序运行速度没有变慢 但增强程序的可读性 汇编程序在汇编过程中计算表达式 最终得到一个数值 河南师范大学计算机与信息技术学院 41 2020 2 22 运算符 算术运算符 MOD 逻辑运算符ANDORXORNOT 移位运算符SHLSHR 关系运算符EQNEGTLTGELE 高低分离符HIGHLOWHIGHWORDLOWWORD 河南师范大学计算机与信息技术学院 42 2020 2 22 1 算术运算符 实现加 减 乘 除 取余的算术运算movax 3 4 5 等价于movax 17 其中MOD也称为取模 它产生除法之后的余数 如19mod7 5 加 和减 运算符还可以用于地址表达式 示例1 除加 减外 其他运算符的参数必须是整数 两个地址相乘 相除是无意义的 两个不同段的地址相加也是无意义的 经常使用的是地址 数字量 它是有意义的 示例2 河南师范大学计算机与信息技术学院 43 2020 2 22 2 逻辑运算符 实现按位相与 相或 异或 求反的逻辑运算 oral 03hAND45h 等价于oral 01h 示例 河南师范大学计算机与信息技术学院 44 2020 2 22 3 移位运算符 实现对数值的左移 右移的逻辑操作 移入低位或高位的是0 格式为 数值表达式SHL SHR移位次数 若移位次数大于15 则结果为0 例如 moval 0101bSHL 2 2 等价于moval 01010000b 河南师范大学计算机与信息技术学院 45 2020 2 22 4 关系运算符 用于比较和测试符号数值 关系运算符的两个操作数必须是数字 或是同一段内的两个存储器地址 MASM用0FFFFH 补码 1 表示条件为真 MASM用0000H表示条件为假 示例 河南师范大学计算机与信息技术学院 46 2020 2 22 5 高低分离符 取数值的高半部分或低半部分 HIGH LOW字节分离符 从一个字数值或符号常量中得到高 低字节 HIGHWORD LOWWORD字分离符 从MASM6 0引入的 取一个符号常量 不能是其他常数 的高字或低字部分 示例 河南师范大学计算机与信息技术学院 47 2020 2 22 3 运算符的优先级 1 LENGTHSIZEWIDTHMASK2PTROFFSETSEGTPYETHIS 3HIGELOW4 MODSHLSHR5 6EQNEGTLTGELE7NOT8AND9ORXOR10SHORT 建议采用圆括号 显式表达 它可以极大地提高程序的可阅读性 河南师范大学计算机与信息技术学院 48 2020 2 22 4 地址型参数 汇编语言程序中 指令参数还有地址型 它的主要形式是标号和名字 变量名 段名 过程名等 硬指令的操作数有存储单元 存储单元就应该用地址型参数 存储器操作数 表达 河南师范大学计算机与信息技术学院 49 2020 2 22 4 2 2数据定义及存储器分配伪操作 该类伪操作又称变量定义伪指令 变量定义 Define 伪指令为变量申请固定长度的存储空间 并可同时将相应的存储单元初始化 变量名伪指令助记符初值表 格式 Variable MnemonicOperand Operand Commnet 河南师范大学计算机与信息技术学院 50 2020 2 22 变量名 variable 变量名为用户自定义标识符 表示初值表首元素的逻辑地址 用这个符号表示地址 常称为符号地址 变量名可以没有 这种情况 汇编程序将直接为初值表分配空间 无符号地址 设置变量名是为了方便存取它指示的存储单元 河南师范大学计算机与信息技术学院 51 2020 2 22 初值表 初值表是用逗号分隔的参数 主要由数值常数 表达式或 DUP组成 表示初值不确定 即未赋初值 DUP 表示重复初值 DUP的格式为 重复次数DUP 重复参数 Repeat countDUP operand opreand 其中repeat count可以是一个表达式 它的值应该是一个正整数 用来指定括号中的操作数的重复次数 河南师范大学计算机与信息技术学院 52 2020 2 22 变量定义伪指令助记符 Mnemonic 变量定义伪指令根据申请的主存空间单位分类 说明所定义的数据类型 DB 定义字节伪指令DW 定义字伪指令DD 定义双字伪指令DF 定义3字伪指令DQ 定义4字伪指令DT 定义10字节伪指令 这些伪操作可以把其后跟着的数据存入指定的存储单元 形成初始化数据 或者只分配存储空间而并不存入确定的数值 形成未初始化数据 可存储由16位段地址及32位偏移地址组成的远地址指针 可存储地址 形成压缩BCD码 河南师范大学计算机与信息技术学院 53 2020 2 22 1 定义字节单元伪指令DB DB伪指令用于分配一个或多个字节单元 并可以将它们初始化为指定值 初值表中每个数据一定是字节量 Byte 存放一个8位数据 可以是0 255的无符号数或是 128 127带符号数也可以是字符串常数 示例1 示例2 河南师范大学计算机与信息技术学院 54 2020 2 22 2 定义字单元伪指令DW DW伪指令用于分配一个或多个字单元 并可以将它们初始化为指定值 初值表中每个数据一定是字量 Word 一个字单元可用于存放任何16位数据 一个段地址一个偏移地址两个字符0 65535之间的无符号数 32768 32767之间的带符号数 河南师范大学计算机与信息技术学院 55 2020 2 22 3 定义双字单元伪指令DD DD伪指令用于分配一个或多个双字单元 并可以将它们初始化为指定值 初值表中每个数据是一个32位的双字量 DoubleWord 可以是有符号或无符号的32位整数也可以用来表达16位段地址 高位字 和16位的偏移地址 低位字 的远指针varddDD0 12345678hfarpointDD00400078h 示例1 示例2 示例3 示例4 河南师范大学计算机与信息技术学院 56 2020 2 22 4 其他数据单元定义伪指令 定义3字伪指令DF 用于为一个或多个6字节变量分配空间及初始化 6字节常用在32位CPU中表示一个48位远指针 16位段选择器 32位偏移地址 定义4字伪指令DQ 用于为一个或多个8字节变量分配空间及初始化 8字节变量可以表达一个64位整数 定义10字节伪指令DT 用于为一个或多个10字节变量分配空间及初始化 10字节变量可以表达扩展精度浮点数 示例 河南师范大学计算机与信息技术学院 57 2020 2 22 5 变量定义伪指令使用说明 操作数中的变量或标号可以是表达式 汇编后 存储器中应该存入表达式的值 DB DW DD DF DQ DT等伪操作在MASM6中可用BYTE WORD DWORD FWORD QWORD TBYTE来取代 其含义是等同的 河南师范大学计算机与信息技术学院 58 2020 2 22 4 2 3地址计数器与对准伪操作 河南师范大学计算机与信息技术学院 59 2020 2 22 1 地址计数器 地址计数器 locationcounter 用来保存当前正在汇编的指令的偏移地址 当开始汇编或在每一段开始时 把地址计数器初始化为零 汇编过程中 每处理一条指令 地址计数器就增加一个值 此值为该指令所需要的字节数 地址计数器的值可用符号 表示 汇编语言允许用户直接用 来引用地址计数器的值 示例 河南师范大学计算机与信息技术学院 60 2020 2 22 2 ORG伪操作 定位伪指令控制数据的偏移地址 ORG参数或ORGconstantexpression ORG伪指令是将当前偏移地址指针指向参数表达的偏移地址 ORG100h 从100h处安排数据或程序ORG 10 使偏移地址加10 即跳过10个字节空间 如常数表达式的值为n 则ORG伪操作可以使下一个字节的地址成为常数表达式的值n 常数表达式也可以表示从当前已定义过的符号开始的位移量 或表示从当前地址计数器值 开始的位移量 示例1 示例2 河南师范大学计算机与信息技术学院 61 2020 2 22 3 EVEN伪操作 EVEN 从偶地址开始 EVEN伪指令使下一个变量或指令开始于偶数字节地址 EVEN伪操作可以保证字数组从偶数地址开始 例如 DATA SEGSEGMENT EVENWORD ARRAYDW100DUP DATA SEGENDS 河南师范大学计算机与信息技术学院 62 2020 2 22 4 ALIGN伪操作 ALIGNn 从n的整数倍地址开始 ALIGN伪操作是将当前偏移地址指针指向n n是2的乘方 的整数倍的地址 如果原地址指针已指向n的整数倍地址 则不做调整 否则将指针加以1 n 1中的一个数 使地址指针指向下一个n的整数倍地址 ALIGN2与EVEN等价 示例 河南师范大学计算机与信息技术学院 63 2020 2 22 4 2 4变量和标号的属性 标号和名字一经定义便具有以下两类三种属性 段值标号和名字对应存储单元的段地址 偏移值标号和名字对应存储单元的偏移地址 类型标号 子程序名的类型可以是NEAR 近 和FAR 远 分别表示段内或段间 变量名的类型可以是BYTE 字节 WORD 字 和DWORD 双字 等 河南师范大学计算机与信息技术学院 64 2020 2 22 4 2 4变量和标号的属性 变量的类型属性 typeattribute 用来表示该语句中的每一个数据项的长度 以字节为单位表示 因此 DB DW DD DF DQ DT伪操作的类型属性分别为1 2 4 6 8 10 变量表达式的属性和变量是相同的 汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令 示例1 示例2 河南师范大学计算机与信息技术学院 65 2020 2 22 4 2 4变量和标号的属性 河南师范大学计算机与信息技术学院 66 2020 2 22 1 地址操作符 取得名字或标号的段地址和偏移地址两个属性 将括起的表达式作为存储器地址 当前偏移地址 采用指定的段地址寄存器OFFSET名字 标号 返回名字或标号的偏移地址SEG名字 标号 返回名字或标号的段地址 示例1 示例2 河南师范大学计算机与信息技术学院 67 2020 2 22 2 类型操作符 类型操作符对名字或标号的类型属性进行有关设置 类型名PTR名字 标号 THIS类型名 SHORT标号 TYPE名字 标号 SIZEOF变量名 LENGTHOF变量名 河南师范大学计算机与信息技术学院 68 2020 2 22 1 类型名PTR名字 标号 PTR操作符使名字或标号具有指定的类型 类型名可以是BYTE WORD DWORD FWORD QWORD TBYTE或者是NEAR FAR 还可以是由STRUCT RECORD UNION以及TYPEDEF定义的类型 moval byteptrw var w var是一个字变量jmpfarptrn label n label是一个标号 使用PTR操作符 可以临时改变名字或标号的类型 示例 河南师范大学计算机与信息技术学院 69 2020 2 22 2 THIS类型名 利用THIS说明的操作数具有汇编时的当前逻辑地址 但具有指定的类型 LABEL伪指令的功能等同于 EQUTHIS 示例1 示例2 河南师范大学计算机与信息技术学院 70 2020 2 22 3 SHORT标号 用来修饰JMP指令中转向地址的属性 指定标号作为 128 127字节范围内的短转移 jmpshortn jump 当然 如果标号实际上超出了这个范围 则出错 河南师范大学计算机与信息技术学院 71 2020 2 22 4 TYPE名字 标号 返回表明名字或标号类型的一个字量数值 对变量 则返回该变量的以字节数表示的类型 DB DW DD DF DQ DT伪操作的类型属性分别为1 2 4 6 8 10 对短 近和远转移依次返回ff01h ff02h和ff05h 对常数 返回0 示例 河南师范大学计算机与信息技术学院 72 2020 2 22 5 LENGTH LENGTHOF变量 LENGTH对于变量中使用DUP的情况 将返回分配给该变量的单元数 对于其他情况则送1 LENGTHOF返回整个变量的数据项数 即元素数 河南师范大学计算机与信息技术学院 73 2020 2 22 6 SIZE SIZEOF变量 SIZE返回LENGTH与TYPE的乘积 操作符SIZEOF返回整个变量占用的字节数 SIZEOF LENGTHOF TYPE 示例1 示例2 示例3 河南师范大学计算机与信息技术学院 74 2020 2 22 4 3程序段的定义及相关伪操作 河南师范大学计算机与信息技术学院 75 2020 2 22 4 3 1DOS的程序结构 河南师范大学计算机与信息技术学院 76 2020 2 22 1 EXE程序 它可以有独立的代码 数据和堆栈段 还可以有多个代码段或多个数据段 程序长度可以超过64KB 执行起始处可以任意指定 利用程序开发工具 通常将生成EXE结构的可执行程序 扩展名为 EXE的文件 当DOS装入或执行一个程序时 DOS确定当时主存最低的可用地址作为该程序的装入起始点 此点以下的区域称为程序段 在程序段内偏移0处 DOS为该程序建立一个程序段前缀控制块PSP ProgramSegmentPrefix 它占256 100h 个字节 而在偏移100h处才装入程序本身 河南师范大学计算机与信息技术学院 77 2020 2 22 EXE程序的内存映像图 河南师范大学计算机与信息技术学院 78 2020 2 22 2 COM程序 在程序开发时 需要满足一定要求并采用相应参数才能正确生成COM结构的程序 COM程序是一种将代码 数据和堆栈段合一的结构紧凑的程序 所有代码 数据都在一个逻辑段内 不超过64KB 因而只能用来编制较小的程序 COM文件存储在磁盘上是主存的完全影象 不包含重新定位的加载信息 与EXE文件相比其加载速度更快 占用的磁盘空间也少 尽管DOS也为COM程序建立程序段前缀PSP 但由于两种文件结构不同 所以加载到主存后各段设置并不完全一样 河南师范大学计算机与信息技术学院 79 2020 2 22 2 COM程序 由于其小而简单 装入速度比EXE文件要快 COM文件也是一种可执行文件 由程序本身的二进制代码组成 它没有EXE文件所具有的包括有关文件信息的标题区 header 所以它占有的存储空间比EXE文件要小 COM文件不分段 其入口点必须是100H 其前的256个字节为程序段前缀所在地 且不必设置堆栈段 在程序装入时 由系统自动把SP建立在该段之末 对于所有的过程则应定义为NEAR 河南师范大学计算机与信息技术学院 80 2020 2 22 COM程序的内存映像图 河南师范大学计算机与信息技术学院 81 2020 2 22 COM程序的生成 第一个filename给出已形成的EXE文件的文件名 但不必给出扩展名 第二个filename即为所要求的COM文件的文件名 必须带有扩展名 这样就形成了COM文件 用户在建立源程序后 同样经过汇编 连接形成EXE文件 然后可以通过EXE2BIN程序来建立COM文件 操作方法如下 C 在DOS系统下 可直接在机器上用文件名执行 如果第二个filename后没有带扩展名 则生成BIN文件 在DOS系统运行时 必须先用rename命令将它改名为COM文件才能直接运行 COM文件还可以直接在调试程序DEBUG中用A或E命令建立 对于一些短小的程序 这也是一种相当方便的方法 河南师范大学计算机与信息技术学院 82 2020 2 22 4 3 2处理器选择伪操作 本组伪操作的就是告诉汇编程序应该选择哪一种指令系统 由于80 x86的所有处理器都支持8086 8088指令系统 但每一种高档机型又都增加了一些新的指令 因此在编写程序时都要对所用处理器有一个确定的选择 本组伪操作的位置 一般放在整个程序的最前面 如不给出处理器选择 则默认为 8086 也可放在程序中 如程序中用了一条80486所增加的指令 则可在该指令的上一行加上 486 河南师范大学计算机与信息技术学院 83 2020 2 22 4 3 2处理器选择伪操作 主要有以下几种 8086选择8086指令系统 286选择80286指令系统 286P选择保护方式下的80286指令系统 386选择80386指令系统 386P选择保护方式下的80386指令系统 486选择80486指令系统 486P选择保护方式下的80486指令系统 586选择Pentium指令系统 586P选择保护方式下的Pentium指令系统 指包括特权指令在内的指令系统 河南师范大学计算机与信息技术学院 84 2020 2 22 4 3 3段定义伪操作 河南师范大学计算机与信息技术学院 85 2020 2 22 1 完整段定义伪操作 段名segment 定位 组合 段字 类别 语句序列段名ends 完整段定义由SEGMENT和ENDS这一对伪指令实现 SEGMENT伪指令定义一个逻辑段的开始 ENDS伪指令表示一个段的结束 段定义指令后的4个关键字用于确定段的各种属性 堆栈段要采用stack组合类型 代码段应具有 code 类别 其他为可选属性参数 如果不指定 则采用默认参数 但如果指定 注意要按照上列次序 数据段 附加段 和堆栈段中 一般是存储单元的定义 分配等伪操作 代码段则是指令及伪操作 河南师范大学计算机与信息技术学院 86 2020 2 22 1 定位类型 align type PARA段的起始地址必须从小段边界开始 xxxx0000b 这样 偏移地址可以从0开始 BYTE该段可以从任何地址开始 xxxxxxxxb 这样起始偏移地址可能不是0 WORD该段必须从字的边界开始 xxxxxxx0b 即段起始地址必须为偶数 DWORD该段必须从双字的边界开始 xxxxxx00b PAGE该段必须从页的边界开始 00000000b 该地址能被256整除 指定逻辑段在主存储器中的边界 可为 简化段定义伪指令的代码和数据段默认采用WORD定位 堆栈段默认采用PARA定位 完整段定义伪指令的默认定位属性是PARA 其低4位已经是0 所以默认情况下数据段的偏移地址从0开始 河南师范大学计算机与信息技术学院 87 2020 2 22 2 组合类型 combine type PRIVATE该段为私有段 在连接时将不与其他模块中同名分段合并 这是完整段定义伪指令默认的段组合方式 PUBLIC该段连接时 可以把不同模块中的同名段相邻地连接在一起 其连接次序由连接命令指定 每一分段都从小段的边界开始 因此个模块的原有段之间可能存在小于16字节的间隙 这是简化段定义伪指令默认的段组合 指定多个逻辑段之间的关系 可为 MEMORY与PUBLIC同义 河南师范大学计算机与信息技术学院 88 2020 2 22 2 组合类型 cobmine type STACK把不同模块中的同名段组合而形成一个堆栈段 该段的长度为各原有段的总和 各原有段之间并无PUBLIC所连接段中的间隙 而且栈顶可自动指向连接后形成的大段堆栈段的栈顶 这是堆栈段必须具有的段组合 COMMON该段连接时 可以把不同模块中的同名段重叠而形成一个段 由于各同名段有相同的起始地址 所以会产生覆盖 COMMON的连接长度是各分段中的最大长度 重叠部分的内容取决于排列在最后一段的内容 ATexpression使段地址是表达式所计算出来的16位值 但它不能用来指定代码段 河南师范大学计算机与信息技术学院 89 2020 2 22 3 使用类型 use type 为支持32位段而设置的属性 只适用于386及其后继机型 它用来说明使用16位寻址方式还是32位寻址方式 它们可以是 USE16使用16位寻址方式 USE32使用32位寻址方式 当使用16位寻址方式时 段长 64KB 地址的形式是16位段地址和16偏移地址 当使用32位寻址方式时 段长可大4GB 地址的形式是16位段地址和32位偏移地址 编写运行于实模式 8086工作方式 的汇编语言程序 必须采用USE16 使用类型的默认项是USE16 河南师范大学计算机与信息技术学院 90 2020 2 22 4 类别 class 在引号中给出连接时组成段组的类型名 段组的类型名可以是任意名称 大多数MASM程序使用 code data 和 stack 来分别指名代码段 数据段和堆栈段 以保持所有代码和数据的连续 类型说明并不能把相同类别的段合并起来 但在连接程序组织段时 可将所有的同类别段相邻分配 河南师范大学计算机与信息技术学院 91 2020 2 22 指定段寄存器伪指令ASSUME ASSUME段寄存器 段名 段寄存器名 段名 ASSUME说明分配情况 汇编程序会根据数据所在的逻辑段 在需要时自动插入段超越前缀 这是ASSUME伪指令的主要功能 其中段寄存器必须是CS DS ES SS 386及其后继机型还有FS和GS 之一 段名则必须是由SEGMENT定义的段中的段名 通知MASM用指定的段寄存器来寻址对应的逻辑段 即明确段和段寄存器的关系 河南师范大学计算机与信息技术学院 92 2020 2 22 指定段寄存器伪指令ASSUME ASSUME伪指令并不为段寄存器设定初值 连接程序LINK将正确设置CS IP和SS SP 由于数据段通常都需要 所以在样板源程序中 首先为DS赋值 如果使用附加段 还要赋值ES ASSUMENOTHING则可取消前面由ASSUME所指定的段寄存器 完整段定义举例说明例4 1 河南师范大学计算机与信息技术学院 93 2020 2 22 2 存储模型与简化段定义伪操作 河南师范大学计算机与信息技术学院 94 2020 2 22 1 MODEL伪操作 MODEL存储模式 模式选项 使用简化段定义 必须有存储模式伪指令 model语句必须位于所有段定义语句之前 用来说明在存储器中是如何安放各个段的 存储模式决定一个程序的规模 确定进行子程序调用 指令转移和数据访问的缺省属性 MASM有7种不同的存储模式 TINY SMALL MEDIUM COMPACT LARGE HUGE FLAT 河南师范大学计算机与信息技术学院 95 2020 2 22 Tiny 用于创建COM类型程序 COM程序必须从0100H的存储单元开始 这种模型一般用于小程序 微型模式是MASM6 0才引入的 用微型模式编写汇编语言程序时 所有的段地址寄存器都被设置为同一值 这意味着代码段 数据段 堆栈段都在同一个段内 不大于64KB 访问操作数或指令都只需要使用16位偏移地址 河南师范大学计算机与信息技术学院 96 2020 2 22 Small 在小型模式下 一个程序至多只能有一个代码段和一个数据段 每段不大于64KB 一般的程序 例如本书的绝大多数程序示例和习题 都可用这种模式 这里的数据段是指数据段 堆栈段和附加段的总和 它们共用同一个段基址 总长度不可超过64KB 因此小模式下程序的最大长度为128KB 访问操作数或指令都只需要使用16位偏移地址 这意味着诸如指令转移 程序调用以及数据访问等都是近属性 NEAR 即小型模式下的调用类型和数据指针缺省分别为近调用和近指针 河南师范大学计算机与信息技术学院 97 2020 2 22 Medium 适合于数据量小但代码量大的程序 中型模式的代码段可以超过64KB 有多个 但数据段只能有一个不大于64KB的段 中型模式是与紧凑模式互补的模式 这种模式下数据是近访问 但代码则是远访问 即调用类型缺省是远 FAR 调用 因为要利用段地址区别多个代码段 河南师范大学计算机与信息技术学院 98 2020 2 22 Compact 紧凑模式下 代码段被限制在一个不大于64KB的段内 而数据段则可以有多个 超过64KB 适合于数据量大但代码量小的程序 这种模式下的代码是近访问 即调用类型缺省仍为近调用 而数据则缺省为远 FAR 访问 因为必须用段地址来区别多个数据段 河南师范大学计算机与信息技术学院 99 2020 2 22 Large 大型模式允许的代码段和数据段都有多个 都可以超过64KB 但全部的静态数据 不能改变的数据 仍限制在64K字节内 较大型程序通常采用的存储模式 大型模式下的数据和代码都可以远访问 河南师范大学计算机与信息技术学院 100 2020 2 22 Huge HUGE 巨型模式 与大型模式基本相同 只是静态数据不再被限制在64K字节之内 河南师范大学计算机与信息技术学院 101 2020 2 22 Flat 平展模式用于创建一个32位的程序 它只能运行在32位x86CPU上 DOS下不能使用FLAT模式 而编写32位Windows9 x或Windows NT的程序时 必须采用FLAT模式 DOS下编程可选择前六种模式 一般可以选用SMALL模式 MASM5版本不支持这种模型 但MASM6可以支持 TINY模式产生COM程序 其他模式产生EXE程序 FLAT模式只能用于32位程序 河南师范大学计算机与信息技术学院 102 2020 2 22 Modeloptions 高级语言接口操作系统堆栈距离 Modeloptions允许用户指定三种选项 高级语言接口 该汇编程序作为某一高级语言程序的过程而为该高级语言程序调用时 应该用C BASIC FORTRAN PASCAL等来说明 操作系统 说明程序运行于哪个操作系统之下 可用OS DOS或OS OS2来说明 默认项是OS DOS 河南师范大学计算机与信息技术学院 103 2020 2 22 Modeloptions 堆栈距离 可用NEARSTACK或FARSTACK来说明 NEARSTACK是指把堆栈段和数据段组合到一个DGROUP段中 DS和SS均指向DGROUP段 FARSTACK是指堆栈段和数据段并不合并 当存储模型为TINY SMALL MEDIUM和FLAT时 默认项是NEARSTACK 当存储模型为COMPACT LARGE和HUGE时 默认项是FARSTACK 例如 MODELSMALL C MODELLARGE PASCAL OS DOS FARSTACK 河南师范大学计算机与信息技术学院 104 2020 2 22 2 简化段定义伪操作 Code代码段Initializeddata初始化数据段Uninitializeddata未初始化数据段Farinitializeddata远初始化数据段Faruninitializeddata远未初始化数据段Constants常数段Stack堆栈段 汇编程序给出的标准段有下列几种 这种分段方法把数据段分得更细 可便于与高级语言的兼容 在为高级语言编写某一个汇编过程时 可采用这种标准段模式 河南师范大学计算机与信息技术学院 105 2020 2 22 2 简化段定义伪操作 若编写一个独立的汇编语言程序 不需要细分 一般采用下述三个标准段即可 简化段定义伪指令指明一个逻辑段的开始 同时自动结束前面的一个段 CODE DATA STACK 采用简化段定义伪指令前 需有 model语句 使用简化段定义 各段名称和其他用户所需的信息可以使用MASM预定义符号 例如 data表示由 data等定义的数据段的段名 河南师范大学计算机与信息技术学院 106 2020 2 22 2 简化段定义伪操作 Code name 对于一个代码段的模型 段名为可选项 对于多个代码段的模型 则应为每个代码段指定段名 DATA 对于以上标准段 可有以下简化段伪操作 DATA 未初始化的数据段 FARDATA name 可指定段名 如不指定 则将以FAR DATAM命名 FARDATA name 可指定段名 如不指定 则将以FAR DATAM命名 CONST STACK size 可指定堆栈段大小 如不指定 则默认值为1KB 河南师范大学计算机与信息技术学院 107 2020 2 22 代码段定义伪指令 CODE 段名 代码段伪指令 code创建一个代码段 它的参数指定该代码段的段名 如果没有给出段名 则采用默认段名 在TINY SMALL COMPACT和FLAT模式下 默认的代码段名是 TEXT 在MEDIUM LARGE和HUGE模式下 默认的代码段名是 模块名 TEXT 河南师范大学计算机与信息技术学院 108 2020 2 22 数据段定义伪指令 DATA 数据段伪指令 data创建一个数据段 段名是 DATA 它用于定义具有初值的变量 当然也允许定义无初值的变量 无初值变量可以安排在另一个段中 它用 data 伪指令创建 数据段名是 BSS const伪指令用于建立只读的常量数据段 段名 CONST 河南师范大学计算机与信息技术学院 109 2020 2 22 堆栈段定义伪指令 STACK 大小 堆栈段伪指令 STACK创建一个堆栈段 段名是 stack 它的参数指定堆栈段所占存储区的字节数 默认是1KB 1024 400h字节 河南师范大学计算机与信息技术学院 110 2020 2 22 3 与简化段定义有关的预定义符号 如在完整段定义下 在程序一开始 需要用段名装入相应寄存器 如例4 1中的相应语句 若用简化段定义 则数据段只用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年山东省齐河县一中高三生物第一学期期末经典模拟试题
- 国家开放大学《学前儿童卫生与保健》期末考试题库及答案-字母
- 期中说课稿-2025-2026学年中职基础课-基础模块3-教科版(2021)-(英语)-52
- 智能家居互联互通标准下的智能家居行业市场细分领域分析报告
- 为老年人打造一个友好的养老环境的协议
- 供热事故责任协议
- 2025年质量改进方法考试题及答案
- 第13课 口字头说课稿-2025-2026学年小学书法人美版五年级下册-人美版
- 福建省莆田市2025-2026学年生物高三第一学期期末学业水平测试试题
- 2025年小鹏安全生产培训测试题及答案
- T-CITSA 57-2025 高速公路基础设施主数据标准
- 质量风险预警系统-洞察及研究
- 住院病人防止走失课件
- 2025年临床助理医师考试试题及答案
- 2025年南康面试题目及答案
- 2025年全国学宪法讲宪法知识竞赛考试题库(含答案)
- 定增基金管理办法
- 汽车标定工程师培训课件
- 速叠杯教学课件
- GB/T 45767-2025氮化硅陶瓷基片
- 2025年第十届“学宪法、讲宪法”活动知识竞赛题库及答案
评论
0/150
提交评论