




已阅读5页,还剩138页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章8086汇编语言程序设计 几个概念8086汇编语言的语句8086汇编中的伪指令8086汇编中的运算符汇编语言程序设计宏定义与宏调用汇编语言系统程序设计实例与上机调试 几个概念 程序是一组为完成某种功能而按一定顺序 由算法确定 编排的指令序列 本章将首先介绍8086宏汇编语言的基本语法及常用伪指令 然后用实例说明8086宏汇编语言源程序的设计方法 1 3种语言 机器语言 当指令和数据都用二进制代码表示时 计算机能够直接识别与执行 因而称之为机器语言 高级语言 是完全独立于机器的通用语言 效率低 面向过程 面向对象 必须译成机器语言 汇编语言 汇编语言是一种用符号表示的 面向CPU指令系统的程序设计语言 是用指令的助记符 符号地址 标号等编写程序的语言 汇编语言程序是机器语言程序的符号表示 用汇编语言编写程序能够 程序目标代码占用内存少 执行速度快 效率高 具有实时性 直接利用硬件系统的特性 如寄存器 标志 中断系统等 直接对位 字节 字 寄存器或存储单元 I O端口进行处理 同时也能直接使用CPU指令系统提供的各种寻址方式 编制出高质量的程序 从源程序获得目标程序的过程 为了能顺利完成汇编 用户必须为汇编程序提供一些额外的 与硬件有关的信息 如 程序使用的变量应分别存放在内存的哪个单元 堆栈应从内存的什么地址开始等等 2 汇编程序的作用 将源程序翻译成机器语言程序 按用户要求自动分配存储区域 如程序区 数据区等 自动地把各种进制数 二进制数 把字符 ASCII码 计算表达式的值 自动对源程序进行检查 指出语法错误 如非法格式 未定义的助记符 标号 漏掉操作数等 3 汇编语言程序的上机与处理过程 汇编语言上机过程D EDITABC asmD MASMABC有语法错 回EDIT下改该程序D LINKABC有错 回在EDIT下改程序D ABC运行结果错 回EDIT下改程序或在DEBUG下调试 找原因 D DEBUGABC exe 4 1汇编语言的程序结构与语句格式 语法 语句和程序结构必须遵循的规则 源程序按其编译器能够理解的语法编写方可 4 1 1汇编语言源程序的框架结构 1 源程序由若干个逻辑段组成每段由伪指令SEGMENT开始 由ENDS结束 通常有 代码段 必不可少 堆栈段 建立一个堆栈区 以存放中断时的断点地址 子程序调用时断点地址及子程序间传递参数 数据段和附加数据段 用来在内存中建立一个适当容量的工作区用以存放数据 一 源程序的结构特点按逻辑段组织源程序 包括代码段 堆栈段 数据段等 例题4 1 实现 123 456 sum的源程序 CODESEGMENT 语句6ASSUMECS CODE DS DATAMAINPROCFAR 语句8START PUSHDS 语句9 RET 语句17MAINENDP 语句18CODEENDS 语句19 数据段 代码段 DATASEGMENT 语句1ADW123 语句2BDW456 语句3SUMDW 语句4DATAENDS 语句5 ENDSTART 语句20 汇编语言语法 3 每段由若干语句行组成 每行只有一条语句且不能超过128个字符 允许有后续行 整个源程序以END结束 它通知汇编程序停止汇编 END后的START标号为程序运行时的起始地址 2 在代码段起始处 用ASSUME伪指令说明各个段Reg与逻辑段的关系 并在程序起始处设置段Reg的初值 代码段CS除外 4 每条语句由4个字段构成 各字段间用空格分开 5 源程序中设有返回DOS的指令语句 使程序执行完后返回DOS系统的命令接受状态 二 源程序与PCDOS的接口汇编语言源程序 ASM 经过汇编转变为目标程序 OBJ 当用链接程序对其进行链接和定位时 操作系统为每个用户程序建立 一个256字节的程序段前缀区 PSP 存放用户程序信息 在PSP的开始处 偏移地址0000H 安排一条INT20H软中断指令 INT20H功能是使系统返回到DOS管理状态 因此 用户执行程序完后 必须能够转到PSP起始处执行INT20H指令 定位用户程序 设置DS和ES的值使之指向PSP的开始处 即PSP的段地址 DS和ES 将用户程序的段基址 第一条指令的偏移地址设置CS IP 同时设置SS SP 运行用户程序 保证用户程序执行完后返回DOS的方法 第一种方法 标准序法 将用户程序中的主程序定义为FAR过程 其最后一条指令为RET 当程序执行到RET时 会将栈顶的两个字分别送IP CS 在主程序的开始处将PSP的段地址和偏移地址 DS ES和0000H 进栈保护 PUSHDS 保护PSP段地址MOVAX 0 保护偏移0地址PUSHAX 用户程序开始当用户程序返回时 会返回到DOS 执行INT20H 注 由于DS ES由DOS设置 所以在用户程序开始处应重新设置DS ES 第二种方法 非标准方法 不定义主程序为FAR过程 并去掉标准序 在代码段结束之前 即CODEENDS之前 增加两句 MOVAH 4CHINT21H 4CH号的DOS系统功能调用 4 1 28086汇编语言的语句 源程序是一个语句序列 每条语句规定一个基本操作 语句序列完成某个特定的操作任务 一 语句的种类与格式1 语句的种类 1 指令语句 可执行语句 对应CPU指令系统规定的一条指令 汇编时 汇编程序为之产生一一对应的机器目标代码 例 MOVAH 4CHINCBX 2 伪指令语句 汇编时给汇编程序提供与硬件有关的汇编信息 本身并不产生目标代码 CPU不执行 是指示汇编程序进行汇编的操作 例 MESSAGEDB THISISASAMPLEPROGRAM 定义变量MESSAGE在数据段DATA中的存放形式汇编时 汇编程序将MESSAGE定义为一个字节类型数据区的首地址 并按字节存储字符串 2 语句格式 指令语句的一般格式 标号 前缀 指令助记符 操作数 注释 伪指令语句的格式 名字 伪指令定义符 操作数 注释 标识符字段标识符字段由各种有效字符组成 一般表示符号地址 具有段基址 偏移量 类型三种属性 很多情况下标识符字段是语句中的可选部分 主要为便于程序的读写方便而使用 标识符字段通常有 标号后跟冒号 在程序中作为JMP LOOP指令的转移目标 与具体的指令地址相联系 名字用于定义常量名 变量名 过程名 段名等 1 标号和名字 标号和名字必须符合汇编语言对标识符的规定 以字母开头 由字母 不分大小写 数字 0 9 及部分特殊字符 和下划线 等 组成 字符串长度不超过31个 标识符不能是汇编语言中有特定意义的保留字 助记符 Reg等 如 CPU的内部寄存器名AH AL AX等 2 助记符 定义符 规定指令或伪指令的操作功能 是语句中唯一不可缺少的部分 对于指令 汇编程序将其翻译成机器语言指令 MOVAX 100 B80001对于伪指令 汇编程序据其要求的功能进行处理 dataSEGMENT data与一段地址对应stringDB Tsinghua string与一内存地址对应 前缀仅可出现在指令助记符前 3 操作数 指令语句中提供给指令的操作对象 存放位置 操作数可以是1个 2个或0个 2个时用逗号 分开 INCBX MOVAX DATA RET 伪指令语句中操作数的格式和含义随伪操作指令不同而不同 4 注释 以 开始 给以编程说明 汇编程序对 后的内容不做处理 注释对汇编不起任何作用 不对应于任何机器码 仅增强源程序的可读性 操作数可能为以下几种情况 常量操作数 如34等 寄存器操作数 如AX等 存储器操作数 如 0100H 等 表达式操作数 如 AX 2 SEGNUM1等 4 28086汇编中的伪指令 指示汇编 链接程序如何进行汇编和链接 影响目标代码生成 本身不产生目标代码 有符号定义语句 数据定义语句 程序结构语句 模块链接语句 有关宏的语句 条件汇编语句等 给表达式赋予一种符号名 以便在程序中用它替代表达式1 等值语句格式 符号名EQU表达式例 PORTEQU40H 用PORT代替40H号端口COUNTEQUCX 用COUNT代替CX寄存器MEQUMOV 用M代替MOV指令助记符 注 EQU语句不能重新定义 即在同一源程序中 用EQU定义过的符号不能赋予不同的值 例 BEQU bp 8 BEQU20H不行 4 2 1符号定义语句 2 等号语句格式 符号名 表达式功能与EQU类似 例 PP 89FAH 赋值PP PP 1 PP 89FBH 注 等号语句与EQU语句的相同点 符号不是变量 所以用EQU 定义的符号不占用存储器单元 区别 等号语句可以在同一源程序中重复定义符号 4 2 2变量定义语句 用于定义变量 程序中所用的存储器操作数 指定变量的类型和名称 并为其分配存储单元和预置初值 1 格式 变量名 数据定义符操作数 操作数 操作数 变量名指示存储器操作数的地址 符号地址 数据定义符指示存储器操作数的类型 字节 字 双字等 操作数指示存储器操作数的内容 是赋给变量的初值 多个相同类型的变量可在一条语句中定义 表示可选 汇编程序将定义的操作数 按其类型分配内存单元数 并顺序存入变量名指向的内存单元中 常用的数据定义符有 DB变量为字节数据类型DW变量为字数据类型 存放时低对低高对高 DD变量为双字数据类型 存放时低对低高对高 经过定义的变量有3种属性 段值 段内偏移量和类型 若某个变量表示的是一个数组 则其类型属性为变量的单个元素所占用的字节数 其它的数据定义符有 DQ变量为4字数据类型 64位 DT变量为10字节数据类型 80位 2 具体形式和功能 1 为数据项分配存储单元 用变量名作为该存储单元的名称 例 XDB25HYDW4142HZDD12345678H存储形式如图 初始值也可以是表达式如 IN PORTDBPORT VALOUT PORTDBPORT VAL 1其中 PORT VAL已由EQU语句赋了值 2 预留内存单元 但不赋值 以存放运算结果 例 ADB BDB 3 定义一个数组例 W TABLEDW1122H 3344HB TABLEDB1 2 4 9 16当表中的操作数相同时 可用重复操作符DUP来缩写 格式 重复次数DUP 操作数 例 ALL ZERODB0 0 0 0 0 0ALL ZERODB6DUP 0 4 定义字符串 只能用DB定义 例 MESSAGEDB HELLO 每个字符的值为它的ASCII码值 所以用DB来定义 例 str1DB TsingHua str2DB INPUT 0dH 0aH dataSEGMENTxxDB1 1 0FCHyyDW1 1 0FCHzzDD1 1 0FCHstrDB TsingHua bufDB4 4DUP DB dataend dataENDScodeSEGMENTASSUMECS codeASSUMEDS datastart MOVAX dataMOVDS AXLEABX xxLEASI yyLEADI zzMOVAH 4CHINT21HcodeENDSENDstart 例 在DEBUG下查看变量存放情况 例 XXDWCYCLEYYDDCYCLE CYCLE MOVBX AX CYCLE是程序的一个NEAR标号 例 VAR3DWVAR 1 将VAR 1的的偏移地址存入VAR3开始的两个字节或VAR3DDVAR 1 将VAR 1的的全地址存入VAR3开始的两个字 5 将已定义的地址存放内存单元当操作数是标号或变量时 可用DW或DD将标号或变量操作数的偏移地址或全地址来初始化存储器 例 TABLEDB12H 34HTAL PSDDTABLE 4 2 3段定义伪指令 将程序分成若干逻辑段 用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器 1 段定义语句SEGMENT ENDS 用于对DS ES SS CS段的定义格式 段名SEGMENT 定位类型 组合属性 类别名 段体 段名ENDS 功能 指出段名和段的各种属性 并表示段的开始和结束位置 段定义由伪操作SEGMENT开始 ENDS结束 SEGMENT和ENDS必须成对出现 且段名必须相同 SEGMENT和ENDS语句之间可以有指令和其他伪指令 表示存放在该段内存中的变量 指令或其他伪指令对该段内存的处理程序中可以定义多个段程序经汇编 连接及装入内存后 段名为一具体的段值 常量值 1 定位类型 告诉链接程序链接时段的起始边界 有4种选择 PAGE 段起始地址必须是256的倍数 XXX00H 最低8位为0 PARA 段起始地址必须是16的倍数 XXXX0H 最低4位必须为0 WORD 段起始地址必须是偶数 XX 0B 最低1位必须为0 BYTE 段起始地址为任意值 即从任何地址开始都行 缺省类型为PARA 2 组合类型 在多模块 每个模块有自己的代码段 数据段 堆栈段 组合时 告诉链接程序本段与其他模块中同名段的链接关系 有6种选择 NONE 本段与其它同名段逻辑上不发生关系 有自己的段基地址 缺省选择 PUBLIC 在满足定位类型的前提下 链接程序将其与其他模块中的同名段邻接在一起 共用一个段地址 链接的先后次序由链接命令指定 段定义的相关约定 STACK 与PUBLIC同样处理 链接后作为堆栈段 并自动初始化SS SP SS指向第一个STACK段 若程序中不说明STACK 则必须由用户在程序的开始处 自己通过语句设置SS SP COMMON 各模块中同名段重叠覆盖 有着相同的起始地址 段的长度取决于最长的COMMON段 段的内容为所链接的最后一个模块中COMMON段的内容 AT表达式 链接程序把本段装在表达式值所指定的段地址 此方式不能指定代码段 例 AT0903H 本段从09030H开始存放 MEMORY 链接在其他所有段的后面 高端存储区 若有多个MEMERY段 则只认第一个 其余按COMMON处理 段定义的相关约定 3 类别名 给各段的名字信息 表示段的类别 类别必须用单引号括起来 典型类别名如 STACK CODE 和 DATA 等 若缺省 类别名 则表明该段类别为空 同名同类别的段在内存中依序连续存放 2 段寄存器说明伪指令格式 ASSUME段寄存器 段名 段寄存器 段名 1 设定特定的Sreg指向特点的段 说明源程序中定义的段应由哪一个Sreg去寻址 否则 汇编程序无法生成机器代码程序 2 ASSUME并未真正的将段地址装入相应的Sreg Sreg的初值还必须由用户在程序的开始处用MOV指令来设置 CS除外 3 指定地址伪指令ORG在汇编程序中 有一个软件计数器 LC 地址计数器 在每个段定义开始处 它被复位为0 当汇编程序逐行扫描语句时 用LC保存当前指令的地址 格式1 ORG表达 将表达式的值 0 65535 LC格式2 ORG 表达式 将LC的当前值 表达式的值 LC功能 强行指定地址计数器LC的当前值 在段内改变它以后的代码或数据存放的偏移地址 ORG语句之后段内所有的代码或数据均以表达式 常量 的值为起始偏移量连续存放 除非遇到另一个ORG语句 此语句本身并不占内存 4 模块的定义和通信MASM宏汇编语言提供了模块化编程伪指令 用以实现模块的定义与通信 一个任务的源程序由若干模块组成 每个模块有代码段 数据段等 对应一个 ASM 是个独立的编译单位 当各个模块编译完毕 可用LINK连接各模块形成一个完整的可执行程序 exe 1 模块定义伪指令NAME END NAME模块名 为模块命名 语句END 标号 结束模块模块名的作用是指示给连接程序进行连接用 源程序中可无模块定义 此时源文件名作为模块名 主模块的END后要跟标号 子模块不跟标号 部分可省略 2 模块间通信伪指令 实现模块间数据或过程的互访和共享 格式 PUBLIC名字 名字 EXTRN名字 类型 名字 类型 PUBLIC和EXTRN配对使用 由PUBLIC说明的名字是全局的 可以在其他模块中使用 EXTRN表明本模块中使用的名字在别的模块中定义过 且类型一致 其中 名字可以是标号 变量名 过程名或由EQU 或 伪指令定义的符号名 类型可以是BYTE WORD DWORD NEAR FAR和ABS 常量属性 等 格式 过程名PROC NEAR FAR RET过程名ENDP 4 2 4过程和宏定义伪指令过程和宏是模块化程序设计的基础 汇编语言中常用定义过程和宏的方法来实现按模块管理程序代码的功能 1 过程定义伪指令过程 一段可以由CALL指令调用 用RET返回的程序 当整个源程序由主 子程序构成时 主 子程序都在代码段 且都可用过程来表示 即定义为过程 功能 定义一个过程 并指出过程名及过程的属性 过程定义由伪指令PROC开始 ENDP结束 PROC和ENDP之间为过程的指令序列 程序中可以定义多个过程 程序经汇编 连接及装入内存后 过程名为一具体的内存地址 指示子程序入口 过程的属性有NEAR和FARNEAR过程只能被定义该过程的段中的其他程序调用 段内调用 FAR过程可由任何段中的程序调用 段间调用 缺省时为NEAR 根据过程的属性 汇编程序自动对CALL RET翻译成段内 段间 调用及段内 段间 返回的目标代码 COD1SEGMENTASSUMECS COD1 代码段中的其它语句 主程序 SUB1PROCFAR 名为SUB1的FAR过程开始 RET 返回SUB1ENDP SUB1结束SUB2PROC 名为SUB2的NEAR过程开始 RET 返回 SUB2ENDP SUB2结束 可能定义的其它过程COD1ENDS 代码段结束 例 1 宏定义格式 宏指令名MACRO 形参 形参 指令序列ENDM 宏扩展 汇编时 将相应的程序段中的每条语句前冠以 代替宏指令以产生目标代码 宏调用 在源程序中用宏指令代替所定义的程序段 格式 宏指令名 实参 实参 2 宏定义伪指令为减少重复编写相同语句段的工作 我们可以使用 宏 功能 宏定义是指用一个标识符 宏名 来代替一组指令序列 可同时包含指令性语句和指示性语句 宏功能的使用过程是 宏定义 宏调用 宏展开 例 完成2个压缩BCD数加法的宏定义 DECADDMACROOP1 OP2MOVAL OP1ADDAL OP2DAAMOVOPR1 ALENDM DECADDDL BUFFERDECADDAREA1 AREA2 宏调用 宏定义 加号表示该语句由宏展开得到 DECADDDL BUFFER扩展成 MOVAL DL ADDAL BUFFER DAA MOVDL AL 注 当宏调用中实参数个数和形式参数个数不等时 若实参数个数大于形式参数个数 在替换时多余的实参数不予考虑 若实参数个数小于形式参数个数 则多余的形式参数作为空 字符 或零 数字 处理 宏展开 3 过程与宏的区别对需重复使用的模块既可定义为过程 也可定义为宏 1 宏 由汇编程序识别 并将宏体代码插入 过程 汇编时仅产生CALL指令代码 该代码在程序执行时完成 2 宏可以直接传递参数 但过程传递参数的编程困难 3 汇编成机器代码时 宏扩展增加空间开销 过程调用却能缩短源程序目标代码的长度 无论过程被调用多少次 仅增加CALL RET代码 4 宏体执行时并不增加时间开销 过程调用时 CALL RET指令需保护 恢复现场和断点 增加时间开销 4 2 5结束语句 END伪指令 格式END启动地址作用 指示源程序到此结束 汇编程序对END之后的语句不进行处理 源程序中必须有END结束语句 启动地址可是一个标号或过程名 指示程序的入口 程序装入内存后 系统跳转到入口处 开始执行程序 常用 数值常量2 B 10 D 8 Q 16 H 的整型常量 对16 必须以数字打头 若最高位为字母A F 必须加前缀0 以与H结尾的标识符区别 如 AH abcdH 字符串常量 1234 是用单引号括起来的一个或多个字符 值为字符的ASCII码值 例 A 41H AB 4142H 1234 31H 32H 33H 34H 31323334HMOVAL G 2 Reg操作数 操作数部分是寄存器名 如 AX SI和DS等 4 38086汇编中的运算符 1 常量操作数 在运行期间不变化的量 立即数 端口地址 3 标号和变量都与存储器地址相关联 都具有以下三种属性 段属性 SEGMENT 段基址 标号或变量所在段的段地址 偏移量属性 OFFSET 段内偏移地址 标号或变量所在地址与所在段的段起始地址之差 类型属性 TYPE 对变量 指变量存取单位的字节数大小 有字节 BYTE 字 WORD 双字 DWORD 4字 10字节5种 对标号 指标号与使用它的指令之间的距离远近 如 对转移指令来说 有NEAR标号或FAR标号 3 存贮器操作数 有标号与变量两种 1 标号 在代码段内与指令地址相关联 或某个过程起点位置相关联 2 变量 在数据段或堆栈段内是存放数据的存贮单元的符号地址 与各种存储器操作数寻址方式有关 常以变量名的形式出现在程序中 4 表达式操作数 表达式由各种操作数 运算符和操作符组成 可出现于源程序的任何地方 在汇编时计算 而不是在程序执行过程中 汇编程序对表达式进行运算后 得到一个确定的数值 再把这个数值汇编到指令中 1 有两类表达式根据表达式所表示的内容而分 数值表达式 由常量及算术逻辑运算符 或关系运算符连接而成 在汇编时产生一个数值 地址表达式 由常量 变量 标号 寄存器的内容及一些运算符组成 其值表示存储器地址 有以上三种属性 例 MOVAX 12 4 MOVAX 8 数字表达式LEABX string 4 地址表达式ES SI 4 地址表达式 2 运算符和操作符MASM宏汇编中有三种运算符 算术 逻辑和关系运算符两种操作符 分析和合成操作符运算符 实现对操作数的相关运算 操作符 完成对操作数属性的定义 调用和修改 主要有 1 算术运算符 MOD 2 逻辑运算符 AND OR NOT XOR 3 关系运算符 EQ NE GT GE LT LE 真 FFFFH 假 04 分析操作符 SEG OFFSET TYPE SIZE LENGTH HIGH LOW 5 合成操作符 PTR DS THIS SHORT 数值表达式中可使用所有算术运算符地址表达式仅使用 两种算术运算符常用 标号或变量 常量形式 运算后仍为标号或变量 其3个属性中的类型及段基址属性不变 仅修改了偏移量属性 例 PLACE 2 3 若PLACE与某存贮单元地址相关 则PLACE 2 3仍与某存贮单元相关 算术运算符不影响标志位例 完成80H 90H解 MOVAL 80H 90H 使用数值表达式 AL 10H CF 不变MOVAL 80H 使用加法指令ADDAL 90H AL 10H CF 1 算术运算符 MOD 取余数 MOVAX 6 8 MOVAX 48 作为运算符时 是在程序汇编时由汇编程序计算的 计算结果充当指令的某一个操作数或构成操作数的部分 作为指令助记符时 是在程序运行时被执行 操作对象可以是寄存器或存储器操作数 注 逻辑运算符与逻辑指令助记符形同意不同 逻辑运算符 AND OR XOR和NOT实现操作数按位逻辑操作 只适用于数值表达式 MOVAX 80hOR70h MOVAX 0F0h 关系运算符 EQ NE LT GT LE和GE 在两个无符号操作数之间进行大小关系比较两个操作数必须同是数值或同是一个段内的两个存储器地址 关系不成立 为假 则结果为 0 假 0 若关系成立 为真 则结果为全 1 真 FFFFH 结果值在汇编时获得 例 MOVBX PORTLT5汇编为 MOVBX 0FFFFH 条件成立 或MOVBX 0000H 条件不成立 分析操作符与合成操作符分析操作符 数值返回运算符 运算对象是存储器操作数 它返回变量或标号的属性值 合成操作符 修改属性运算符 作用于存储器操作数时可以改变它们的属性 用分析或合成操作符 可以返回或修改存储器操作数的3种属性 例 ARRAYDB100DUP 0 MOVAX SEGARRAYMOVDS AX 对DS初始化MOVBX OFFSETARRAYMOVAL BX 1 分析操作符 SEG OFFSET TYPE SIZE LENGTH 使用格式 操作符标号或变量 SEG OFFSET 返回标号或变量的段地址和偏移地址 TYPELENGTHSIZETYPE 返回存储器操作数 标号或变量 的类型值 LENGTH 返回变量用DUP定义的重复次数 SIZE 返回TYPE和LENGTH的乘积 表示为变量所分配的字节存储单元总数 例 BUFFER1DB100DUP 0 BUFFER2DW200DUP 20H BUFFER3DD100DUP 13 则LENGTHBUFFER1 100LENGTHBUFFER2 200LENGTHBUFFER3 100 注 用LENGTH返回的存储区必须用DUP来定义 否则返回1 使用格式 类型PTR标号或变量 例 ARRAY1DB0 1 2 3 4ARRAY2DW0 1 2 3 4MOVBX WORDPTRARRAY1 3 MOVCL BYTEPTRARRAY2 6 MOVWORDPTR SI 4 配合EQU伪指令 还可以为原变量定义新的变量名 如 ARRAY1DB0 1 2 3 4ARRAY2DW0 1 2 3 4WBYTEEQUWORDPTRARRAY1BWORDEQUBYTEPTRARRAT2MOVBX WBYTE 3 MOVCL BWORD 6 例 ABCDW A1EQUBYTEPTRABC A1是ABC的第一个字节A2EQUBYTEPTRABC 1或A2EQUA1 1MOVAL A1MOVAH A2 例 可以如下处置 MOVAX WORDPTROPER1 1 AX 3402HMOVAL BYTEPTROPER2 AL 34HMOVAL BYTEPTROPER2 1 AL 12H THIS 与EQU配合使用 具有LABLE的同样作用 使用格式 标号或变量名EQUTHIS类型例 BWORDEQUTHISBYTE 定义字节ARRAYDW100DUP 定义字将原定义的字缓冲区ARRAY按字节区BWORD使用 LABLE 为当前存储单元定义一个指定类型的标号或变量 常用于定义一个数据块或标号 使它们具有多重名字和属性 使用格式 标号或变量名LABLE类型 例 WBYTELABLEWORD 为变量WBYTE定义 一个字类型的数据区ARRAYDB1 2 3 4MOVAL ARRAY 01H ALMOVAX WBYTE 0201H AXWBYTE ARRAY指向同一个数据区 但有不同的类型属性 DATASEGMENT 定义数据段D1DB5DUP 连续的字节单元CCEQU D1 对单元计数SUMDW0 为结果保留一个字DATAENDS 数据段定义结束STACKSEGMENTPARASTACK STACK 定义堆栈段DB100DUP 100字节的栈空间STACKENDS 堆栈段定义结束CODESEGMENT 定义代码段ASSUMEDS DATA SS STACK CS CODE 对各段进行说明BEGIN MOVAX DATA DS初始化为DATAMOVDS AXLEASI D1 预置源数据的指针 例多个连续字节单元的累加 MOVCX CC 预置次数LODSBYTEPTR SI 取一个数并修改指针MOVAH 0 清AX的高字节CLC 清CF位AGAN ADCSUM AX 累加LODSBYTEPTR SI 再取数并修改指针LOOPAGAN 控制循环MOVAH 4CH 完成 返回DOSINT21HCODEENDS 代码段结束ENDBEGIN 整个程序结束 4 4汇编语言程序设计 介绍汇编语言程序设计的常用结构与方法 与大多数高级语言相同的是 汇编语言是结构化的语言 一个大的汇编源程序可由多个 模块 组成 而每个模块则由一个或多个 段 构成 与高级语言不同 使用汇编语言编程时需同时使用指令和伪指令 汇编源程序的基本结构形式模块和段一个汇编 模块 可以包含一个或几个长度小于64KB的 段 8086只有4个段寄存器 CS DS SS和ES CS 程序段DS 数据段SS 堆栈段ES 附加段 可选 特点程序分段语句由指令性和指示性语句组成两种程序框架 框架一 DATASEGMENT 定义数据段VAL1DB12H 8EH 定义变量 DATAENDS 数据段结束CODESEGMENT 定义代码段ASSUMEDS DATA CS CODE 段属性说明START MOVAX DATA 初始化DSMOVDS AX 填写代码MOVAX 4C00H 返回DOSINT21HCODEENDS 代码段结束ENDSTART 源程序结束 框架二 DATASEGMENT 定义数据段VAL1DB12H 8EH 定义变量 DATAENDS 数据段结束CODESEGMENT 定义代码段MAINPROCFARASSUMEDS DATA CS CODE 段属性说明START PUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AX 填写代码RETMAINENDPCODEENDS 代码段结束ENDSTART 源程序结束 4 4 1汇编语言程序设计基本步骤 1 分析问题并抽象出数学模型 2 确定最佳算法 3 画出程序结构框图和流程图 4 合理分配内存工作单元和寄存器 并了解I O接口地址 5 编程并调试 有时需要用注释行说明程序 便于阅读和修改 评价程序质量的标准1 合理组织数据 发挥存贮器 Reg的作用 2 程序逻辑结构好 便于二次开发 3 可读性强 4 高可靠性和可维护性 5 效率高 代码少 4 4 2程序的基本结构 一 顺序结构 对应简单程序 顺序执行 无转移 无循环 指令指针IP值线性增加 二 分支结构 依据不同条件分支到各程序段 有双分支和多分支两种 IP值受标志位的影响而跳变 三种基本结构奠定了实现任何复杂程序的基础 三 循环结构 实现那些需要重复做的工作 IP值因计数器CX中的值不为零而循环 循环结构 1 顺序结构程序设计 按事件发展的先后 选择合适的指令有序地加以组合 DATASEGMENTBLOCKDW0ABCDHBUFFDD DATDENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVDX BLOCKMOVAX DXANDAX 0F0FHANDDX 0F0F0HMOVCL 4SHRDX CLLEABX BUFMOV BX 0 ALMOV BX 1 DLMOV BX 2 AHMOV BX 3 DHMOVAX 4C00HINT21HCODEENDSENDSTART 例 编程计算表达式Z X2 Y 5的值 其中X Y为带符号字节整数 Z为带符号字整数 PUSHDSSUBAX AXPUSHAXMOVAX DATMOVDS AX MOVAL XIMULALMOVBX AX MOVAL YCBWMOVCL 5IDIVCLCBW SUBBX AXMOVZ BX RET 例 将某段中的字符串 Hello 传送到另一段中 内存数据块的传送 利用变量定义字符串和缓冲区 思考题 压缩BCD码分解为非压缩BCD码 aaSEGMENT 数据段1xxDB Hello 定义源串aaENDSbbSEGMENT 数据段2yyDB6dup 定义目的缓冲区bbENDSccSEGMENT 代码段ASSUMECS cc DS aa ES bb 指示指令中标号 变量所在段start CLD 设置传送方向MOVAX aa DS SI 源串首地址MOVDS AXLEASI xxMOVAX SEGyy ES DI 目的首地址MOVES AXMOVDI OFFSETyyMOVCX 6 CX 串的长度REPMOVSB 串传送MOVAH 4CH 调用4CH系统功能 返回DOSINT21HccENDSENDstart 指示程序结束和程序入口 2 分支结构程序设计 设计分支程序的关键 如何判断分支的条件 如何实现分支结构 1 利用比较和转移指令实现分支方法 在需要分支的地方用比较指令CMP 串比较指令CMPS或串搜索指令SCAS等 进行分支条件的比较判断 再利用各种条件转移指令实现分支 例1 编程实现下列函数的功能 其中X Y为无符号字节数 流程图 AL BL PUSHDSSUBAX AXPUSHAXMOVAX DATMOVDS AX CMPAL BLJEC1JAC2 EXT MOVZ ALRET MOVAL XMOVBL Y C1 MOVAL 0JMPEXT C2 MOVAL 1JMPEXT MOVAL 1 2 利用跳转表实现分支 多用于多路分支 根据表内地址分支 将需要分支的各子程序入口地址按照一定的顺序存放在内存区域中 在主程序中根据一定的算法计算出某子程序地址在跳转表中的位置 从而得到相应子程序的入口地址 然后用JMP指令转去执行 若是段内分支 每个地址在表内占2个单元 IP的值 若是段间分支 每个地址占4个单元 CS IP的值 例 设有8种产品的产品编号分别为0 1 2 7 各产品的加工子程序名分别为SBR0 SBR1 SBR7 试编写由已知编号转至相应加工子程序处理的程序 子程序入口地址的地址 表基地址 BASE 偏移量 产品编号 2 JMPBASE 产品编号 2 EA BASE 产品编号 2 EA 各子程序入口地址 DATASEGMENTBASEDWSBR0 SBR1 SBR2 SBR3 SBR4 DWSBR5 SBR6 SBR7 定义跳转表BNDB BN中存放某一产品编号DATAENDSSTACKSEGMENTPARASTACK STACK DB100DUP 0 STACKENDSCODESEGMENTASSUMECS CODE DS DATASTARTPROCFARPUSHDSMOVAX 0PUSHAX 3 循环结构程序设计 循环程序是在满足某些条件时对一段程序的重复执行 一般由四部分组成 基本结构形式 1 先执行后判断 do while 至少进入一次循环体 常用于循环次数已知时 2 先判断后执行循环体可一次都不执行 常用于循环次数未知 根据具体情况找出控制循环体结束的条件时常用 1 先执行后判断 do while DATASEGMENTBUFDB 1 3 5 6 9 定义若干字节带符号数CUNTEQU BUF 计算数据块长度RESULTDW 定义存放结果单元DATAENDS对应的代码段程序 MOVBX OFFSETBUF 建立数据指针MOVCX CUNT 设置循环次数MOVDX 0 置结果初值LP1 MOVAL BX 取数据ADDAL 0JNSPLUS 是正数 转去PLUSINCDX 是负数 负数个数 1PLUS INCBX 调整数据指针LOOPLP1 CX 1 0 继续循环MOVRESULT DX 存入负数个数 例 2AX寄存器中有一个16位的二进制数 编程统计其中1的个数 结果存放在CX寄存器中 控制循环体的条件是 当AX内容为全0 不必再继续统计 2 先判断后执行循环体可一次都不执行 在循环次数未知 需根据具体情况找出控制循环体结束的条件时常用 程序如下 MOVCX 0 置结果计数器初值LP ANDAX AX AX 0否JZEXIT 是 退出循环SALAX 1 否 AX的最高位移至CF中JNCZERO CF 0 转ZERO继续循环INCCX CF 1 结果计数器加1ZERO JMPLPEXIT 方法二 每位和1 与 不等0则为1 MOVCX 16MOVDX 0001HAA TESTAX DXJZLOP Di 1LOP SHRAX 1LOOPAA 方法三 LOP TESTAX 0FFFFHJZSTOPJNSSHIFT 查SFINCCXSHIFT SHLAX 1JMPLOPSTOP HLT 3 循环控制方法每个循环程序必须选择一个循环控制条件 来控制循环的运行和结束 常用循环控制条件 方法 1 计数控制 循环次数已知 每循环一次加 减1 例1 2 条件控制 循环次数未知 须根据条件控制循环 例2 3 状态控制 根据事先设置或实时检测的状态来控制循环 例3 在BLOCK内存区中有一串字符 试编程统计 之前的字符个数 DATASEGMENTBLOCKDB ANDEPO WR COUNTEQU BLOCKMEMDB0DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVSI OFFSETBLOCKMOVCX COUNTLOOP1 MOVAL SI CMPAL JZDONEINCBYTEPTRMEMINCSILOOPLOOP1DONE MOVAX 4C00HINT21HCODEENDSENDSTART 4 子程序设计 子程序不是一种基本的程序结构 但在程序设计时合理使用子程序是实现模块化程序设计的重要技巧 有两种子程序 重复使用的程序段或具有通用性便于共享的程序段 键盘处理 代码转换 中断处理子程序 中断处理随机产生 对其处理只能采用子程序的形式 与子程序有关的术语 1 子程序嵌套 子程序中调用别的子程序称为嵌套只要堆栈空间允许 嵌套层次不限 3 可重入子程序 能够被中断并可再次被中断程序调用的子程序 子程序设计中的问题1 主程序与子程序的连接主 子程序都存放在代码段 CALL 断点保护 转子程序 RET 断点恢复 若主 子程序在同一代码段 为段内调用 若主 子程序各在不同的代码段 为段间调用 NEAR子程序书写形式 CODESEGMENTASSUME MAINPROCFAR CALLSUB1 RETSUB1PROCNEAR CALLSUB2 RETSUB2PROCNEAR RETSUB2ENDPSUB1ENDPMAINENDPCODEENDS FAR子程序书写形式 CODE1SEGMENTASSUME MAINPROCFAR CALLSUB RETMAINENDPCODE1ENDSCODE2SEGMENTASSUME SUBPROCFAR RETSUBENDPCODE2ENDS CALL指令 段内调用 直接寻址 间接寻址 CALLproc name CALLdisp16 IP入栈 IP IP 偏移量 例 CALLSUB1 寻址方式 格式 操作 注 段内调用 CS不变 CALLr16 m16 IP入栈 IP r16 m16 例 CALLBXCALLWORDPTR BX CALL指令 段间调用 直接寻址 间接寻址 CALLFARproc name CS入栈 IP入栈 CS 过程的段地址 IP 过程的偏移地址 例 CALLSUB1 寻址方式 格式 操作 注 DWORDPTR表明内存操作数属性为双字 用于段间调用 CALLmem32 CS入栈 IP入栈 IP EA 1 EA CS EA 3 EA 2 例 CALLDWORDPTR BX 远过程名 RET指令 段内 RET RETexp IP出栈 IP出栈 SP SP exp 段间 RET RETexp IP出栈 CS出栈 IP出栈 CS出栈 SP SP exp 返回类型 格式 操作 注 返回类型由调用类型定 2 现场的保护与恢复 方法一 PUSHBXPUSHCXCALLPROC 1POPCXPOPBX 常用第二种方法保护和恢复现场 对中断子程序必须用第二种方法 现场 指转向子过程执行时主过程的状态 主要包括当时标志寄存器 段寄存器 通用寄存器及指令指针的内容 为保证主 子过程各自的数据信息和工作状态不会互相干扰 设计程序时应尽量使主 子过程有属于自己的工作空间 用成对的PUSH POP指令保护主程序与子程序中都要用到的Reg及mem 3 主 子程序之间的参数传递入 出口参数 传给子程序的参数及从子程序出来的参数 参数传递通常有3种方法 1 使用约定的寄存器传递 2 使用约定的存储单元 参数表 变量 传递 3 使用堆栈传递 子程序应用举例使用约定的寄存器传递参数 首先考虑如何编制一个子程序 确定算法 在主 子程序中使用相同的寄存器 SUM1PROCNEARCMPCX 0JZEXITMOVAX 0 数组和通过AX回送到主程序AGAIN ADDAL SI ADCAH 0INCSILOOPAGAINEXIT RETSUM1ENDP 子程序名 SUM1 程序功能 求字节数组和 入口参数 SI 数组首址 CX 数组长度 出口参数 AX 数组和 使用寄存器 AX CX SI 例 求数组ARRAY中所有元素之和并存于SUM单元中 SUM1PROCNEARCMPCX 0JZEXITMOVAX 0 数组和通过AX寄存器回送到主程序AGAIN ADDAL SI ADCAH 0INCSILOOPAGAINEXIT RETSUM1ENDPCODEENDSENDSTART请注意子程序与主程序都放在同一个代码段 4 6汇编语言程序设计与上机调试 分类 算术运算 逻辑处理 代码转换 表格的处理 串指令题 数据排序1 算术运算举例 4 6 1实用程序设计举例 例4 4 P103 例4 5 P104 DATASEGMENTX1DWXXXXH XXXXHX2DWXXXXH XXXXHX3DW0000H 0000HDATAENDSSTACKSEGMENTPARASTACKDW20HDUP STACKENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFARSTART PUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AX CLCMOVCX 02HLEASI X1LEADI X2LEABX X3E20 MOVAX SI ADCAX DI MOV BX AXADDSI 2ADDDI 2ADDBX 2LOOPE20RETMAINENDPCODEENDSENDSTART 例 补 多精度数加减 二进制数 低位在前 4 6 1实用程序设计举例 2 逻辑处理举例 例4 6 P103将寄存器AL中高 低4位交换CODESEGMENTASSUMECS CODESTART MOVAL 0ABHMOVCL 4ROLAL CLMOVAX 4C00HINT21HCODEENDSENDSTART 例4 7 P105 3 代码转换举例 例 补 某字符串变量STRING 其STRING和STRING 1单元存放字符串长度 从STRING 2单元起存放字符 试编写程序 将字符串STRING中的所有小写字母改用大写字母符代替 DATASEGMENTSTRINGDW256DB 4dyDtf55DRE43 256个字符DATAENDSCODESEGMENTASSUMECS CODE DS DATAMAINPROCFARSTART PUSHDSMOVAX 0PUSHAXMOVCX STRINGANDCX CXJZEXITMOVSI OFFSETSTRINGINCSI INCSILOOP0 MOVAL SI CMPAL 61HJCNEXTCMPAL 7BHJNCNEXTSUBAL 20HMOV SI ALNEXT INCSILOOPLOOP0EXIT RETMAINENDPCODEENDSENDSTART 例 把16位二进制数转换成十进制的ASCII码串 如 0000010100011100B 1308D 01308 0000010100011100
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 陶粒隔热层施工方案
- 建筑金属斗拱销售方案设计
- 工程地质调查员专业技能考核试卷及答案
- 优化咨询流程方案模板
- 企业人力资源管理师岗位操作规程考核试卷及答案
- 成都工厂管理咨询方案
- 城市防洪气象保障体系报告
- 专业互联网营销活动方案
- 复合型风管施工方案
- 四月营销执行方案策划
- 2025南宁市隆安县辅警考试试卷真题
- 2025年新会计法培训课件
- 《高粱酿造过程中的有害物质控制技术》论文
- 大疆行业解决方案
- 《阿Q正传》【知识精研】(高二选必下册第二单元)
- 小米生态链企业的协同发展与供应链优化
- 2025年大学生信息素养大赛(省赛)考试题库(附答案)
- 2025年度汽车报废回收企业股权转让与资源利用合同
- 劳动合同范本合同模板
- 2025年公务员遴选结构化面试万能修订稿
- 氢气安全知识培训课件
评论
0/150
提交评论