电子科技大学汇编课件第4章.ppt_第1页
电子科技大学汇编课件第4章.ppt_第2页
电子科技大学汇编课件第4章.ppt_第3页
电子科技大学汇编课件第4章.ppt_第4页
电子科技大学汇编课件第4章.ppt_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

1 第4章汇编语言程序设计 2 主要内容 汇编语言源程序的结构汇编语言语句格式伪指令功能调用汇编语言程序设计 3 4 1汇编语言源程序 了解 汇编语言源程序的结构汇编语言语句类型及格式 4 一 汇编语言源程序结构 5 1 汇编语言源程序与汇编程序 汇编语言源程序汇编程序 用助记符编写 汇编程序 汇编语言源程序 机器语言目标程序 源程序的编译程序 6 2 汇编语言程序设计与执行过程 输入汇编语言源程序 EDIT 汇编 MASM 链接 LINK 调试 TD 源文件 ASM 目标文件 OBJ 可执行文件 EXE 最终程序 7 二 汇编语言语句类型及格式 8 1 汇编语言语句类型 指令性语句指示性语句 CPU执行的语句 能够生成目标代码 CPU不执行 而由汇编程序执行的语句 不生成目标代码 9 2 汇编语言语句格式 指令性语句 标号 前缀 助记符 操作数 操作数 注释 指令的符号地址标号后要有冒号 操作码 注释前加分号 10 指示性语句格式 名字 伪指令助记符操作数 操作数 注释 变量的符号地址其后不加冒号 指示性语句中至少有一个操作数 11 3 标号 名字 标号后有冒号 在指令性语句前 名字后不加冒号 在指示性语句前 英文字母 数字及专用字符组成 最大长度不能超过31个 且不能由数字打头 不能用保留字 如寄存器名 指令助记符 伪指令 12 4 操作数 寄存器存储器单元常量变量或标号表达式 13 常量 数字常量字符串常量例 A MOVAL A 例 ABCD 汇编时被译成对应的ASCII码41H 42H 43H 44H 用单引号引起的字符或字符串 14 变量 代表内存中的数据区 程序中视为存储器操作数变量的属性 变量所在段的段地址变量单元地址与段首地址之间的位移量 字节型 字型和双字型 段值 偏移量 类型 15 表达式 算术运算逻辑运算 关系运算取值运算和属性运算其它运算 16 算术运算和逻辑运算符 算术运算符 MOD逻辑运算符AND OR NOT XOR例 MOVAL 8AND4MOVAL 8 4 1 17 取值运算符 取得其后变量或标号的偏移地址取得其后变量或标号的段地址 TYPE取变量的类型LENGTH取所定义存储区的长度SIZE取所定义存储区的字节数 用于分析存储器操作数的属性获取变量的属性值 OFFSET SEG 18 取值运算符例 MOVAX SEGDATAMOVDS AXMOVBX OFFSETDATALEABX DATA 等价于 19 取值运算符例 若BUFFER存储区用如下伪指令定义 BUFFERDW200DUP 0 则 TYPEBUFFER等于2LENGTHBUFFER等于200SIZEBUFFER等于400 20 属性运算符 用于指定其后存储器操作数的类型运算符 PTR例 MOVBYTRPTR BX 12H 21 其它运算符 方括号 段重设符段寄存器名 方括号中内容为操作数的偏移地址 用于修改默认的段基地址 22 4 2伪指令 掌握 伪指令的格式及实现的操作伪指令的应用 23 伪指令 由汇编程序执行的 指令系统 作用 定义变量 分配存储区定义逻辑段 指示程序开始和结束 定义过程等 24 常用伪指令 数据定义伪指令符号定义伪指令段定义伪指令结束伪指令过程定义伪指令宏命令伪指令 25 一 数据定义伪指令 用于定义数据区中变量的类型及大小格式 变量名 伪指令助记符操作数 注释 符号地址 定义变量类型 定义变量值及区域大小 26 1 数据定义伪指令助记符 DB定义的变量为字节型DW定义的变量为字类型 双字节 DD定义的变量为双字型 4字节 DQ定义的变量为4字型 8字节 DT定义的变量为10字节型 27 数据定义伪指令例 DATA1DB11H 22H 33H 44HDATA2DW11H 22H 3344HDATA3DD11H 2 22H 33445566H 以上变量在内存中的存放形式 28 数据定义伪指令例 变量在内存中的分布 29 数据定义伪指令的几点说明 伪指令的性质决定所定义变量的类型 定义字符串必须用DB伪指令例 DATA1DB ABCD 66H A B C D 41H 42H 43H 44H 66H 30 2 重复操作符 作用 为一个数据区的各单元设置相同的初值目的 常用于声明一个数据区格式 变量名 伪指令助记符nDUP 初值 例 BW20DUP 0 M1DB10DUP 5 20个初值为0的字单元 10个初值为5的字节单元 31 3 的作用 表示随机值 用于预留存储空间MEM1DB34H A DW20DUP 预留40个字节单元 每单元初值为随机值 随机数占1个字节单元 32 数据定义伪指令例 M1DB Howareyou M2DW3DUP 11H 3344HDB4DUP M3DB3DUP 22H 11H 33 数据定义伪指令例 M1 H o w a M2 11H 11H 00H 44H 33H r e y o u 11H 00H 00H 随机数 M3 11H 22H 11H 22H 11H 22H XX XX XX XX XX XX XX 34 二 符号定义伪指令 格式 符号名EQU表达式操作 用符号名取代后边的表达式 不可重新定义例 CONSTANTEQU100VAREQU30H 99H EQU说明的表达式不占用内存空间 35 三 段定义伪指令 说明逻辑段的起始和结束 说明不同程序模块中同类逻辑段之间的联系形态 36 段定义伪指令格式 段名SEGMENT 定位类型 组合类型 类别 段名ENDS 说明逻辑段的起点 说明不同模块中同名段的组和连接方式 37 定位类型 PARA 段的起点从节边界开始 16个字节为1节 BYTE 段的起点从存储器任何地址开始WORD 段的起点从偶地址开始PAGE 段的起点从页边界开始 256个字节为1页 38 组合类型 与其它模块中的同名段在满足定位类型的前提下具有的组合方式 NONE 不组合PUBLIC 依次连接 顺序由LINK程序确定 COMMON 覆盖连接STACK 堆栈段的依次连接AT表达式 段定义在表达式值为段基的节边界MEMORY 相应段在同名段的最高地址处 39 类别 不同模块连接时将相同类别的段放在连续的内存区域中 40 段定义伪指令例 DATASEGMENTMEM1DB11H 22HMEM2DB Hello MEM3DW2DUP DATAENDS 变量在逻辑段中的位置就代表了它的偏移地址 表示变量所在逻辑段的段地址 表示变量的类型 41 四 设定段寄存器伪指令 说明所定义逻辑段的性质格式 ASSUME段寄存器名 段名 段寄存器名 段名 42 五 结束伪指令 表示源程序结束格式 END 标号 实际编程中必有 该处标号须与程序第1条指令前的标号一致 43 汇编语言源程序结构 数据段名SEGMENT 数据段名ENDS附加段名SEGMENT 附加段名ENDS 堆栈段名SEGMENT 堆栈段名ENDS代码段名SEGMENT 代码段名ENDSEND 44 一个完整源程序结构例 DSEGSEGMENTDATA1DB1 2 3DUP DATA2DW1234HDSEGENDSESEGSEGMENTDB20DUP ESEGENDSSSEGSEGMENTSTACK STACK DB200DUP SSEGENDS 表示该逻辑段的段地址 此处还不能确定逻辑段的性质 45 一个完整源程序结构例 CSEGSEGMENTASSUMECS CSEG DS DSEG ES ESEG SS SSEGSTART MOVAX DSEGMOVDS AXMOVAX ESEGMOVES AXMOVAX SSEGMOVSS AX CSEGENDSENDSTART 源程序代码 段寄存器初始化 将段地址送相应的段寄存器 说明各逻辑段的性质 46 例 DATASEGMENTTABLEDW3400H 5600H 2300H 4500H 2300H 1200H 2344H 3500HDATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVBX OFFSETTABLEMOVSI 6A JMPDWORDPTR BX SI 2 画出TABLE在内存中的存放情况程序执行完标号为A的指令后 CS IP 47 程序3 续 MOVBX OFFSETTABLEMOVSI 06HA JMPDWORDPTR BX SI 2 程序执行完标号为A的指令后 CS IP 48 六 过程定义伪指令 用于定义一个过程体格式 过程名PROC NEAR FAR RET过程名ENDP P157例 过程的入口地址 过程定义及调用例 定义延时子程序DELAYPROCPUSHBXPUSHCXMOVBL 2NEXT MOVCX 4167W10M LOOPW10MDECBLJNZNEXTPOPCXPOPBXRETDELAYENDP 49 调用延时子程序 CALLDELAY 50 七 宏命令伪指令 源程序中由汇编程序识别的具有独立功能的一段程序代码格式 宏命令名MACRO ENDM 宏体 宏 八 其它伪指令 段内程序代码或变量的起始偏移地址格式 ORG表达式例 DATASEGMENTORG200M1DB12H 4DUP 0 M2DW1234HDATAENDS 计算值为非负常数 ORG M1 0 0 34 12 12 0 0 M2 200 205 52 4 3功能调用 BIOS驻留在ROM中的基本输入 输出系统加电自检 装入引导 主要I O设备处理程序及接口控制BIOS功能调用使程序员不必了解硬件操作的细节而实现相应的操作 DOS磁盘操作系统相比BIOS 对硬件的依赖性小DOS功能与BIOS功能均通过中断方式调用 DOS中断与BIOS中断 DOS中断包括 设备管理 目录管理 文件管理 其它在某些情况下 同样的功能既可选择DOS中断 也可选择BIOS中断 53 DOS调用和BIOS调用的基本步骤 将调用参数装入指定的寄存器 将功能号装入AH 按中断类型号调用DOS或BIOS中断 检查返回参数是否正确 54 55 一 DOS功能调用 说明 DOS中断是包含多个子功能的功能包 各子功能用功能号区分 用软中断指令调用 中断类型码固定为21H 调用格式 MOVAH 功能号INT21H 56 1 单字符输入 调用方法 MOVAH 01INT21H输入的字符在AL中 57 单字符输入例 GET KEY MOVAH 1INT21HCMPAL Y JZYESCMPAL N JZNOJMPGET KEYYES NO 交互式应答程序 58 2 字符串输入 注意问题 调用格式字符输入缓冲区的定义 59 调用格式 功能号OAH字符串在内存中的存放地址INT21H AH DS DX 60 定义字符缓冲区 用户自定义缓冲区格式 0DH N1 N2 整个缓冲区 最大可键入字符数 实际键入字符数 存放键入的字符 存放字符个数 255 61 输入字符串程序段 DAT1DB20 20DUP LEADX DAT1MOVAH 0AHINT21H 在数据段中定义 62 输入缓冲区 14H 20个字节 定义后的输入缓冲区初始状态 63 3 单字符显示输出 功能号O2H待输出字符INT21H AH DL 64 单字符显示输出例 MOVAH 02MOVDL 41HINT21H 执行结果 屏幕显示A 65 4 字符串输出显示 功能号O9H待输出字符串的偏移地址INT21H AH DS DX 66 字符串输出显示 注意点 被显示的字符串必须以 结束 所显示的内容不应出现非可见的ASCII码 若考虑输出格式需要 在定义字符串后 加上回车符和换行符 67 字符串输出显示例 DATASEGMENTMESS1DB InputString 0DH 0AH DATAENDSCODESEGMENT MOVAH 09MOVDX OFFSETMESS1INT21H 5 返回操作系统 DOS 功能 功能号 4CH调用格式 MOVAH 4CHINT21H功能 程序执行完该2条语句后能正常返回OS常位于程序结尾处 68 二 BIOS功能调用 通过中断指令调用相应的BIOS中断服务程序BIOS中断服务程序实际上是一些对端口的输入输出操作 是微机系统中软件与硬件之间的一个可编程接口 光驱 硬盘管理 中断设置等 69 附录D 键盘状态检验 可利用类型码为16H的BIOS中断判断是否有任意键按下调用格式 AHINT16H判断方法 若ZF 0若ZF 1 70 功能号1 有键按下 无键按下 例 在屏幕上显示信息 当有任意键按下时退出 71 DSEGSEGMENTMESSDB Hello World 0DH 0AH DSEGENDSCSEGSEGMENTASSUMECS CSEG DS DSEGSTART MOVAX DSEGMOVDS AXAGAIN LEADX MESSMOVAH 9INT21HMOVAH 1INT16HJZAGAINMOVAH 4CHINT21HCSEGENDSENDSATRT 键盘状态检验 判断是否有任意键按下的方法可以用DOS软中断 功能号为0BH 出口参数为AL 格式 MOVAH 0BHINT21H若AL FFH 则有键按下 若AL 0 则无键按下 72 DOS和BIOS功能调用小结 均通过中断指令调用 1个中断类型码对应1个功能程序包 每个程序包中的子功能通过功能号区分 调用时功能号须送AH 部分功能既可用DOS中断也可以用BIOS中断 注意不同子功能的入口 出口参数要求 DOS和BIOS中断均可能影响AX 73 74 4 4汇编语言程序设计 设计步骤 根据实际问题抽象出数学模型确定算法画程序流程图分配内存工作单元和寄存器程序编码调试 75 汇编语言程序结构 顺序结构循环结构先判定型后判定型分枝结构单分枝多分枝子程序结构 汇编程序设计中的注意点 汇编语言源程序结构逻辑段的定义 段寄存器的初始化变量声明变量定义的存储空间 变量的起始偏移地址指令的正确使用指令格式 指令的操作数程序结构分支 循环 转移的条件 76 START 指令开始地址MOVAX DATA MOVDS AX 初始化DS MOVAH 4CH INT21H 返回DOS操作系统CODEENDSENDSTART 汇编结束标志 DATASEGMENT DATAENDS 定义数据段STACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDS 定义堆栈段CODESEGMENTASSUMECS CODE DS DATA SS STACK1 数据段 堆栈段 代码段 77 汇编源程序的两种结构 1 MAINPROCFAR 设置为FAR过程PUSHDS 为返回操作系统执行INT20HMOVAX 0 指令做准备PUSHAX 立即数不能够作为操作数 RET 返回操作系统MAINENDPCODEENDSENDMAIN 汇编结束标志 DATASEGMENT DATAENDS 定义数据段STACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDS 定义堆栈段CODESEGMENTASSUMECS CODE DS DATA SS STACK1 数据段 堆栈段 代码段 78 汇编源程序的两种结构 2 例1利用学号查学生的数学成绩表 算法分析 首先在数据段中建立一个成绩表TABLE 在表中各学生的成绩按照学号从小到大的顺序存放 要查的学号存放在变量NUM中 查表的结果放在变量MATH中 顺序程序设计 79 80 DATASEGMENTTABLEDB81 78 90 64 85 76 93 82 57 80DB73 62 87 77 74 86 95 91 82 71NUMDB8MATHDB DATAENDSSTACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDS COSEGSEGMENTASSUMECS COSEG DS DATA SS STACK1START MOVAX DATA MOVDS AX 装入DSMOVBX OFFSETTABLE BX指向表首址XORAH AH AH 0MOVAL NUMDECAL 实际学号是从1开始的ADDBX AX BX加上学号指向要查的成绩MOVAL BX 查到成绩送ALMOVMATH AL 存结果MOVAH 4CH 返回DOSINT21HCOSEGENDSENDSTART 81 分支程序设计 例2数据段的ARY数组中存放有10个无符号数 试找出其中最大者送入MAX单元 DATASEGMENTARYDB17 5 40 0 67 12 34 78 32 10MAXDB DATAENDSTACK1SEGMENTPARASTACKDW20HDUP 0 STACK1ENDSCODESEGMENTASSUMECS CODE DS DATA SS STACK1BEGIN MOVAX DATAMOVDS AXMOVSI OFFSETARY SI指向ARY的第一个元素MOVCX 9 CX作次数计数器MOVAL SI 取第一个元素到ALLOP INCSI SI指向后一个元素CMPAL SI 比较两个数JAEBIGER 前元素 后元素转移MOVAL SI 取较大数到ALBIGER DECCX 减1计数JNZLOP 未比较完转回去 否则顺序执行MOVMAX AL 存最大数MOVAH 4CHINT21HCODEENDSENDBEGIN 82 例2 例3编写一程序 实现将存储器中的源数据块传送到目的数据块 分支程序设计 83 因此 我们设定 当源块首地址 目的块首地址时 从数据块末地址开始传送 反之 则从首地址开始传送 SI 源数据块首址DI 目的数据块首址CX 传送的字节数 SI DI 形成末址SI SI CX 1DI DI CX 1 DI SI SI SI 1DI DI 1 CX CX 1 CX 0 DI SI SI SI 1DI DI 1 CX CX 1 CX 0 结束 N Y N Y N Y BOTTOM TOP 开始 例3 84 DATASEGMENTORG 20HSTRGDB ABCDEFGHIJ 数据块LENGEQU STRG 数据块字节长度BLOCK1DWSTRG 源块首址BLOCK2DWSTRG 5 目的块首址DATAENDSSTACK1SEGMENTSTACKDW20HDUP 0 STACK1ENDS COSEGSEGMENTASSUMECS COSEG DS DATA SS STACK1BEGIN MOVAX DATAMOVDS AXMOVCX LENG 设置计数器初值MOVSI BLOCK1 SI指向源块首址MOVDI BLOCK2 DI指向目的块首址CMPSI DI 源块首址 目的块首址吗 JATOP 大于则转到TOP处 否则顺序执行ADDSI LENG 1 SI指向源块末址ADDDI LENG 1 DI指向目的块末址 85 例3 BOTTOM MOVAL SI 从末址开始传送MOV DI ALDECSIDECDIDECCXJNEBOTTOMJMPEND1TOP MOVAL SI 从首址开始传送MOV DI ALINCSIINCDIDECCXJNETOPEND1 MOVAH 4CHINT21HCOSEGENDSENDBEGIN 86 例3 循环程序设计 87 例4设有两个数组X和Y 它们都有8个元素 其元素按下标从小到大的顺序存放在数据段中 试编写程序完成下列计算 Z1 X1 Y1Z2 X2 Y2Z3 X3 Y3Z4 X4 Y4Z5 X5 Y5Z6 X6 Y6Z7 X7 Y7Z8 X8 Y8 算法分析 由于循环体中有 和 两种可能的运算 通过设置标志0 和1 来判断 低位表示低下标的运算 八个运算表达式由8位逻辑尺 10011010B来识别 DATASEGMENTXDB0A2H 7CH 34H 9FH 0F4H 10H 39H 5BHYDB14H 05BH 28H 7AH 0EH 13H 46H 2CHLENEQU YZDBLENDUP LOGRDB10011010B 低位表示低下标的运算DATAENDSSTACK0SEGMENTPARASTACKDW20HDUP 0 STACK0ENDSCOSEGSEGMENTASSUMECS COSEG DS DATA SS STACK0BEGIN MOVAX DATAMOVDS AXMOVCX LEN 初始化计数器MOVSI 0 初始化指针MOVBL LOGR 初始化逻辑尺 例4 88 LOP MOVAL X SI SHRBL 1 标志位送CFJCSUB1 为1 转做减法ADDAL Y SI 为0 做加法JMPRESSUB1 SUBAL Y SI RES MOVZ SI AL 存结果INCSI 修改指针LOOPLOPMOVAH 4CHINT21HCOSEGENDSENDBEGIN 例4 89 例5编写一程序 将字单元VARW中含1的个数 含1的个数是指用二进制表示时 有多少个1 统计出来 存入CONT单元中 本例中通过将字单元各位逐位移入最高位来判断 为了减少循环次数 循环中加上了判断各位是否全为0 这样可使低位为全0时的循环次数减

温馨提示

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

评论

0/150

提交评论