汇编语言程序设计教案2_第1页
汇编语言程序设计教案2_第2页
汇编语言程序设计教案2_第3页
汇编语言程序设计教案2_第4页
汇编语言程序设计教案2_第5页
已阅读5页,还剩66页未读 继续免费阅读

下载本文档

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

文档简介

1、汇编语言程序设计第七讲第七讲课题二课题二 基本程序结构基本程序结构 程序流程图 顺序程序设计 分支程序设计 循环程序设计 子程序设计汇编程序设计的一般步骤1. 分析问题,建立数学模型2. 确定算法3. 编制程序流程图4. 合理分配存储空间和寄存器5. 编制程序6. 调试程序一、程序流程图(a)处理框 (b)判断框 (c)起止框 (d)连接框 (e)流向线AX=0?YN开始结束AA 流程图的组成 流程图主要由以下几种框图符号组成:一、程序流程图 例:判断两无符号数大小的流程图开始AX 无符号数1BX 无符号数2AXBX=0?显示 AX=BXAXBX 0?显示 AX BX显示 AX BX结束YNN

2、Y二、顺序程序设计 顺序程序结构是最简单、最基本的程序结构; 无任何分支,从流程图上看,只有起止框和处理框,无判断框;二、顺序程序设计 例:将AL中的两位十进制数分别转换为它们相应的ASCII码,分别存放在BH和BL中。解:CODE SEGMENT ASSUME CS:CODESTART:MOV BL,AL MOV BH,AL AND BL,0FH OR BL,30H MOV CL,4 SHR BH,CL OR BH,30H MOV AH,4CH INT 21H CODE ENDS END START附:汇编程序上机运行过程 第一步:编辑源文件第一步:编辑源文件 (生成.ASM文件) EDIT

3、 XXX.ASM 说明:在EDIT环境中,按Alt+F调出菜单后可选择存盘退出。 第二步:汇编源文件第二步:汇编源文件 (生成.OBJ文件) MASM XXX 说明: 1、文件名XXX后面可不带扩展名,缺省为.asm 2、运行masm后,可连续按提示进行下一步操作,选择默认值可直接回车。如有错误需回到第一步修改。附:汇编程序上机运行过程 第三步:连接目标文件第三步:连接目标文件 (生成.EXE文件) LINK XXX 说明: 1、汇编通过后,连接一般都可通过并获得EXE文件。 2、此命令中文件名XXX不需带扩展名。缺省为.obj 第四步:运行可执行文件第四步:运行可执行文件 XXX (在DOS

4、下直接运行) 或DEBUG XXX.EXE (在DEBUG中运行)三、分支结构程序设计 分支结构也叫选择结构; 在程序运行中,执行哪条指令是由CS和IP决定的,在程序运行的过程中改变CS和IP,就是改变了程序的流向,从而得到分支、循环、子程序等程序结构; 分支结构的实现须借助于程序转移指令程序转移指令的控制;附:转移指令 转移指令分为两种:l无条件转移指令无条件转移指令l条件转移指令条件转移指令1、无条件转移指令、无条件转移指令 格式:格式: JMP 目标目标 说明:说明:l目标通常用标号来表达,根据转移的远 / 近、直接 / 间接不同,可有以下几种格式: JMP 标号标号 ;段内直接转移 J

5、MP CX ;段内间接转移 JMP WORD PTR BX ;段内间接转移 JMPFAR PTR 标号 ;段间直接转移 JMP DWORD PTR BXSI ;段间间接转移2、条件转移指令、条件转移指令 基本格式:基本格式: JXX 目标目标 说明:说明:l字母“J”后面的“XX”是指“条件”,如果条件成立,则转移至“目标”处执行,否则顺序执行。l条件转移指令共18条,它们均以F寄存器中状态标志位作为判断条件,但执行后均不影响各标志位。l此类指令都只能在以当前IP内容为中心的 128 至127字节范围内转移(短转移)。超过要修改程序。2、条件转移指令、条件转移指令 这18条指令又可分为三大类:

