1 / 85

第 5 章 汇编语言程序设计

第 5 章 汇编语言程序设计. 5.1 汇编语言程序格式. 5.2 常用伪指令. 5.3 汇编语言的编写. 5.4 DOS 功能调用. 5.5 汇编语言设计. 教学重点. 本章介绍程序结构、伪指令、 DOS 功能调用。 重点:汇编语言程序的基本结构; 伪指令及其使用方法; DOS 功能调用; 基本的汇编语言程序设计方法。 难点: DOS 功能调用的应用 汇编语言程序的设计. 5.1 汇编语言程序格式. 5.1.1 程序结构. 5.1.2 汇编语言语句格式.

mave
Download Presentation

第 5 章 汇编语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第5章 汇编语言程序设计 5.1 汇编语言程序格式 5.2 常用伪指令 5.3 汇编语言的编写 5.4 DOS功能调用 5.5 汇编语言设计

  2. 教学重点 本章介绍程序结构、伪指令、DOS功能调用。 重点:汇编语言程序的基本结构; 伪指令及其使用方法; DOS功能调用; 基本的汇编语言程序设计方法。 难点:DOS功能调用的应用 汇编语言程序的设计

  3. 5.1 汇编语言程序格式 5.1.1 程序结构 5.1.2 汇编语言语句格式 5.1.3 汇编语言数据表示

  4. 5.1.1 程序结构 • 1、汇编语言的分段结构: 用开始语句“SEGMENT”和结束语句“ENDS”来定义一个段 数据段(DATA) 作用:存放程序运行所需要的数据和运行结果 汇编语言源程序 堆栈段(STACK) 作用:执行数据的压栈和弹栈操作,以及程序中 的数据保护 代码段(CODE) 作用:存放所编写的程序的代码

  5. 5.1.1 程序结构 • 2、语句类型 指令语句 作用:产生相应的机器代码,指定CPU做什么操作。 语句类型 伪指令语句 作用:不产生相应的机器代码,仅控制汇编过程。 宏指令语句 作用:由编程者按照一定的规则来定义的一种较“宏大”的指令,包括多条指令或伪指令 。

  6. 例题1 DATA SEGMENT;定义DATA段 BUF1 DB 34H ;定义第一个数据 BUF2 DB 2AH ;定义第二个数据 SUM DB ? ;定义数据和单元 DATA ENDS;DATA结束 STACK SEGMENT PARA STACK ‘STACK’ ;定义STACK段 DW 200 DUP(0) STACK ENDS ; STACK段结束 SEGMENT 数据段开始 ENDS 数据段结束 数据段 堆栈段

  7. 例题1(续) CODE SEGMENT ;定义CODE段 ASSUME CS:CODE,DS:DATA,SS: STACK ;段分配 START:MOV AX,DATA MOV DS,AX ;填装数据段寄存器DS MOV AL,BUF1 ;取第一个加数 ADD AL,BUF2 ;和第二个加数相加 MOV SUM,AL MOV AH,4CH INT 21H ;返回DOS状态 CODE ENDS ;CODE段结束 END START ;整个源程序结束 代码段

  8. 例题2 ;example2.asm(文件名) stacksegmentstack;定义堆栈段 dw 512 dup(?) ;堆栈段有512字空间 stack ends;堆栈段结束 data segment;定义数据段 string db ’Hello, Everybody !’,0dh,0ah,’$’ data ends code segment ’code’ ;定义代码段 assume cs:code,ds:data,ss:stack

  9. 例题2(续) start: mov ax,data;建立DS段地址 mov ds,ax mov dx,offset string mov ah,9 int 21h mov ax,4c00h int 21h ;利用功能调用返回DOS code ends;代码段结束 end start;汇编结束,同时指明程序起始点

  10. 5.1.2 汇编语言语句格式 • 指令语句、伪指令语句 指令语句 汇编时翻译成二进制机器代码 [标号:]操作码 [操作数, [操作数]][;注释] 指令语句标号后有冒号“:” 伪指令语句名字后没有冒号 伪指令语句 定义符号、数据,分配内存单元,不产生机器代码 [名字]操作码 操作数 [;注释]

  11. 名字由字母开头。 可由下列符号组成: (1) 大小写英文字母(A~Z,a~z) (2) 数字(0~9) (3) 特殊符号(?、@、_等) 命名规则: (1) 数字不能作为名字的第一个符号。 (2) 单独的问号(?)不能作为名字。 (3) 最大有效长度为31位。 (4) 汇编语言中有特定含义的保留字(如操作码、寄存器名等),不能作为名字使用。 (5)见名知义。如用BUFFER表示缓冲区、SUM表示累加和等。 5.1.2 汇编语言语句格式

  12. 5.1.2 汇编语言语句格式 • 标号在代码段中定义。 段属性 定义变量的段起始地址。 标号的三种属性 偏移属性 标号偏移地址,从段起始地址到定义标号的位置之间字节数。 类型属性 指出该标号是在本段内引用还是在其他段中引用。段内引用属性为NEAR;段间引用属性为FAR。

  13. 5.1.2 汇编语言语句格式 • 操作码与操作数 • 例:MOV AX , BX 无操作数: 一个操作数: 两个操作数: 伪指令、宏指令可有多个操作数: 操作数: • 用来指定参与操作的数据。 • 多于一个,之间用逗号分开。 • 可以是常数或表达式。 操作码: 指明操作的性质和功能,指令中的助记符都是操作码

  14. 5.1.2 汇编语言数据表示 后缀:二进制B、八进制O或Q、十进制D、十六进制H。 十进制数可省掉后缀 十六进制数以A~F开头时,前面须加数字0 数值常量 常量 字符串在计算机中以ASCII码存储。 如‘A’的存储值是41H,‘AB’的存储值是41、42H等。 字符串常量 用EQU或 “=” 定义的符号常量。 如用COUNT EQU 3或COUNT=3定义后 ,COUNT是一个符号常数,与数值3等价。 符号常数

  15. 5.1.2 汇编语言数据表示 段属性 定义变量的段起始地址 偏移属性 变量 变量所在段的段内偏移地址 类型属性 变量类型定义变量所占的字节数。 如:BYTE(DB,1字节)、WORD(DW,2字节)、 DWORD(DD,4字节)、QWORD(DQ,8字节)、TBYTE(DT,10字节)。

  16. 5.1.2 汇编语言数据表示 +、—、*、/、MOD 与数学运算符的意义相同。 取模是取余数。 例:82 MOD 16 ; 结果为2 20H MOD 7 ; 结果为4 算术运算符 运算符及表达式 AND、OR、NOT、XOR 运算结果是一个常数. 逻辑运算符 EQ、NE、LT、GT、LE、GE 两个表达式比较时,表达式表示方法/性质要相同 关系成立,结果为全1;不成立时,为全0 例如:指令MOV BX,32EQ45等价于MOV BX,0; 关系运算符 SEG、OFFSET、LENGTH、SIZE、TYPE 把存储单元地址分解为段地址和偏移地址 分析运算符 THIS、PTR 规定存储单元的性质 综合运算符

  17. 5.2 常用伪指令 格式〈符号名〉 EQU 〈表达式〉 功能 给符号名定义一个值、别的符号名、表达式或助记符。 注不能给一个符号重复定义 DB 字节变量,以字节为单位分配存储单元。 DW 字变量,以字为单位分配存储单元。 DD 定义双字,以4字节为单位分配存储单元。 DQ定义4字变量,以8字节为单位分配存储单元。 DT定义5字 变量,以10字节为单位分配存储单元 等值伪指令 常用伪指令 与EQU类似,但在同一个程序中,=可以对一个符号重新定义。 等号伪指令 格式PURGE〈符号1,2…N〉 功能解除指定符号的定义,解除后,可用EQU重新定义。 例Y1 EQU 7;Y1的值为7 PURGE Y1;解除Y1的定义 设置当前地址计数器的值 例DATA SEGMENT ORG 10H BUFF1 DW 2000H ORG 20H BUFF2 DW 4000H DATA ENDS 执行后BUFF1的偏移地址值为10H,BUFF2的为20H。 解除定义伪指令 ASSUME 说明段寄存器和段名之间的对应关系 例 ASSUME CS:CODE,DS:DATA 定义变量伪指令 定位伪指令 段分配伪指令 段定义伪指令

  18. 段定义伪指令格式: 段名 SEGMENT[定位类型][组合方式][类别名] ·····;指令句或伪指令句 段名 ENDS 5.2 常用伪指令 作用 规定段的起始地址 四种类型的起始位置分别为(X表示可为0或1): (A) BYTE XXXX XXXX XXXX XXXX XXXXB (B) WORD XXXX XXXX XXXX XXXX XXX0B (C) PARA XXXX XXXX XXXX XXXX 0000B (D) PAGE XXXX XXXX XXXX 0000 0000B 以上分别表示以字节、字、节、页的边界为起始地址。如果缺省定位方式,则以节的边界为起始地址。 作用 指示连接程序,把同名的段按照指定的方式组合起来形成一个新的段。 组合方式 NONE、PUBLIC、STACK、 COMMON、MEMORY 、AT 典型格式 : STACK SEGMENT PARA STACK ‘STACK’ 类别名必须用单引号括起来 连接程序把类别名相同的段放在连续的存储区域,先出现的段在前,后出现的在后,但对各段不能重新组合 成对出现,前后必须相同 在同一模块中,不同段的段名不能相同 成对使用,指定段的名称、范围和段的定位类型、组合类型和分类名。

  19. 5.3 汇编程序的编写 5.3.1 段寄存器的填装 5.3.2汇编语言程序的编写过程

  20. 1、DS、ES内容的填装 例: CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX …… (DATA、STACK设置已省略。) 5.3.1 段寄存器的填装 用MOV指令填装段寄存器DS、ES的值

  21. 5.3.1 段寄存器的填装 • 2、SS段寄存器的填装 • CODE SEGMENT • …… • DATA ENDS • STACK1 SEGMENT PARA STACK ‘STACK’ • DW 200DUP(0) • TOP LABEL WORD • STACK1 ENDS • START:…… MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP 设置定位类型:PARA 组合类型:STACK SS SP 的内容自动填充 指令填装SP 指令填装SS 类似于DS、ES的填装

  22. 5.3.2汇编语言程序的编写过程 1)用文本编辑器建立扩展名为.ASM源文件。 2)用MASM程序吧扩展名为.ASM的文件汇编成扩展名为.OBJ的文件。 3)用LINX程序把扩展名为.OBJ的文件连接成扩展名为.EXE的文件。 4)在DOS方式下直接键入文件名就可执行该程序。

  23. 5.3.2汇编语言程序的编写过程 • 汇编语言源程序的操作流程图 出错 出错 出错 源程序文件 EXMP.ASM 文件 EXMP.OBJ (EXMP.LST) (EXMP.CRF) 编 辑 程 序 汇 编 程 序 连 接 程 序 文件 EXMP.EXE (EXMP.MAP) (EXMP.LIB) DELINK TC编辑器 WINDOWS 文本编辑器 EDIT ASM MASM TASM LINK DEBUG 连接的是.OBJ文件 执行的是.exe文件

  24. 5.4 DOS功能调用 DOS系统中设置了两层内部子程序可供用户使用: • 基本输入输出模块BIOS • DOS层功能模块 基本I/O系统BIOS 主要功能: 1.加电后的硬件测试程序; 2.系统配置(如内存大小)的分析程序; 3.显示器、打印机、键盘、异步通信和软驱的驱动程序; 4.日、时钟控制程序; 5. 引导与装入程序。 BIOS ?

  25. 5.4 DOS功能调用 用途:方便高级用户通过软中断和功能调用在 MS-DOS较低层次上和操作系统打交道。 BIOS的部分软中断调用指令及功能

  26. 5.4 DOS功能调用 BIOS的调用格格式 MOV AH,nn1 nn1为功能号, 规定调用的功能 INT nn2 nn2为软中断调用的类型码,规定调用的类型 EXAMPLE : 设置显示器为80(列)×25(行)彩色方式 MOV AL,03H;AL为入口参数,规定显示方式 MOV AH,00H; 00H为设置显示器的功能号 INT 10H;10H 为供显示调用的类型码

  27. 5.4 DOS功能调用 DOS系统功能调用(类型码:21H) 为了使用方便,将DOS层功能模块所提供的100个子程序从00H~63H统一顺序编号,调用方法如下: 1. 设置入口参数 2. 将子程序编号送入AH寄存器 3. 执行中断指令INT 21H

  28. 5.4 DOS功能调用 功能号 功能 入口参数 出口参数 00H 程序终止 无 无 01H 键盘输入并回显 无 AL=输入字符 02H 显示字符 DL=输出字符 03H 异步通信输入 AL=输入字符 04H 异步通信输出 DL=输出字符 05H 打印机输出 DL=输出字符 06H 直接控制台I/O

  29. 5.4 DOS功能调用 功能号 功能 入口参数 出口参数 07H 键盘输入无回显 AL=输入字符 08H 同上但要检测Ctrl-Break 09H 显示字符串 (见说明) 0AH 字符串输入 (见说明) 4CH返回DOS操作系统 更详细情况可参见教材P333附录

  30. 5.4 DOS功能调用 说明:①AH=09H为显示字符串功能。例如,显示STRING中字符串:STRING DB ‘A BOY’,’$’;MOV DX,OFFSET STRING;取STRING的偏移地址MOV AH,09H; INT 21H; DS:DX 输出缓冲区结束字符 BACK

  31. 5.4 DOS功能调用 AH=0AH为从键盘输入字符串。 入口参数:DS:DX=输入缓冲区地址, [DS:DX]为输入缓冲区的总长; 出口参数:[DS:DX+1]为输入字符串的实长(字符个数) DS:DX+0 输入缓冲区 +1 +2 输入字符 说明:最大的实长=总长-1 BACK

  32. 5.4 DOS功能调用 DOS功能调用举例 例 从键盘输入字符串并回显 a. 显示‘Do you want input a string? (Y/N)’,回车,换行,‘$’; (09H功能) 算 法 b. 从键盘输入一个字符( Y/N), 若是‘y’或‘Y’则执行c ,否则到g 结束;(01H功能) c. 显示‘Please input string.’, 回车,换行,‘$’;(09H功能)

  33. 5.4 DOS功能调用 DOS功能调用举例 例 从键盘输入字符串并回显 算 法 d. 输入字符串到缓冲区; • 在缓冲区输入的字符串后 加结束符‘$’; f. 回显输入的字符串; g. 结束。

  34. 5.4 DOS功能调用 例 密码输入程序算法及流程图 算 法 a. 提示“Please Input Your Password.” b. 用输入字符不回显方式一个一个输 入密码,每输入1位密位显示一个 “*” 号;密位可以1~8位,不足8位时以 “回车”结束,满8位时自动结束。 c. 比较输入的密码。

  35. 5.4 DOS功能调用 例 密码输入程序算法及流程图 算 法 d. 密码正确,转操作程序(以显示 “OK!”结束)。 e. 密码错误,显示“Wrong,Again!” 重新输入输入密码。 f. 密码输入最多3次,3次均为错误 时显示“NO!”退出。

  36. 主程序 BL←03H SI←BUFF1偏 LOP 输入密码(SUB1) 比较密码(SUB2) Y 密码对? 显示“OK!” N AGAIN Y BL-1≠0? 显示“Wrong,Again!” N 显示“NO!” DONE END 5.4 DOS功能调用 流程图

  37. 子程序1 SUB1 DI←BUFF2偏 CX←08H LOP1 输入字符 Y 是否回车? N 存字符 Y CX-1≠0? DI←DI+1 N DONE1 显示‘*’号 RET 5.4 DOS功能调用 流程图

  38. 子程序2 SUB2 DI←BUFF2偏 CX←取密位 LOP2 比较1个字符 Y 是否不相同? AL←0FFH N DI←DI+1 CX-1≠0? Y SI←SI+1 N AL←00H DONE2 RET 5.4 DOS功能调用 流程图

  39. 5.5 汇编程序设计 5.5.0 汇编语言设计基础知识 5.5.1 顺序结构程序设计 5.5.2 分支结构程序设计 5.5.3 循环结构程序设计 5.5.4 子程序结构形式与操作

  40. 汇编语言设计的一般步骤 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 当接到程序设计的任务后,首先对任务进行详尽的分析,搞清楚已知的数据和想要得到的结果,程序应该完成何种的功能。

  41. 汇编语言设计的一般步骤 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 根据实际问题的要求和指令系统的特点,确定解决问题的具体步骤。根据任务要求,对不同的计算方法进行比较,选择最适宜的算法。

  42. 汇编语言设计的一般步骤 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 将解决问题的具体步骤用一种约定的几何图形、指向线和必要的文字说明描述出来的图形。

  43. 汇编语言设计的一般步骤 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 经过上述各步骤后,解决问题的思路已经非常清楚,所以接下来就可以按流程图的顺序对每一个功能框选用合适的指令编写出汇编语言程序。

  44. 汇编语言设计的一般步骤 一、汇编语言程序设计的一般步骤 分析课题 确定算法 画流程图 编写程序 上机调试 在应用程序的设计中,几乎没有一个程序只经过一次编写就完全成功的,所以必须经过上机调试。

  45. 开始 Y 条件 N 结束 流程图的画法规定 1.流程图的概念 • 流程图是由特定的几何图形、指向线、文字说明来表示数据处理的步骤,形象描述逻辑控制结构以及数据流程的示意图。流程图具有简洁、明了、直观的特点。 2.流程图符号表示 (1)开始框:表示程序的开始。 (2)处理框(执行框) (3)判断框 (4)结束框

  46. 程序的基本结构 • 结构程序设计   程序的每个部分都由有限结构结合中的单元组成,并且只有单一的入口和单一的出口。 基本结构有:顺序结构(线性结构) 选择结构(分支结构) 循环结构 三种结构可以任意组合和嵌套构成复杂的程序。

  47. (1)顺序结构 (2)双分支结构 …… 程序的基本结构 这三种结构可归纳为五种逻辑结构: Y N 条件 条件 (3)多分支结构

  48. Y N 程序的基本结构 N Y (5)DO_WHILE循环结构 (4)DO_UNTIL循环结构 程序的逻辑结构格式

  49. 程序的基本结构 顺序程序:一种无分支的程序,CPU从第一条指令开始依次执行每一条指令,直到最后一条指令。 特点:指令顺序执行,无分支、无循环、无转移。 例题 拆字程序

  50. 保留高位十六进制数 开始 取原数据 设置数据段和堆栈段地址 截取低四位 设置堆栈指针 保存地位十六进制数 取数据 保存结果 截取高四位 结束 右移四位 拆字程序 例:设内存DATA单元存放一个无符号字节数据,编制程序将其拆成两位十六进制数, 并存入HEX和HEX+1单元的低4位,HEX存放高位十六进制数, HEX+1单元存放低位十六进制数 解 : 分析命题 确定算法 画流程图

More Related