390 likes | 609 Views
第 5 章 汇编语言程序设计. 程序设计思想 顺序程序设计 分支程序设计 循环程序设计 子程序或过程的设计. 本章内容简介. 在讲述了 8086/8088 指令系统及汇编语言程序格式的基础上,本章讲述 8086/8088 汇编语言程序设计的方法。 主要包括:程序设计思想、顺序程序设计、分支程序设计和循环程序设计。针对每一种程序结构,都给出了大量的编程实例。在分析程序结构的过程中,可以进一步体会 8086/8088 指令以及伪指令的使用。
E N D
第5章 汇编语言程序设计 程序设计思想 顺序程序设计 分支程序设计 循环程序设计 子程序或过程的设计
本章内容简介 • 在讲述了8086/8088指令系统及汇编语言程序格式的基础上,本章讲述8086/8088汇编语言程序设计的方法。 • 主要包括:程序设计思想、顺序程序设计、分支程序设计和循环程序设计。针对每一种程序结构,都给出了大量的编程实例。在分析程序结构的过程中,可以进一步体会8086/8088指令以及伪指令的使用。 • 在本章的最后一节讲述了子程序(过程)的设计及调用方法,并通过实例给出子程序(过程)的定义和调用方法及主程序与过程之间传递参数的方法,具体有利用寄存器传递参数、利用内存缓冲区传递参数和利用堆栈区传递参数。
重点掌握:掌握顺序、循环、分支程序、子程序的设计重点掌握:掌握顺序、循环、分支程序、子程序的设计 • 了解:汇编语言程序的格式、伪指令,程序的汇编过程及人工汇编。 • 难点:循环、分支程序设计
5.1 程序设计思想 • 程序要有良好的结构,简明,易读,易调试。 • 执行速度快。 • 占用存储空间少。
编制汇编语言程序的步骤 • 分析问题 • 确定算法 • 绘制程序框图 • 分配存储器空间 • 根据框图编写程序 • 静态检查
程序设计方法 • 结构化程序设计:任何程序都可以由顺序、分支、循环三种基本结构组成。其特点是每个结构具有一个入口和一个出口。 • 模块化程序设计:把大程序分解成许多较小的功能相对独立的子程序(称为模块)来编写,分别调试各模块。然后再组合连接成一个完整的程序。
5.2 顺序程序设计 • 顺序程序的特点是程序的顺序执行,即按照程序中汇编语言指令的自然次序,由程序开头逐条执行直至程序结束为止。 • 在大多数程序中是不可缺少的基本组成部分。 • 顺序程序设计,又叫直接程序设计。它是相对于分支程序和循环程序设计而言的。 • 因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令。一直执行到最后一条指令为止,此程序的任务也就完成了。
0000H 0001H 0002H 0003H 开始 SI→ 例:将30H和40H写入40000H开始的内存单元中,请在程序执行前、后检查相应内存单元的内容。 将偏移地址送SI 将30H写入内容单元 地址加1 将40H写入内容单元 结束
0000H 0001H 0002H 0003H SI→ code segment assume cs:code main proc far start:push ds mov ax,0 push ax mov ax,4000h mov ds,ax mov si,0 mov al,30h mov [si],al mov al,40h inc si mov [si],al ret main endp code ends end start
开始 X1 X2 X3 Y 0000H 0001H 0002H 0003H • 例:编程求以下运算:Y=X1-(X2+X3)。 取X2单元的值 BX→ X2+X3→CL 取X1的值 X1-CL 结果送Y单元 结束
data segment x1 db 39h x2 db 21h x3 db 13h y db ? data ends code segment assume cs:code,ds:data start:mov ax,data mov ds,ax mov bx,offset x2 mov cl,[bx] add cl,[bx+1] mov al,[bx-1] sub al,cl mov [bx+2],al mov ah,4ch int 21h code ends end start X1 X2 X3 Y 0000H 0001H 0002H 0003H BX→
5.3 分支程序设计 在日常生活中,经常遇到这样的问题……
5.3 分支程序设计 • 在解决实际问题时,经常会遇到需要针对不同情况作出不同处理的情况,解决这种问题需要采用分支程序结构。分支程序在执行时,可以对给定的条件进行判断,以决定程序执行的流向。通常由条件转移指令实现。 • 分支程序有两种结构形式,即两分支结构和多分支结构。两种结构的运行方向都是向前的,在某一种确定条件下,只能执行多个分支中的一个分支。
分支程序结构 • 分支程序在执行时,可以对给定的条件进行判断以决定程序执行的流向,通常由条件转移指令实现这一功能。 判定条件 判定条件 Y N 条件满足 的处理 条件不满足 的处理 条件1满足 的处理 条件2满足 的处理 … 条件n满足 的处理
例:从键盘输入一个数字,判断其奇偶性,若为奇数,则输出1,否则输出0。例:从键盘输入一个数字,判断其奇偶性,若为奇数,则输出1,否则输出0。 分析: ①如何判断数字的奇偶性 • 判断最低位是否为1→移位指令(具体可以使用哪条指令) ②如何读取、输出字符
开始 AL 键入一数 Y N CODE SEGMENT ASSUME CS:CODE BEGIN:MOV AH,01H INT 21H CLC RCR AL,1 JNC EVN MOV AL,31H JMP DISP EVN: MOV AL,30H DISP: MOV BL,AL MOV AH,02H MOV DL,0AH INT 21H MOV DL,0DH INT 21H MOV DL,BL INT 21H MOV AH,4CH INT 21H 奇数? AL “1” AL “0” 输出回车换行 输出0或1 结束 CODE ENDS END BEGIN
1 当X>0 Y = 0 当X=0 -1 当X<0 例:试编制实现变量X的符号函数的程序,该符号函数可用以下表示: 分析思考一: 如何判断一个数的性质,即计算机如何知道该数是正数?负数?还是0? 解决方法: 为了判断X的符号,①可以让X直接与0比较,②也可以用一条能影响标志位的指令来进行。例如用“与”或“或”操作,就把X的符号和是否为0反映到SF与ZF标志上。
0 当X=0 1/-1 当X≠0 1 当X>0 Y = 0 当X=0 -1 当X<0 分析思考二: 三分支程序如何设计? 解决方法: 可转化为两个二分支处理。
1 当X>0 Y = 0 当X=0 -1 当X<0 0 1/-1 当X=0 当X≠0 程序流程图 开始 AX←X Y AX=0? N N AX>0? Y ZERO MINUS PLUS BL←0FFH BL←01H BL←00H EXIT Y←BL 结束
任意给定X值,假定为300H 0000H 0001H 0002H 0003H X Y 00H 03H - STACK SEGMENT STACK DB 256 DUP(?) STACK ENDS DATA SEGMENT X DW 300H Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN:MOV AX,DATA MOV DS,AX
开始 AND AX,AX AX←X Y AX=0? N N AX>0? Y ZERO MINUS PLUS BL←0FFH BL←01H BL←00H EXIT Y←BL 结束 MOV AX,X OR AX,AX JE ZERO JNS PLUS MOV BL,0FFH JMP EXIT ZERO: MOV BL,0 JMP EXIT PLUS: MOV BL,1 EXIT: MOV Y,BL MOV AH,4CH INT 21H CODE ENDS END BEGIN 查看网络课件
小结:1、各种转移指令的作用及其应用2、三分支程序的设计方法小结:1、各种转移指令的作用及其应用2、三分支程序的设计方法 • 课后思考:1、让X直接与0比较,程序应该如何设计2、简单的三分支程序可以转化为两个二分支,较复杂的情况或者更多分支的程序如何设计? • 课后作业:P198 第7题、在线测试一(3、5、6、8、※17) • 实验:实验二 循环和分支结构程序设计
AL≥0 AL=0 AL=0FFH AL←1 Y ←AL 开始 N Y DATA SEGMENT X DB -18 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE ,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 JGE BIGE MOV AL,0FFH JMP OUTY BIGE: JE OUTY MOV AL,1 OUTY: MOV Y,AL MOV AH,4CH INT 21H CODE ENDS END START BIGE Y N OUTY 结束
TABLE XX YY 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H 0009H 000AH 000BH 0 1 4 9 16 25 36 49 64 81 5 0 DATA SEGMENT TABLE DB 0,1,4,9,16,25,36,49,64,81 XX DB 5 YY DB ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV BX,0 MOV BL,[XX] MOV AL,TABLE[BX] MOV [YY],AL MOV AH,4CH INT 21H CODE ENDS END START BX→
TABLE XX YY 0000H 0001H 0002H 0003H 0004H 0005H 0006H 0007H 0008H …… 00 00 01 00 04 00 09 00 16 …… 3 0 DATA SEGMENT TABLE DW 0,1,4,9,16,25,36,49,64,81 XX DW 3 YY DW ? DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AX,0 MOV BX,0 MOV BX,[XX] SHL BX,1 MOV AX,TABLE[BX] MOV [YY],AX MOV AH,4CH INT 21H CODE ENDS END START BX→
例:比较两个带符号数的大小,若A>B,则显示“A>B”,否则显示“B>A” 。 • 问题分析: 将定义在内存单元的两个数据取出,进行比较,并将比较结果显示在屏幕上。 参考程序如下: stack segment stack dw 64 dup(?) stack ends data segment a db 100 b db 34h data ends code segment assume cs:code,ds:data,ss:stack start:mov ax,data mov ds,ax DOS功能调用
mov al,a cmp al,b jge agb mov dl,‘b' mov bl,‘a' jmp disp agb: mov dl,‘a' mov bl,‘b' disp: mov ah,2 int 21h mov dl,'>' int 21h mov dl,bl int 21h mov ah,4ch int 21h code ends end start 开始 AL←A N Y AL>B? AGB DL←’A’,BL←’B’ DL←’B’,BL←’A’ 显示比较结果 结束
cmp al,x jae yes mov dl,x mov bl,y jmp disp yes: mov dl,y mov bl,x disp: mov ah,2 int 21h mov dl,'>' int 21h mov dl,bl int 21h mov ah,4ch int 21h code ends end begin data segment x db ? y db ? code segment assume cs:code,ds:data begin:mov ax,data mov ds,ax mov ah,7 int 21h mov x,al mov ah,7 int 21h mov y,al
5.4 循环程序设计 • 循环程序的基本结构 • 循环程序设计 • 多重循环程序设计
循环程序的4个部分 • 循环初始化部分 • 循环体 • 循环控制修改部分 • 循环控制部分
循环程序设计 循环程序设计示例: • 二进制数转成十六进制数并显示; • 分离正、负数并对负数计数; • 统计一个15位数中0的个数; • 在指定的内存单元中查找字符串; • 统计字符串的长度;
多重循环程序设计 • 定义 • 范例 循环体中包含循环结构的程序称为多重循环程序,又称循环程序的嵌套。 • 冒泡排序程序; • 软件延时程序;
5.5 子程序(过程)的设计方法 子程序(过程)的设计 子程序(过程)的调用 参数传递的方法
子程序(过程)的定义 • 子程序含义及子程序的嵌套 • 格式 在程序中被多次调用的程序称为子程序(过程)。子程序又可以再调用另一个子程序,这样的情况称为子程序的嵌套。 过程名 PROC[NEAR 或 FAR] … 过程体语句 RET 过程名 ENDP
在同一代码段内,这时应取NEAR属性 • 在同一源程序模块,但在不同代码段内,这时应取FAR属性 • 在不同的源程序模块且代码段段名也不同的段内,这时应取FAR属性,并需用PUBLIC和EXTRN伪指令语句说明 • 一个过程既有同一代码段调用又有不同代码段调用,这时应取FAR属性。且段内调用的CALL语句最好取如下格式: • CALL FAR PTR 过程名 调用程序与子程序的存放关系
子程序(过程)设计 • 子程序设计在原则上的注意事项 • 子程序(过程)的适应范围 • 多次重复使用的程序段 • 具有通用性的程序段 • 具有特殊功能的程序段 • 模块化程序结构中的子模块 • 中断服务程序
参数传递的方法 • 利用寄存器传递参数 • 利用内存缓冲区传递参数 • 利用堆栈区传递参数