6、l简单条件转移指令l无符号数条件转移指令l带符号数条件转移指令表一 简单条件转移指令标志位标志位指指 令令转移条件转移条件含含 意意JCJNCCF=1CF=0有进/借位无进/借位CFZFSFOFPFJE / JZJNE / JNZZF=1ZF=0相等/等于0不相等/不等于0JSJNSSF=1SF=0是负数是正数JOJNOSF=1SF=0有溢出无溢出JP / JPEJNP / JPOSP F=1SF=0有偶数个1有奇数个1表二 无符号数条件转移指令指指 令令转移条件转移条件含含 意意JA / JNBECF=0 且且 ZF=0JAE / JNBA BA B表三 有符号数条件转移指令指指 令令转移条

7、件转移条件含含 意意JG / JNLESF=OF 且且 ZF=0JGE / JNLA B A B三、分支结构程序设计 例:判断两无符号数的大小解: DATA SEGMENT DA1 DB ? DA2 DB ? A_MESSAGE DB AB,$ B_MESSAGE DB BA,$ DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,DA1 MOV BL,DA2 CMP AL,BL JA ABIG MOV DX, OFFSET B_MESSAGE MOV AH,9 INT 21H FIN

8、ISH:MOV AH,4CH INT 21H ABIG: MOV DX, OFFSET A_MESSAGE MOV AH,9 INT 21H JMP FINISH CODE ENDS END START 已知AL中存放某ASCII码,试编制程序,判断该ASCII码代表的是数字,小写英文字母还是大写英文字母?用Int 21H中9号功能显示结果。DATA SEGMENT N_MSG DB Number, $ L_ MSG DB Lowercase, $ C_MSG DB Capital, $ OTHERS DB OHTERS, $DATA ENDSCODE SEGMENT ASSUME CS:CO

9、DE, DS:DATASTART: MOV AX, DATA MOV DS, AX MOV AL, 11H打开程序文件 CMP AL,30H JB OTHER CMP AL,39H JBE N CMP AL,41H JB OTHER CMP AL,5AH JBE C CMP AL,61H JB OTHER CMP AL,6AH JBE L JMP OTHERN: MOV DX, OFFSET N_MSG MOV AH, 9 INT 21H JMP ENDINGL: MOV DX, OFFSET L_MSG MOV AH, 9 INT 21H JMP ENDINGC: MOV DX, OFFSE

10、T C_MSG MOV AH, 9 INT 21H JMP ENDINGOTHER: MOV DX, OFFSET OTHERS MOV AH, 9 INT 21HENDING: MOV AH, 4CH INT 21HCODE ENDS END START四、循环程序设计1循环程序结构循环程序结构初始化部分处理部分修改计数器及指针循环结束?结束处理部分YN循环控制部分2为何需要循环?为何需要循环? 简化程序的编制 简少程序对内存的占用。3如何实现循环?如何实现循环? 使用条件转移指令:Jxx 目标 使用循环控制指令:LOOP 目标 等 4循环控制指令循环控制指令 80868088循环控制指令共

11、有四条,下面介绍其中一条最常用指令: LOOP指令:l指令格式:指令格式: LOOP 目标目标 l指令功能:指令功能: 自动进行循环次数的计数(即CXCX1)后,如计数寄存器CX0,则转移到目标单元,否则顺序执行。相当于这两条指令: DEC CX JNZJNE 目标l 说明:说明:l 此指令隐含使用CX作为循环计数器;l 因此应注意先设置好CX的初始值。例:计算:12320。结果存入AX寄存器。CODE SEGMENT ASSUME CS:CODESTART:MOV CX,0014H MOV AX,0 A: ADD AX,CX LOOP A CODE ENDS END START 初始化部分

12、处理部分 循环控制部分练习 在数据段定义一段长度为100字节的数据区,其各单元内容任意。然后统计该区中有多少个存储单元的内容小于或等于5(按无符号数比较)。将统计结果放在DL中。参考答案:data segment dat db 100 dup(?)data endscode segment assume cs:code, ds:datastart: mov ax, data mov ds, ax参考答案(续): mov si, offset dat mov dl, 0 mov cx, 100next: cmp byte ptr si, 5 jbe count inc si loop next

