




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章主要教学内容l汇编语言和汇编程序的基本概念l汇编语言源程序书写规则 语句格式及程序分段l伪指令语句的格式 功能及应用l汇编语言源程序的建立 汇编 连接 调试及运行 第5章汇编语言的基本表达及其运行 5 1汇编语言和汇编程序的基本概念5 1 1汇编语言汇编语言是一种面向CPU指令系统的程序设计语言 它采用指令系统的助记符来表示操作码和操作数 用符号地址表示操作数地址 5 1 2汇编程序用汇编语言编写的源程序在输入计算机后 需要将其翻译成目标程序 计算机才能执行相应指令 这个翻译过程称为汇编 完成汇编任务的程序称为汇编程序 有基本汇编ASM Assembler 和宏汇编MASM MacroAssembler 两种 汇编程序以汇编语言源程序文件作为输入 并由它产生两种输出文件 目标程序文件和源程序列表文件 目标程序文件经连接定位后由计算机执行 源程序列表文件将列出源程序 目标程序的机器语言代码及符号表 5 2汇编语言源程序书写格式5 2 1汇编语言源程序的分段结构汇编源程序一般由3个逻辑段组成 即数据段 堆栈段和代码段 每个逻辑段以SEGMENT语句开始 以ENDS语句结束 整个源程序以END语句结束 数据段用来在内存中建立一个适当容量的工作区 以存放常数 变量等操作数据 堆栈段用来在内存中建立一个适当的堆栈区 以便在中断 子程序调用时使用 代码段包括了许多以符号表示的指令 其内容就是程序要执行的指令 注 必须用ASSUME伪指令告诉汇编程序 哪一段和哪一个段寄存器相对应 即某一段地址应该放入哪一个段寄存器在DOS环境下 通常采用DOS的4CH号中断功能调用使汇编语言返回DOS 不需要再对CS和SS进行初始化 5 2 2汇编语言源程序的语句类型和语句格式1 语句类型8086宏汇编MASM使用的语句可以分成3种类型 指令语句 这类指令能够产生目标代码 是CPU可以执行的能够完成特定功能的语句 主要由机器指令组成 在汇编时一条指令语句被翻译成对应的机器码 对应着特定的操作 伪指令语句 伪指令语句是为汇编程序和连接程序提供一些必要控制的管理性语句 它不产生目标代码 仅仅在汇编过程中告诉汇编程序应如何汇编 并完成相应的伪操作 例如 告诉汇编程序源程序有几个段 段名 定义变量和定义过程 给变量分配存储单元 给符号赋值 给数字或表达式命名 宏指令语句 可包括多条指令或伪指令 在汇编时 按照宏指令的定义 在出现宏指令的地方将其展开还原 2 语句格式一般情况下 汇编语言的语句可以由以下几部分组成 名字 操作符 操作数 注释 1 名字是一个符号 它表示本条语句的符号地址 一般来说 名字可以是标号和变量 统称为标识符 名字的组成字母A Z a z 数字0 9 专用字符 注 数字不能为名字的第一个位置 只能出现在名字的第一个位置名字最长31个字符组成2 指令语句和伪指令语句中名字的区别指令语句的名字之后要用冒号 而伪指令语句名字后不用例 LAB1 MOVAX 2050H 指令语句 LAB1是名字 也是指令第一字节的符号地址VAR1DW1200H 伪指令语句 VAR1是名字 也是符号地址 VAR1和VAR1 1存放0012 指令语句中的名字一般采用标号NEXT MOVAX 1234H一个标号与一条指令的地址相联系 因此标号可以作为JMP和CALL指令的操作数JNZNEXTCALLAPAR伪指令语句中的名字可以是变量名 段名 过程名 符号名等BUFDW1234HCODESEGMENTAPARPROC 3 标号和变量的属性标号和变量都具备3种属性 段属性 偏移属性及类型属性 段属性 该属性定义了标号和变量的段起始地址标号的段由CS指示变量的段通常由DS或ES指示偏移属性 表示标号和变量相距段起始地址的字节数 16位类型属性 标号是在本段内引用NEAR还是在其他段中引用FAR 变量有几个字节长度 由定义变量的伪指令DB DW和DD等决定 2 操作符字段操作符可以是机器指令 伪指令和宏指令的助记符 操作数字段是操作符的操作对象 当有两个及以上的操作数时 用逗号隔开 注释字段是以 开头的说明部分 可以用英文或者中文书写 注释字段是语句的非执行部分 5 38086汇编语言中的标识符 表达式和运算符5 3 1标识符汇编语言每条语句的第一个字段是它的名字字段 名字可以是标号或变量 这两者又称为标识符 重点是要掌握其组成规则和它的3个属性 5 3 2表达式和运算符在表达式中 运算符充当着重要的角色 8086宏汇编有算术运算符 逻辑运算符 关系运算符 分析运算符和综合运算符共5种 下面分别讨论5种运算符的作用 1 算术运算符用于完成算术运算 有 加法 减法 乘法 除法 MOD 求余 SHL 左移 SHR 右移 共7种运算 例如 将字数组B1的长度值 字数 存入AX寄存器 可以写作 B1DW11 22 33 44 55 66LB1DW MOVAX LB1 B1 2汇编后指令成为MOVAX 6 2 逻辑运算符的作用是对其操作数进行按位操作 逻辑运算符有AND 与 OR 或 XOR 异或 和NOT 非 例如 PORT VALEQU20H OUTAL PORT VALOR5汇编后指令成为OUTAL 25H 3 关系运算符的运算对象是两个性质相同的项目 其结果为 关系成立或不成立 有EQ 相等 NE 不相等 LT 小于 GT 大于 LE 小于或等于 GE 大于或等于 共6种 结果为真 表示为0FFFFH 否则为0 4 分析运算符是对存储器地址进行运算的 有5个 SEG 求段基值 OFFSET 求偏移量 TYPE 求变量类型 LENGTH 求变量长度 和SIZE 求字节数 1 SEG操作符格式为 SEG变量名或标号名回送变量或标号的段地址值 例如 若DATA1是从存储器06000H物理地址开始的一个数据段的段名 PADD是该段中的一个变量名 则MOVBX SEGPADD相当于MOVBX 0600H 例2已知数据段DATA从存储器实际地址03000H开始 作如下定义后 用SEG运算符求变量所在的段基址 2 OFFSET操作符格式为 OFFSET变量名或标号名回送变量或标号的偏移地址值 例如 MOVBX OFFSETPADD相当于LEABX PADD其中PADD是变量或标号例3 3 TYPE操作符格式为 TYPE变量名或标号名存储器操作数类型TYPE返回值BYTE1WORD2DWORD4NEAR 1FAR 2TYPE运算符加在变量前面 返回的是这个变量所对应的TYPE返回值 如TYPEVAR1 1TYPE运算符加在结构前面 返回的是结构包含的字节数如STUDENTSTRUCNAMEDB WANG NUMBERDB STUDENTENDS则 TYPESTUDENT 5TYPE运算符加在标号前面 返回标号的属性是NEAR还是FAR 4 LENGTH操作符格式为 LENGTH变量名LENGTH和SIZE操作符只能和数据存储器地址操作数 BYTE WORD或者DWORD 一起使用 LENGTH对于变量中使用DUP时 回送分配给该变量的单元数 其它情况则回送1 例如 MULTI WORDSDW50DUP 20 WORDS1DW20 30 40 50则MOVCX LENGTHMULTE WORDS相当于MOVCX 50而MOVCX LENGTHWORDS1相当于MOVCX 1 5 SIZE操作符格式为 SIZE变量名SIZE操作符回送分配给该变量的字节数相当于LENGTH值和TYPE值的乘积 例如 MOVCX SIZEMULTI WORD相当于MOVCX 100MOVCX SIZEWORDS1相当于MOVCX 2 5 属性操作符属性操作符主要有PTR 段操作符 SHORT THIS HIGH LOW六种 1 PTR操作符格式为 类型PTR存储器地址表达式PTR将它左边的类型指定给右边的表达式类型可以是BYTEWORDDWORDNEARFAR 它本身并不实际分配存储器 VAR1DB30H 40HVAR2DW2050H MOVAX WORDPTRVAR1 将4030H AXMOVBL BYTEPTRVAR2 将50H BL 有时汇编程序分不清所存入的数据是字节还是字 此时必须用PTR来说明属性 例如 MOV DX 20格式是错误的 必须写成MOVBYTEPTR DX 20或者MOVWORDPTR DX 20 2 段操作符段操作符用来明确表示变量或地址表达式的段属性 取消了它们原来的默认组合 也称为段跨越前缀 例如 MOVDX ES BP DI 表示源操作数在ES段 不是与BP原来的默认的SS段 3 SHORT操作符 用来指示JMP指令中转向地址的属性 如 JMPSHORTPROG1 短转移 NEXT NEXT与JMP指令距离不能大于127个字节 4 THIS操作符格式为 THIS类型或属性THIS和PTR有共同之处 建立一个特殊类型的存储器地址操作数 而不实际为它分配新的存储单元 例如 ARRAY1EQUTHISBYTEARRAY2DW30DUP 此时 ARRAY1的段地址和偏移地址与ARRAY2相同 但类型不同 ARRAY1是字节类型 ARRAY2是字类型 另外也可以按如下方法使用 BEGINEQUTHISFARSTART MOVAX 0此时 MOV指令有一个FAR属性的地址BEGIN 允许其它段的JMP指令直接跳转到BEGIN来 同时允许本段指令JMPNEARSTART或者JMPSHORTSTART转移到MOV指令处 5 HIGH和LOW操作符HIGH和LOW操作符是字节分离操作符 它接收一个数或地址表达式 HIGH取其高字节 LOW取其低位字节 例如 MEMOFFADDEQU0123H指令MOVCL HIGHMEMOFFADD汇编成MOVCL 01HMOVBH LOWMEMOFFADD汇编成MOVBH 23H 5 4伪指令语句在汇编语言中 伪指令是给汇编程序的命令 在汇编过程中由汇编程序进行处理 例如定义数据 分配存储区 定义段及定义过程等都采用伪指令表示 5 4 1数据定义伪指令数据定义伪指令用来定义一个变量的类型 并将所需要的数据放入指定的存储单元中 也可以只给变量分配存储单元 而不赋予特定的值 1 数据定义伪指令的一般格式为 变量名 伪指令操作数 操作数 注释 2 常用的数据定义伪指令定义字节变量伪指令DB定义字变量伪指令DW定义双字变量伪指令DD定义四字变量伪指令DQ定义十字节变量伪指令DT 例DATASEGMENT 定义数据段B1DB10H 30H 存入两个字节10h 30hB2DB2 3 5 存入表达式的值0BHS1DB good 存入5个字符W1DW1000H 2030H 存入两个字W2DD12345678H 存入双字S2DB AB 存入41H 42HS3DW AB 存入42H 41HDATAENDS 数据段结束 除了常数 表达式和字符串外 问号也可以作为数据定义伪指令的操作数 此时仅给变量保留相应的存储单元 而不赋予变量某个确定的初值 格式为 nDUP 初值 n为重复次数 圆括号中为重复内容例DATASEGMENTBUF1DB BUF2DB8DUP 0 给字节变量BUF2分配8个存储单元 初值为0BUF3DW5DUP 给BUF3分配5个字单元BUF4DW10DUP 0 1 10个0 1 BUF5DB50DUP 2 2DUP 4 6 50个2446DATAENDS 例如 D1DB01 30 10HD2DW01 2 3 100D3DB AB D4DW AB 字符串可以看成串常数 用单或双引号引住 得到的是字符串的ASCII码值 在汇编期间存储器中存入数据情况如图3 8所示 例如 A1DB2DUP 0 2DUP 1 2 3 4 5 以下指令使用变量B1和B2的方法是合法的 B1DB11H 22H 33H 44HB2DW55H 66H 77H MOVAL B1 取字节 AL 11HMOVBL B1 2 取字节 BL 33HMOVAX B2 取字 AX 0055HMOVCX B2 4 取字 CX 0077H对于同样的变量B1和B2 以下使用是非法的 MOVAL B2 AL是1字节 B2类型属性为2字节 不匹配MOVCX B1 CX是2字节 B1类型属性为1字节 不匹配 5 4 2符号定义伪指令符号定义伪指令的用途是给一个符号重新命名 或定义新的类型属性等 这些符号可以包括汇编语言的变量名 标号名 过程名 寄存器名以及指令助记符等 常用的符号定义伪指令有EQU LABLE 1 EQU伪指令 作用 将表达式的值赋于一个名字 表达式可以是常数 变量 寄存器名 指令助记符 数值表达式或地址表达式等 例 COUNTEQU100 COUNT代替常数VALEQUASCII TABLE 代替变量SUMEQU30 25 代替数值表达式ADREQUES BP DI 10 代替地址表达式CEQUCX 代替寄存器MEQUMOV 代替指令助记符 2 等号伪指令 格式 名字 表达式 与EQU伪指令区别 等号可以对同一个名字重复定义 例COUNTEQU10 代替常数COUNTEQU10 20 不能再次定义但COUNT 10 代替常数COUNT 10 20 可以重复定义 3 LABLE伪指令 用途 在原来标号或变量的基础上定义一个类型不同的新的标号或变量 格式 变量名或标号名LABLE类型符LABEL伪操作使同一个变量具有不同的类型LABEL伪操作的格式为 nameLABELtype数据项表示法中type为BYTE WORDDWORD例如 ARR BYTELABELBYTEARR WORDDW1122H 3344H 5566H 7788H 9900H 对于以ARR WORD变量名为开始的存储器中同一个单元 同时定义了字节属性和字属性 使用ARR BYTE变量名时 为字节属性 使用ARR WORD变量名时 为字属性 如果指令中写作 MOVAL ARR BYTE那么读一字节数据22H到AL 如果写作 MOVAX ARR WORD那么读一个字数据1122H到AX 4 程序开始和结束伪操作程序开始可用NAME和TITLE为模块取名字 并不是必要的 格式为 NAMEmodule namemodule name是程序员给出的模块名 如果没使用NAME伪操作 也可以使用TITLE伪操作 格式为 TITLEtextTITLE可指定列表文件每一页上打印的标题 text最多可有60个字符 若程序中无NAME伪操作 则汇编程序将用text中的前六个字符作为模块名 5 对准伪操作EVEN伪操作使下一个字节地址从偶数开始 一个字的地址最好从偶地址开始 所以对于字数组 为保证其从偶地址开始 可以在它前面用EVEN伪操作来达到这一目的 格式为 EVEN例如 EVENWORD ARRAYDW100dup ORG伪操作指定其后的偏移地址 格式为 ORGconstantexpression如常数表达式的值为n 则ORG伪操作可以使下一字节的地址为n 例如 ORG100HV0DW2233H 4455H则V0的偏移地址为100H 汇编程序对源程序汇编的过程中 使用地址计数器计数器的值用来 表示 汇编语言允许用户直接用 来引用地址计数器的值 例如 JNE 6转向地址是JNE指令的首地址加上6 例如 ORG0010HARRAY1DW1 2 4 3 4 5汇编后的存储区将如图3 10所 图3 10ARRAY1占用存储空间图 6 基数控制伪操作汇编程序默认的数为十进制数 因而除非专门指定 否则汇编程序把程序中出现的数均看成十进制数 当使用其它基数表示常数时 需要专门给以标记 例如 二进制数由B表示 如 00110100B十进制数由D表示 如 165D八进制数由O或Q表示 如 1677Q十六进制数由H表示 如 0ABCDH 当第一个符是字母时 前面必须加0 可用RADIX伪操作将默认的基数改变为2 16范围的基数 如默认的基数为10时 指令MOVBX 0FFHMOVBX 178用RADIX伪操作将基数改为16时 指令可以写作RADIX16MOVBX 0FFMOVBX 178D此时十进制数后须跟标记D 十六进制数后一般不标记H 但是一个16进制数 例如2D 为了与十进制数2D区别 十六进制数要标记H 5 4 3段定义伪指令 用途 在汇编语言程序中定义逻辑段 用它来指定段的名称和范围 并指明段的定位类型 组合类型及类别 常用的段定义伪指令有SEGMENT ENDS和ASSUME等 1 SEGMENT ENDS伪指令SEGMENT用于定义一个逻辑段 给逻辑段赋予一个段名SEGMENT位于一个逻辑段的开始 ENDS表示一个逻辑段结束 代码段以外的其他段段定义格式如下 segmentnameSEGMENT 行1 segmentnameENDS 行n代码段段定义格式如下 segmentnameSEGMENT 行1ASSUMEassignment assignment 行2 segmentnameENDS 行n ASSUME是伪操作 ASSUME操作只能指定某个段名与某个段寄存器联系 提供给汇编程序把源程序翻译成目标程序时使用 它并不能把段地址装入段寄存器中 所以在代码段中 还必须把代码段以外的段地址装入相应的段寄存器中 一个程序可以由多个段组成 例如 定义DATA1段DATA1SEGMENTARRAYDB1 2 3 4 5 A B TABLEDW0FFFFH 0000H DATA1ENDS 定义DATA2段DATA2SEGMENTBUFFERDB20DUP DATA2ENDS 定义代码段CODESEGMENTASSUMECS CODE DS DATA1 ES DATA2 START 程序员自己把段地址装入相应的段寄存器中 MOVAX DATA1 DATA1段地址送AXMOVDS AX DATA1段地址经AX送DSMOVAX DATA2 DATA2段地址送AXMOVES AX DATA2段地址经AX送ES CODEENDSENDSTART 行n 如果需要用连接程序把本程序与其他程序模块连接时 就需要使用SEGMENT的类型及属性说明格式 段名 定位类型 组合类型 类别 段内语句系列 段名ENDS类型及属性说明如下 定位类型 主要有 BYTE 逻辑段从字节的边界开始 该段可以从任何地址开始 WORD 该段必须从字的边界开始 即段地址必须为偶数 PARA 逻辑段从一个节的边界开始 通常16个字节为一个节 默认PAGE 逻辑段从页边界开始 256个字节为一页 故本段的起始地址最低8为必须为0组合类型 主要有 PRIVATE 每段都有自己的基地址 默认组合类型 PUBLIC 连接时将具有相同类别名的其它分段连接在一起 其连接次序由连接命令指定 COMMON 该段在连接时与其它同名分段有相同的起始地址 连接长度是各分段中的最大长度 STACK 指定该段在运行时为堆栈段的一部分 同PUBLIC 不同程序中的逻辑段 如果类别名相同 则顺序连接成为一个逻辑段 MEMORY 连接程序将把本段定位在被连接在一起的其他所有段之上 ATexpression 使段的起始地址是表达式所计算出来的16位段地址 但它不能用来指定代码段 例AT5300H则本段从存储器的物理地址53000H开始装入 3 类别 必须放在单引号内作用 在连接时决定各逻辑段的装入顺序 类别名相同的逻辑段 按出现的先后顺序排列 没有类别名的逻辑段 与其他无类别名的逻辑段一起连续装入内存 5 4 4过程定义伪指令在程序设计中 经常将一些重复出现的语句组定义为子程序 子程序又称为过程 可以采用CALL指令来调用 使用格式 过程名PROC NEAR FAR 语句系列 RET 语句系列 过程名ENDP调用一个过程的格式为 CALL过程名 5 4 5结构定义伪指令结构就是相互关联的一组数据的某种组合形式 用伪指令STRUC和ENDS把相关数据定义语句组合起来 便构成一个完整的结构 使用格式 结构名STRUC 数据定义语句序列 结构名ENDS 5 4 6模块定义与连接伪指令在编写规模较大的汇编语言源程序时 可以将整个程序划分
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- HCy-Lyso-生命科学试剂-MCE
- 2025年甘肃省大数据中心招聘工作人员考前自测高频考点模拟试题完整参考答案详解
- GSK-J4-Standard-生命科学试剂-MCE
- 2025年橡塑专用仪器项目合作计划书
- 2025安徽合力股份有限公司校园招聘模拟试卷附答案详解(典型题)
- 我的特别礼物写物作文7篇
- 2025年大型并网风力发电机组发电机合作协议书
- 文档管理流程及归档工具模板
- 2025广东省第二中医院招聘内分泌科医师1人考前自测高频考点模拟试题附答案详解(考试直接用)
- 员工培训与评估综合工具
- 2025年MicroLED行业研究报告及未来行业发展趋势预测
- 6.1 初步认识分数(课件 )数学青岛五四版三年级上册(新教材)
- GPS的课件教学课件
- 肺栓塞考试题及答案
- 2024法考主观题真题及答案
- 综合实践 探索年月日的秘密(教案)北师大版数学三年级上册
- 2025《煤矿安全规程》新旧对照专题培训
- GB/T 11379-2008金属覆盖层工程用铬电镀层
- 自然辩证法 精品课课件 (全套讲义)
- 《小班幼儿生活自理能力存在的问题与对策(论文)11000字》
- 课题的选题及研究方案的设计课件
评论
0/150
提交评论