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

下载本文档

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

文档简介

1 主要内容1MASM宏汇编语言结构2MASM汇编语言数据 表达式和运算符3伪指令4程序设计5DOS功能调用6实用程序设计举例 第4章汇编语言程序设计 2 一 MASM汇编语句结构 MASM有两种基本语句 指令语句 Instructionstatements 指令语句又称可执行语句 要求CPU执行某种操作 指令语句的格式为 标号 指令助记符 操作数 注释 标号是该指令的符号地址 表示该指令的第一个字节地址 3 指示语句 pseudeinstructionstatements 指示词句又称伪指令 它不要求CPU执行某种操作 汇编时也不产生对应的机器代码 而仅仅告诉汇编程序 对它后面的指令语句和操作数应该如何产生机器目标代码 伪指令的格式为 名字 伪指令定义符号 操作数 注释 区别 伪指令名字后无冒号 4 二 MASM汇编语言数据 表达式和运算符 常数常数是没有任何属性的纯数值 常数分为两种类型 数值型常数字符串型常数 5 数值型常数1 二进制数 以字母B结尾 如01011101B2 八进制数 以字母Q或O结尾 如723Q 211Q 3 十进制数 以字母D 或省略 结尾 如1995D 3508 4 十六进制数 以字母H结尾 如3A40H 8BH 字符型常数用单引号括起来的字符串 如 ABCD 123456 等 每个字符在机内以ASCII码存放 例如 A 在内存中为41H 6 变量变量用来定义存放在存储器单元中的数据 其三重属性为 段属性 SEG 偏移地址属性 OFFSET 类型属性 TYPE 例 DATASEGMENTFIRSTDB5AHSECONDDW1122HDATAENDS 对变量的操作 LEAAX FIRSTMOVAL FIRSTMOVAX SECOND 变量名 存放数据存储单元的符号地址 7 标号 给指令语句所在地址取的名字 段属性 SEG 偏移地址属性 OFFSET 距离属性 Distance 例 隐含为NEAR 可以用LABEL伪指令修改 LOP MOVAX 0000 JMPLOP 8 表达式MASM允许使用的表达式分为两类 数字表达式数字表达式的结果是一个数字 例 MOVDX 6 A B 2 A B为变量 地址表达式地址表达式的结果是一个存储单元的地址 例 MOVAX ES BX SI 1000H 9 运算符MASM的运算符分为六大类 算数运算符 逻辑运算符 关系运算符 分析运算符 合成运算符 其它运算符 10 11 例 A1EQU1020 3300MOVBX A1 1000MOVAX 35 5MOVDX A1 100MOVCX A1MOD100MOVAL 00001010BSHL4 等效于 A1EQU4320MOVBX 3320MOVAX 175MOVDX 43MOVCX 20MOVAL 10100000B 12 13 14 例2 MOVAX 5EQ101BADDBL 10HGT16等效于 MOVAX 0FFFFHADDBL 00H 例1 MOVAL NOT10101010BMOVAL 11110000BAND10111101B等效于 MOVAL 01010101BMOVAL 10110000B 15 16 MOVAX SEGFIRSTMOVDI OFFSETFIRSTMOVAL TYPEFIRST AL 1字节MOVAL TYPESECOND AL 2字MOVBX SEGLOPMOVSI OFFSETLOPMOVAL LENGTHFIRST AL 1MOVAL SIZESECOND AL 2 例 DATASEGMENTLOP MOVAX 0000FIRSTDB5AH 6BH SECONDDW1122HJMPLOPDATAENDS 17 ES BX DS BLOCK 18 PTR 强制类型转换例 F1DB15HF2DW3132H ALPHA MOVAL BYTEPTRF2 JMPFARPTRALPHA EQUTHIS 指定类型及距离属性例 B GAMAEQUTHISBYTEW GAMADW1234H MOVAL B GAMAMOVAX W GAMA 19 20 21 三 伪指令 指示语言 指示性语句又称伪指令 它没有对应的机器指令 不由CPU执行 而是在汇编程序汇编时识别 用于说明CPU的类型 段结构 源程序起止信息和段内存的安排等 MASM的伪指令可分为变量定义语句 符号定义语句 段定义语句 段分配语句 过程定义语句 群定义语句 结构定义语句 记录定义语句等 22 变量定义语句 变量定义语句用来定义字节 字或双字变量 变量定义语句有两种不同的格式 格式一 变量名 DB DW DD DF DQ DT表达式功能 为变量分配1个字节 字 双字 长字 四字 十字节的存储单元 并赋值 23 1 用数值表达式定义变量 例如 K1DB5AH 将5AH赋给字节变量K1K2DW2354H 将2354H赋给字变量K2K3DD2A004455H 将2A004455H赋给双字变量K3 24 2 用字符串定义变量 例如 ONEDB HOWAREYOU 将 HOWAREYOU 字符串赋给变量ONE TWODW OK 将 OK 字符串赋给变量TWO 25 3 存放结果时 用 定义不确定值的变量ABOVDB 定义变量ABOV为不确定值的字节变量BLOWDW 定义变量BLOW为不确定值的字变量CLERDD 定义变量CLER为不确定值的双字变量 4 用数组表达式定义变量 例如 A1DB00H 11H 22H 33HA2DW3456H 1025H 25 25 1000 3 10A0H例 MOVAL A1 3 AL 33HMOVAX A2 2 AX 1025H 26 格式二格式2用于定义重复变量 其格式为 DBDWDDDFDQDT 变量名 nDUP 表达式 例 TAB1DB10DUP 0 TAB2DW2DUP TAB3DB4DUP 1 2DUP 50H 27 符号定义语句 等值语句 EQU 格式 符号EQU表达式功能 将表达式的值赋给EQU左边的符号 表达式可以是常数 变量 标号 数值或地址表达式 等号语句格式 符号 表达式等号语句 与EQU语句有同样的功能 区别在于等号语句定义的符号允许重新定义 使用更加方便灵活 28 例1 ACOSEQU1250HCOUNTEQU100BUFEQUACOS 1000HMOVCL COUNT 例2 ONE 100COUNT 100A ONES COUNT 100A A 100 29 段定义指令 在汇编程序设计中 需要将存储器分成若干段 80486CPU访问存储器时 凭借段寄存器对各个段进行访问 通常用段定义语句 SEGMENT ENDS 来定义各种类型的逻辑段 30 格式 段名SEGMENT 定位类型 组合类型 字长选择 类别 段体 段名ENDS 一 完整段定义伪指令1 段定义语句 31 段名 自己选定 前后一致定位类型 PAGE 段的首地址后两位为00H 页边界开始PARA 隐含 段的首地址后1位为0H 节边界DWORD 4的倍数WORD 偶地址BYTE 任一字节 32 组合类型 NONE 隐含 与同名段不连接 独立存在 STACK 表明该段为堆栈段 不可缺省 AT表达式 表示本段可定义在表达式指示的节边界上 例 MCODESEGMENTAT2050H则该段的首地址为20500H 字长选择 USE16 段字长为16位 最大段长为64KBUSE32 段字长为32位 最大段长为4GB 分类名 用单引号括起 分类名相同的逻辑段存放在连续存储空间 33 2 段分配语句 ASSUME 段分配语句用来完成段的分配 说明当前哪些逻辑段被分别定义为代码段 数据段 堆栈段和附加段 格式 ASSUME段寄存器 段名 段寄存器 段名 功能 说明源程序中定义的段由哪个段寄存器去寻址 段寄存器可以是CS SS DS ES FS或GS 3 段寄存器的装入ASSUME语句只建立当段和段寄存器之间的联系 但ASSUME语句不能将各段的段基值装入各个段寄存器 段基址的装入是用程序的办法 34 DS ES FS和GS的装入DS ES FS和GS不能用立即数寻址方式直接装入 段基值需先送入通用寄存器 再传送给段寄存器 SS及SP的装入 在段定义伪指令中 选用 STACK 参数项 在ASSUME语句中 把堆栈段分配给SS 则SS和SP自动装入 如未使用 STACK 参数项 则用程序实现SS和SP的装入 例 MOVAX DATAMOVDS AX CS的装入 由起始标号确定CS和IP 35 例 STACK2SEGMENTDW40DUP BOTTOMLABELWORD 堆栈底的位置STACK2ENDSCODESEGMENTASSUMECS CODE SS STACK2START MOVAX STACK2MOVSS AXMOVSP OFFSETBOTTOM CODEENDSENDSTART 36 例 DATASEGMENTBCDBUFDB22HDATAENDSEXTRASEGMENTBUFFDB20DUP 00H EXTRAENDSSTACKSEGMENTSTACKSBUFFDB200DUP STACKENDSCODESEGMENTASSUMECS CODE DS DATA ES EXTRA SS STACKSTART MOVAX DATAMOVDS AXMOVAX EXTRAMOVES AXCODEENDSENDSTART 37 二 简化段定义伪指令1 段次序语句 DOSSEG 格式 DOSSEG功能 各段在内存的顺序按DOS段次序预定排列 2 内存模式语句 MODEL 格式 MODEL模式类型 高级语言 功能 指定数据和代码允许使用的长度 说明 高级语言 是可选项 可用C BASIC FORTRAN 38 简化段定义DOSSEGMODELSMALL486 支持32位寄存器操作 STACKDB200HDATABCDBUFDB12HCODESTART ENDSTART 39 过程定义伪指令 PROC ENDP 在程序设计中 常把具有一定功能的程序段设计成一个子程序 又称为过程 过程定义伪指令的格式如下 过程名PROC NEAR FAR RET 过程名ENDP 40 其他伪指令1 LABEL伪指令 用于给已定义的变量起一个别名 名称LABLE类型 距离 2 1 定位伪指令定位伪指令的格式是 ORG表达式 2 当前位置计数器在汇编程序时 用 表示当前的偏移地址值 DATASEGMENTSTDB ABCDEFGH COUNTEQU STDATAENDS 3 END伪指令 41 汇编语言的上机过程 用MASM进行汇编 上机步骤如下 用编辑程序 EDIT COM 形成汇编语言源程序 asm文件 用汇编程序 MASM EXE 对源程序进行汇编 形成目标文件 obj文件 用连接程序 LINK EXE 把目标文件转换成可执行文件 exe 42 上机步骤如下 一 建立扩展名为 asm的源文件程序 可用任何文本编辑器编辑源文件均可 如记事本 WORD WPS等 通常用DOS自带的EDIT编辑文件 二 用汇编程序MASM或TASM产生目标文件 MASM是支持宏指令的宏汇编程序 Microsoft公司 TASM也是支持宏指令的汇编程序 Borland公司 汇编程序的汇编对象是 asm文件 43 汇编的结果产生的文件 obj文件 默认与源文件同名的二进制目标文件 lst文件 列表文件 此文件包括源程序和机器语言程序清单 以及使用的标号和变量的列表 方便查错 默认不建立 44 如果源程序有错 汇编会报告是哪类错误 有多少错 其中 warningerrors 为警告错误 是一般性错误 不影响 obj文件的生成 若存在严重错误 severeerrors 则影响目标文件的生成 需要返回到编辑环境对源程序进行修改 直到没有错为止 MASM的完整格式为 E MASM option source object listing xref 主要Option参数 l c zi 45 例 E MASMTEST只生成TEST OBJ文件E MASMTEST L ZI生成TEST OBJ和TEST LST文件 含调试信息 三 用LINK和TLINK程序产生 EXE文件 因为 obj文件还不是可执行文件 需要经过LINK TLINK程序处理后 才能得到可执行文件即 exe文件 格式为 LINKobjectfiles exefile mapfile libfiles 46 LINK有两个输出文件 exe文件和 map文件其中 map文件是连接映像文件 它给出每个段在存储器中的分配情况 四 程序的执行 在DOS提示符下 直接敲入文件名 一般情况下 执行结果不可见 要用DUBUG来查看 由于汇编程序只能查出语法错误 对于程序的逻辑错误 如 算法 语句的多 少 转移是否正确等 都不能查出 因此汇编语言的正确性 通常需要通过DEBUG或TD调试程序来检验 47 YES 上机过程图 48 加快汇编过程的方法MASM 一次输入即可得到与源文件程序名相同的 obj lst和 crf文件 MASM 源文件名 一次输入可得到与与源文件程序名相同的 obj和 lst文件 MASM 源文件名 只生成同名的 obj文件 49 连接也有类似情况 LINK 目标文件名 一次输入可得到同名的 exe和 map文件LINK 目标文件名 只生成同名的 exe文件TD EXE进入TD调试程序 50 DEBUG程序调试 标志位设置 清除 RF 溢出标志ov nv方向标志dn 减 up 增 中断允许ei 启用 di 禁用 符号标志ng 负 pl 正 零标志zr nz辅助进位ac na奇偶校验pe 偶校验 po 奇校验 进位标志cy nc 51 四 程序设计概述 与高级语言程序设计类似 在用汇编语言进行程序设计时 同样应按以下步骤进行 1 分析问题 建立数学模型2 确定算法3 编制程序流程图4 编制程序5 调试程序 52 一个源程序的基本格式如下 DATASEGMENT DATAENDSEXTRASEGEMNT EXTRAENDSSTACK1SEGMENTPARASTACK STACK1ENDSCODESEGMENTASSUMECS CODE DS DATAASSUMESS STACK1 ES EXTRA 存放数据项的数据段 存放数据项的附加段 堆栈段 53 START MOVAX DATAMOVDS AXMOVAX EXTRAMOVES AXMOVAH 4CHINT21HCODEENDSENDSTART 核心程序段 DD装入段基址 ES装入段基址 系统功能调用 返回操作系统 54 一 顺序结构程序 例1编制程序 求下列公式中的Z值 并将结果存放到RESULT单元中 Z X Y 8 X 2 设X Y的值分别存放在VARX VARY单元中 运算结果不超过16位 解 1 存储单元RESULT用来存放结果 VARX和VARY放X Y的值 寄存器DX放中间运算结果 左移1位相当于乘2 右移1位相当于除2 所以可以用左移3位得到乘以8的结果 55 开始 预置段寄存器 DXX DXX Y DX右移得 X Y 8 X 2 RESULTDX DX左移3次 X Y 8 DX DX X 2 程序流程图和程序如下 56 DATASEGMENTVARXDW0006HVARYDW0007HRESULDW DATAENDSSACK1SEGMENTPARASTACKDW100HDUP SACK1ENDSCOSEGSEGMENTASSUMECS COSEG DS DATA 57 START MOVAX DATAMOVDS AX MOVDX VARX DX XADDDX VARY DX X YMOVCL 3SALDX CL DX X Y 8SUBDX VARX DX X Y 8 XSARDX 1 DX X Y 8 X 2MOVRESULT DX MOVAH 4CH 系统功能调用 返回操作系统INT21HCOSEGENDSENDSTART 58 二 分支程序 条件转移 Jcc目标 用于程序需要进行分别处理的情况 主要使用转移指令 转移指令分为无条件转移指令和条件转移指令 无条件转移指令 JMP目标 在进行分支程序设计时 通常用比较 测试 或算术运算 逻辑运算影响标志位 然后选择转移指令 59 例1 符号函数 y 1x 0 0 x 0 1x 0 其中x为8位有符号数 解 60 开始 预置段R AL X AL 0 AL 0 AL 1 AL 0 AL 1 N Y N Y Y AL 结束 61 DATASEGMENTXXDBxYYDB DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX MOVAH 4CHINT21HCODEENDSENDSTART 62 MOVAL XXCMPAL 0 x 0建标志位JGEBIGR x 0转移MOVAL 1 x0转移MOVAL 0 x 0JMPJUS2JUS1 MOVAL 1 x 0JUS2 MOVYY AL 63 三 循环程序 一个循环程序通常由以下四部分组成 初始化部分循环体修改部分控制部分 按结构又分为先判断后执行和先执行后判断 循环程序常用指令 LOOP LOOPE LOOPNE JCXZ 64 例1 计算Y 解 定义数组名TABL存放a1 a20 和存放于单元YY中 中间结果存于寄存器AX中 BX寄存器为地址指针 CX寄存器作计数器 设a1 a2 a20是一组无符号十六位二进制数 并设其和不大于2个字节 程序演示e4 2 asm 65 DATASEGMENTTABLDW20DUP 2 YYDW DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX MOVAH 4CHINT21HCODEENDSENDSTART 66 MOVAX 0MOVBX OFFSETTABLMOVCX 20LOP ADDAX BX INCBXINCBXDECCXJNZLOPMOVYY AX 循环体 控制部分 67 68 例2 编程统计数据块中正数的个数 并将其送RS单元中 程序演示count asm 解 数据块定义为D1 RS单元存放正数的个数 数据块长度用COUNT表示 BX作地址指针 CX作计数器 DX记录正数的个数 69 70 DATASEGMENTD1DB 1 3 5 7 9 6 8 4COUNTEQU D1RSDW DATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX MOVAH 4CHINT21HCODEENDSENDSTART 补码表示 FFH 表示当前偏移地址 71 MOVRS DX JUSTI INCBXDECCXJNZLOP1 MOVBX OFFSETD1MOVCX COUNTMOVDX 0LOP1 MOVAL BX CMPAL 0JLEJUSTIINCDX 如果求数据块中大于0的数之和 结果送RS单元 试修改程序 控制部分 72 73 例3 AX寄存器中有一个16位的二进制数 编程统计其中值为1的位的个数 并将结果存于CX中 ppt e4 3 asm 解 由于AX有可能为0 若AX 0则不必再往下作统计工作 因此可采用先判断 后执行结构 流程图如右 74 75 CODESEGMENTASSUMECS CODESTART NOP MOVAX 1100101000111101BXORCX CXAGAIN CMPAX 0 建立标志位JZNEXTSHLAX 1JNCAGAIN 判断CFINCCXJMPAGAINNEXT NOP MOVAH 4CHINT21HCODEENDSENDSTART TESTAX 0FFFFH ANDAX AX 76 B 循环控制方式 1 计数控制用于计数次数已知的情况 可采用正计数或倒计数法 如例1 2 条件控制当计数次数无法确定 但循环次数与某些条件有关 并且条件可检测时 可采用条件控制 例如检测 比较或判断等形式 77 例4 在一串字符串中查找某一关键字 若查到 记下存放该关键字单元的偏移地址 若找不到用 1作标记 解 设串变量名STRING 关键字单元CHAR 关键字单元的偏移地址放FLAG单元 寄存器SI为字符串的地址指针 CX为字符串长度 AL用于放关键字 78 还可用字符串指令实现 79 开始 循环控制条件 循环体 结束 循环控制条件 循环体 80 程序设计过程中常常把多次引用的相同程序段编成一个独立的程序段 当需要只执行这个程序段时 可以用调用指令调用它 具有这种功能的程序段称为过程或子程序 A 子程序的设计方法1 适合编成子程序的程序有以下两大类 1 程序需要反复使用 这类程序编成子程序可避免重复编写程序 并节省大量存储空间 2 程序具有通用性 这类程序大家都要用到 如键盘管理程序 磁盘读写程序 标准函数程序等 编成子程序后便于用户共享 四 子程序 81 2 编写子程序文件为了使用户使用方便 子程序应当以文件形式编写 一般包含两部分 1 子程序说明部分 子程序DTOB 将两位十进制数 BCD码 转换成二进制数 寄存器BX传递参数 入口参数 AL寄存器存放十进制数 出口参数 CL寄存器存放转换后的二进制数 执行时间0 06ms 82 2 子程序程序部分 子程序用过程定义伪指令 PROC ENDP 定义 编写格式如下 子程序名PROC NEAR FAR RET 子程序名ENDP NEAR 当子程序和调用程序在同一代码段 FAR 当子程序和调用程序不在同一代码段 清0子程序DATASEGMENTBUFDB20HDUP DATAENDSCODESEGMENTASSUMECS CODE DS DATASUPROCFARPUSHDSMOVAX 0PUSHAXMOVAX DATAMOVDS AX RETSUENDPCODEENDSENDSU MOVBX OFFSETBUFLP MOV BX 0INCBXCMPBX 20HJNZLP 84 2 调用子程序时寄存器及所用存储单元内容的保护 如果子程序中要用到某些寄存器或存储单元时 为了不破坏原有的信息 要将寄存器或存储单元的原有内容压栈保护或存入子程序不用的寄存器或存储单元中 B 子程序使用中的问题1 子程序的调用和返回主程序调用子程序是通过CALL指令来实现 子程序执行后 通过RET指令返回主程序 3 子程序调用时参数的传递方法 1 用寄存器传递 2 用堆栈传送 3 用存储单元传送 85 五 DOS功能调用 为程序员编写汇编语言源程序时提供方便 MS DOS系统中设置了几十个内部子程序 可供用户调用 调用时需要使用软中断指令 INTn其中DOS功能子程序的调用使用中断指令 INT21H 它共有80多个功能子程序 可完成磁盘读写控制 文件管理 存储管理 基本输入 输出管理等功能 调用功能子程序时需要用以下方式 1 传送入口参数到指定寄存器中 2 调用的功能号送入AH寄存器 3 INT21H 86 键盘输入字符串 0A号功能 格式 MOVDX 缓冲区偏移量MOVAH 0AHINT21H BUFDB30HDB DB30HDUP MOVDX OFFSETBUFMOVAH 0AHINT21H 带显示的键盘输入单字符 1号功能 格式 MOVAH 01HINT21H AL 输入字符的ASCII码 不带显示的键盘输入单字符 8号功能 格式 MOVAH 08HINT21H AL 输入字符的ASCII码 87 直接输入 输出单字符 6号功能 格式 MOVDL 输入输出标志MOVAH 06H DL 0FFH 键盘输入INT21H否则 DL内容输出 CHARDB BB DB0DHDB0AHLEADX CHARMOVAH 09HINT21H 回车 0DH 换行 0AH 单字符显示 2号功能 格式 MOVDL 字符 MOVAH 02HINT21H 字符串输出 9号功能 格式 MOVDX 字符串偏移量MOVAH 09HINT21H 88 返回操作系统 4CH号功能 格式 MOVAH 4CHINT21H 演示doscall asm程序 89 六 实用程序设计举例 例4 3 用变址寻址实现多个16位数加法 E4 3 ASM DATASEGMENTTABLEDW1234H 5678H 0EAFBH 10个数LSBADW HSBADW DATAENDSSTACK1SEGMENTPARASTACKDB6

温馨提示

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

最新文档

评论

0/150

提交评论