13、jmp endingcount: inc dl inc si loop nextending: mov ah, 4ch int 21hcode ends end start五、子程序设计 调用:调用:在主程序中使用命令: CALL 过程名 返回:返回:在子程序中使用命令: RET 结构:结构:主程序子程序1子程序2 过程(子程序)的定义过程(子程序)的定义 l过程定义伪指令的格式如下: 过程名过程名 PROC (NEARFAR) RET RET 过程名过程名 ENDPl说明: NEARFAR:距离类型。NEAR表示此过程仅能供段内其他程序调用。 过程必须在一个逻辑段内。 一个过程可能有多个RE

14、T指令,RET指令可以在过程中的任何位置,不一定放在一个过程的最后,但一个过程执行的最后一条指令必定是RET。子程序的一些问题子程序的一些问题l子程序的嵌套l子程序的递归调用l子程序的参量传递DOS功能子程序课题三课题三一、关于DOS功能子程序 DOS为程序设计人员提供了许多功能子程序,可供用户直接调用。 DOS共提供了84个功能子程序,这些子程序可分别完成以下功能:, 基本输入输出管 理(键盘,显示器等), 系统日期时间的设置与读出等等, 磁盘的读写控制, 文件操作, 目录操作, 内存管理二、DOS功能子程序的调用 DOS功能子程序的调用要使用中断指令: INT 21H 我们不必过问程序的内

15、部结构和细节,只要遵照以下方法就可以直接调用:l送入口参量给指定寄存器或存储单元;送入口参量给指定寄存器或存储单元;lAH 功能号(子程序编号);功能号(子程序编号);lINT 21H三、部分常用DOS功能子程序 MOV AH,01H INT 21H 说明:l此功能勿需入口参量,出口参量在AL中。l调用后,程序等待键盘输入,直到有一个键被按下(用户输入一个字符),然后把该字符的ASCII码送入AL,并在屏幕上显示该字符。l调用一次,只能输入一个字符。 与1号功能类同,差异仅在进行调用时,键盘输入的字符不在屏幕上显示。 如: MOV AH,08H INT 21H3. 字符显示(字符显示(2号功能

16、)号功能) 仅能显示单个字符。 要显示的字符的ASCII码要先存放在DL中。如: MOV DL,A ;或MOV DL,41H MOV AH,02H INT 21H 此功能可以实现一次输入一串字符。 使用本功能前,应先在内存中建立一个缓冲区:l缓冲区首字节存放缓冲区最大长度;缓冲区首字节存放缓冲区最大长度;l缓冲区第二字节用以存放实际输入的字符数缓冲区第二字节用以存放实际输入的字符数(不包括回车),这个数会自动填入;(不包括回车),这个数会自动填入;l从缓冲区第三字节开始存放输入字符与回车从缓冲区第三字节开始存放输入字符与回车符。符。 调用时,必须用DS:DX指向输入缓冲区的段基值:偏移量缓冲区

17、示意图 (以要输入(以要输入“ABC12”ABC12”为例)为例)M首字节(已放最大字符个数)次字节(将存放实际字符个数)实际输入的字符实际输入的字符(ASCII码)回车符DS:DX0100H0102H0103H0104H0105H0106H0107H0108H30H05H41H42H43H31H32H0DHDX0100H例:CHAR_BUF DB 30H DB 0 DB 30H DUP(0) : : MOV DX,SEG CHAR_BUF MOV DS, DX MOV DX, OFFSET CHAR_BUF MOV AH, 0AH INT 21H5. 字符串显示(字符串显示(9号功能)号功能

18、) 要显示的字符串必须先放在内存一个数据区中:l字符串以美元符号“$”作为结束标志;l调用时,把待显示的字符串首地址的段基值和偏移量分别存入DS和DX中。例:CHAR DB “I am a student”,0Dh, “ $” : : MOV DX, OFFSET CHAR MOV AH,9 INT 21H6、程序结束(、程序结束(4CH号功能)号功能) 结束程序,返回操作系统。 例: MOV AH,4CH INT 21H四、使用实例 通过2号或9号功能将响铃符(响铃的ASCII码)“显示”出来,即能让PC喇叭发声。课题四课题四汇编语言中的常用运算符 8088/8086宏汇编语言中的操作运算符

19、分为:l算术运算符l逻辑运算符l关系运算符l数值返回运算符l属性修改运算符 算术运算符主要有: 加()、减()、乘(*)、除()和模运算符MOD。l其中MOD操作得到的是除法的余数余数,例如,27 MOD 4,其结果为3。 当算术运算用于地址操作数时,应保证其结果是一个有意义的存储器地址,因而通常只使用、运算。 例: MOV AX,12+34相当于 MOV AX,46 逻辑运算符包括:l非(NOT)、与(AND)、或(OR)和异或(XOR) 逻辑运算符的运算对象必须是数值型的操作数,并且是按位运算。 应当注意逻辑运算符与逻辑运算指令之间的区别,逻辑运算符的功能是在汇编时由汇编程序汇编程序完成,

20、而逻辑运算指令的功能由CPU完成。 例: MOV AL,11H and 7EH 相当于 MOV AL,10H 关系运算符包括:l相等(EQ)、不等(NE)、小于(LT)、不大于(LE)、大于(GT)和不小于(GE)。 关系运算符用于将两个操作数进行比较,若符合比较条件(即关系式成立),所得结果为全1;否则,所得结果为全0。 数值返回运算符包括:l段基值(SEG)、偏移量(OFFSET)、类型(TYPE)、长度(LENGTH)和字节总数(SIZE) 数值返回运算符用来把存储器操作数(变量或标号)分解为它的组成部分(段基值段基值、偏移量偏移量、类型类型、元素个数总数元素个数总数和数据字节总数数据字

21、节总数),并且返回一个表示结果的数值。续续1 这些运算符的格式如下: 运算符运算符 变量变量或标号标号段基值运算符段基值运算符SEG 当运算符SEG加在一个变量名或标号的前面时,得到的运算结果是返回这个变量名或标号所在段的段基值段基值。续续2偏移量运算符偏移量运算符OFFSET 当运算符OFFSET加在一个变量名或标号前面时,得到的运算结果是返回这个变量或标号在它段内的偏移量偏移量。例如:MOV SI,OFFSET KX设KX在它段内的偏移量是15H,那么这个指令就等效于:MOV SI,15H续续3 偏移量运算符偏移量运算符OFFSET 这个运算符十分有用。例如,现有以ARRAY为首址的字节数

22、组,为了逐个字节进行某种操作,可以使用类似下面的程序:ARRAYDB20DUP(?) MOV SI,OFFSETARRAYLOP:MOVAL,SI INCSI LOOPLOP续续4偏移量运算符偏移量运算符OFFSETl在这段程序中,首先把数组变量的首字节偏移量送给SI,把寄存器SI作为数组的地址指针。这样在数组的逐个字节处理(即在LOP循环)中,用寄存器间接寻址方式,每处理完一个字节,就很方便地对地址指针SI进行修改,使它指向下一个字节。续续5类型运算符类型运算符TYPE 运算结果是返回反映变量或标号类型类型的一个数值。 如果是变量变量,则数值为字节数字节数,DB为1,DW为2,DD为4,DQ

23、为8,DT为10; 如果是标号标号,则数值为代表标号类型的数值代表标号类型的数值,NEAR为1,FAR为2。续续6长度运算符长度运算符LENGTH 这个运算符仅加在变量的前面,返回的值是指数数组组变量的元素个数变量的元素个数。l如果变量是用重复数据操作符DUP说明的,则返回外层DUP给定的值;l如果没有DUP说明,则返回的值总是1。续续7字节总数运算符字节总数运算符SIZE SIZE运算符仅用于变量的前面,运算结果是返回数组变量所占的总字节数数组变量所占的总字节数,也就是等于LENGTH和TYPE两个运算符返回值的乘积。 如数组变量ARRAY是用20H DUP(0)定义的,且数组元素的数据类型是字,则MOV AL,SIZE ARRAY等效为:MOV AL,40H 属性运算符包括:l类型修改(PTR)、短转移(SHORT)、类型指定(THIS)和段超越运算符(:)。 这种运算符用来对变量、标号或某存储器操作数的类型属性类型属性进行修改。PTR类型修改类型修改PTR运算符运算符 PTR运算符格式如下: 类型类型 PTR 地址表达式地址表达式 其中,类型可以是BYTE(字节)、WORD(字

温馨提示

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

评论

0/150

提交评论