?第 6章 汇编语言程序设计
第 6章 汇编语言程序设计
本章学习目标
本章详细讲述汇编语言程序设计的基本步
骤, 通过实例分析说明程序的基本结构, 按照
程序设计的基本步骤设计各种结构程序的方法,
主要有,
? 汇编语言程序设计基本步骤
? 顺序程序的基本结构和设计方法
? 分支程序的基本结构和设计方法
? 循环程序的结构形式和程序设计
?子程序设计的基本过程和设计方法
?第 6章 汇编语言程序设计
第 6章 汇编语言程序设计
6.1 汇编语言程序设计基本方法和基本步骤
6.2 顺序程序的结构形式和程序设计
6.3 分支程序的结构形式和程序设计
6.4 循环程序的结构和程序设计
6.5 子程序结构与设计方法
开 始
?第 6章 汇编语言程序设计
6.1 汇编语言程序设计基本方法和基本步骤
6.1.1 汇编语言程序设计基本步骤
6.1.2 结构化程序的概念
6.1.3 流程图画法规定
返回本章首页
?第 6章 汇编语言程序设计
6.1.1 汇编语言程序设计的一般步骤
汇编语言程序设计一般有以下几个步骤,
1.分析问题,抽象出描述问题的数学模型
2,确定解决问题的算法或解题思想
3,绘制流程图和结构图
4,分配存储空间和工作单元
5,编制程序
6,程序静态检查
7,上机调试
返回本节
?第 6章 汇编语言程序设计
6.1.2 结构化程序的概念
所谓结构化程序设计是指程序的设计, 编写和
测试都采用一种规定的组织形式进行, 而不是想怎
么写就怎么写 。 这样, 可使编制的程序结构清晰,
易于读懂, 易于调试和修改, 充分显示出模块化程
序设计的优点 。
在 20世纪 70年代初, 由 Boehm和 Jacobi提出并
证明的结构定理:即任何程序都可以由 3种基本结构
程序构成结构化程序, 这 3种结构是:顺序结构, 分
支 ( 条件选择 ) 结构和循环结构 。 每一个结构只有
一个入口和一个出口, 3种结构的任意组合和嵌套就
构成了结构化的程序 。
?第 6章 汇编语言程序设计
1,顺序结构
顺序结构是按照语句实现的先后次序执行
一系列的操作,它没有分支、循环和转移
2,分支结构 ( 条件选择结构 )
分支结构根据不同情况做出判断和选择,
以便执行不同的程序段。分支的意思是在两个
或多个不同的操作中选择其中的一个。分为双
分支结构和多分支结构
?第 6章 汇编语言程序设计
3,循环结构
循环结构是重复执行一系列操作,直到
某个条件出现为止。循环实际上是分支结构
的一种扩展,循环是否继续是依靠条件判断
语句来完成的。按照条件判断的位置,可以
把循环分为“当型循环”和“直到型循环”。
第一种情况是先作条件判断,第二种情况是
先执行一次循环,然后判断是否继续循环。
基本逻辑图下图所示。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
6.1.3 流程图画法规定
1,流程图的概念
流程图是由特定的几何图形, 指向线, 文字说明
来表示数据处理的步骤, 形象描述逻辑控制结构
以及数据流程的示意图 。 流程图具有简洁, 明了,
直观的特点 。
2.流程图符号表示
( 1)起止框:表示程序
的开始和结束。
?起止框
?第 6章 汇编语言程序设计
( 2)判断框
( 3)处理框
( 4)调用框
?第 6章 汇编语言程序设计
( 5)指向线
( 6)连接框
返回本节
?第 6章 汇编语言程序设计
6.2 顺序程序设计
下面举例说明顺序程序的设计 。
【 例 6.1】 试编写一程序计算以下表达式的值 。
w =( v-( x *y +z -540)) /x
式中 x,y, z, v均为有符号字数据 。
设x, y, z, v的值存放在字变量X, Y, Z, V中,
结果存放在双字变量W之中, 程序的流程图如图 6.1
所示 。
返回本章首页
?第 6章 汇编语言程序设计
?
图
6.
1
顺
序
运
算
程
序
流
程
图
?第 6章 汇编语言程序设计
源程序如下,
DATA SEGMENT
X DW 200
Y DW 100
Z DW 3000
V DW 10000
W DW 2 DUP(? )
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS,STACK
?第 6章 汇编语言程序设计
START,MOV AX,DATA
MOV DS,AX ; DATA→ AX
MOV AX,X
IMULY ; ( X) *( Y) → DX,AX
MOV CX,AX
MOV BX,DX ; ( DX,AX) → ( BX,CX)
MOV AX,Z
CWD ; ( Z) 符号扩展
ADD CX,AX
ADC BX,DX ; ( BX,CX) +( DX,AX) → ( BX,CX)
SUB CX,540
SBB BX,0 ; ( BX,CX) -540→ ( BX,CX)
MOV AX,V
?第 6章 汇编语言程序设计
CWD ; ( V) 符号扩展
SUB AX,CX
SBB DX,BX ; ( DX,AX) -( BX,CX) → ( DX:
AX)
IDIV X ; ( DX,AX) /X
MOV W,AX ;商 → W
MOV W+2,DX ;余数 DX→ W+2
MOV AH,4CH
INT 21H
CODE ENDS ;退出 DOS 状态
END START
?第 6章 汇编语言程序设计
【 例 6.2】
【 例 6.2】 已知某班学生的英语成绩按学号 ( 从
1开始 ) 从小到大的顺序排列在 TAB表中, 要
查的学生的学号放在变量 NO中, 查表结果放
在变量 ENGLISH中 。 编写程序如下,
?第 6章 汇编语言程序设计
STACK SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
DATA SEGMENT
TAB DB 80,85,86,71,79,96
DB 83,56,32,66,78。 84
NO DB 10
ENGLIST DB?
DATA ENDS
CODE SEGMENT
?第 6章 汇编语言程序设计
ASSUME DS,DATA,SS,STACK,CS,CODE
BEGIN,MOV AX,DATA
MOV DS, AX
LEA BX,TAB
MOV AL,NO
DEL AL
XLAT TAB
MOV ENGLISH,AL
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
?第 6章 汇编语言程序设计
6.3 分支程序的结构和程序设计
6.3.1 分支程序的结构形式
6.3.2 分支结构的程序设计
返回本章首页
?第 6章 汇编语言程序设计
6.3.1 分支程序的结构形式
8086/8088指令系统具有许多种条件转移
指令, 这就说明 8086/8088计算机系统具有
很强的逻辑判断能力, 并且能够根据这种逻
辑判断选择执行不同的程序段 。 也就是说,
当条件满足时进行某种处理, 当条件不满足
时又进行另外一种处理 。
分支程序的结构可以有两种形式:双分
支结构和多分支结构。
流程图如下所示。
?第 6章 汇编语言程序设计
( 1)双分支结构
?第 6章 汇编语言程序设计
( 2)双分支结构
?第 6章 汇编语言程序设计
( 3)多分支结构程序设计
?第 6章 汇编语言程序设计
6.3.2 分支结构程序设计
1.简单的双分支程序设计
【 例 6.3】 已知在内存中有一个字节单元 NUM,存有带
符号数据,要求计算出它的绝对值后,放入
RESULT单元中。
题目分析:根据数学中绝对值的概念知道,一个
正数的绝对值是它本身,而一个负数的绝对值是它
的相反数;要计算一个数的相反数,需要完成减法
运算,即用 0减去这个数。 8086/8088指令系统中有
专门的求相反数的指令 NEG。
流程图如下,
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
?DATA SEGMENT
? X DB -25
? RESULT DB?
?DATA ENDS
?CODE SEGMENT
? ASSUME DS:DATA,CS:CODE
?START,MOV AX,DATA
? MOV DS,AX ;初始化
? MOV AL,X ; X取到 AL中
?第 6章 汇编语言程序设计
? TEST AL,80H ;测试 AL正负
? JZ NEXT ;为正, 转 NEXT
? NEG AL ;否则 AL求补
?NEXT,MOV RESULT,AL ;送结果
? MOV AH,4CH
? INT 21H ;返回 DOS
?CODE ENDS
END START ;汇编结束
?第 6章 汇编语言程序设计
2.多分支程序设计
多分支结构是有若干个条件, 每一个条件对应一
个基本操作 。 分支程序就是判断产生的条件, 哪个条
件成立, 就执行哪个条件对应操作的程序段 。 也就是
说, 从若干分支中选择一个分支执行 。
多分支结构实现的方法有:条件选择法, 转移表
法和地址表法 。
条件选择法
一个条件选择指令可实现两路分支,多个条件选
择指令就可以实现多路分支。这种方法适用于分支数
较少的情况。
?第 6章 汇编语言程序设计
用条件转移指令实现程序分支
【 例 6.4】 编写计算下面函数值的程序,
1 X> 0
Y= 0 X=0
-1 X
设输入数据为 X,输出数据 Y,且皆为字
节变量 。 程序流程图如下图所示 。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
DATA SEGMENT
X DB -25
Y DB?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX ;初始化
MOV AL,X ; X取到 AL中
?第 6章 汇编语言程序设计
CMP AL,0 ; Al中内容和 0比较
JGE BIG ;大于等于 0,转 BIG
MOV BL,-1 ;否则为负数, - 1送 BL
JMP EXIT ;转到结束位置
BIG,JE EE ; Al中内容是否为 0,为 0转 EE
MOV BL,1 ;否则为大于 0,1送 BL
JMP EXIT ;转到结束位置
EE,MOV BL,0 ; 0送 BL
?第 6章 汇编语言程序设计
EXIT,MOV Y,BL ; BL中内容送 Y单元
MOV AH,4CH
INT 21H ; 程序结束
CODE ENDS
END START ; 汇编结束
?第 6章 汇编语言程序设计
【 例 6.5】
【 例 6.5】 试编一程序, 求三个带符号字数
据中的最大值, 并将最大值存入 MAX字单
元中 。
设三个带符号数分别在三个字变量 X,Y、
Z中存储。程序流程图如下图 所示
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
STAC SEGMENT STACK
DB 200 DUP( 0)
STACK ENDS
DATA SEGMENT
X DW 00ABH
Y DW –5
Z DW 200
MAX DW?
DATA ENDS
CODE SEGMENT
?第 6章 汇编语言程序设计
ASSUME DS,DATA,SS,STACK,CS,CODE
START,MOV AX,DATA
MOV DS,AX
MOV AX,X
CMP AX,Y ; X> Y?
JG L1
MOV AX,Y ; Y> Z?
CMP AX,Z
JG EXIT
L2,MOV AX,Z
JMP EXIT
?第 6章 汇编语言程序设计
L1,CMP AX,Z ; X> Z?
JLE L2
EXIT,MOV MAX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START
返回本节
?第 6章 汇编语言程序设计
转移表法
转移方法实现多分支的设计思想如下,
把转移到各分支程序段的转移指令依次
放在一张表中, 这张表称为转移表 。 把离表
首单元的偏移量作为条件来判断各分支转移
指令在表中的位置 。 当进行多分支条件判断
时, 把当前的条件 —偏移量加上表首地址作
为转移地址, 转移到表中的相应位置, 继续
执行无条件转移指令, 达到多分支的目的 。
?第 6章 汇编语言程序设计
【 例 6.6】 设某程序有 8路分支, 试根据给定的
N值 ( 1~8), 将程序的执行转移到其中的一
路分支 。
程序流程如图 下 所示。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
DATA SEGMENT
TAB DW P1,P2,P3,P4,P5,P6,P7,P8
N DB 5
DATA ENDS
STACK SEGMENT
DB 200 DUP( 0)
STACK ENDS
CODE SEGMENT
ASSUME DS,DATA,SS,STACK,CS,CODE
?第 6章 汇编语言程序设计
START,MOV AX,DATA
MOV DS,AX
┆
MOV AL,N
DEL AL
ADD AL,AL
MOV BM,AL
MOV BH,0
JMP TAB[BX]
?第 6章 汇编语言程序设计
P1,……
┆
JMP EXIT
P2,……
┆
JMP EXIT
P2,……
┆
JMP EXIT
P3,……
┆
?第 6章 汇编语言程序设计
JMP EXIT
┆
P8,……
┆
EXIT,MOV AH,4CH
INT 21H
CODE ENDS
END START
上述程序中的无条件转移指令的转移地址采用的
是变址寻址 。 同理, 转移地址也可以用寄存器间接寻
址或基址加变址寻址, 读者可自行考虑 。
返回本节
?第 6章 汇编语言程序设计
6.4 循环程序设计
6.4.1 循环程序的结构
6.4.2 循环程序的设计方法
返回本章首页
?第 6章 汇编语言程序设计
6.4.1 循环程序的结构
1,循环结构的组成
2,循环程序的结构
3,循环程序控制方法
?第 6章 汇编语言程序设计
1,循环程序的组成
( 1)循环初始化部分
( 2)循环体
( 3)循环参数修改部分
( 4)循环控制部分
?第 6章 汇编语言程序设计
2.循环程序的结构
在程序设计中, 常见的循环结构有两
种:一种是先执行循环体, 然后判断循环是
否继续进行;另一种是先判断是否符合循环
条件, 符合则执行循环体, 否则退出循环 。
两种循环结构如下图所示 。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
3.循环控制的方法
( 1)计数控制法
( 2) 条件控制法
( 3)混合控制法
?第 6章 汇编语言程序设计
6.4.2 循环程序设计方法
1,单循环程序设计
2,多重循环程序设计
?第 6章 汇编语言程序设计
1.单循环程序设计
【 例 6.7】 已知有几个元素存放在以 BUF为首址
的字节存贮区中, 试统计其中正元素的个数 。
显然, 每个元素为一个 8位有符号二进制数,
统计其中正元素的个数可用循环程序实现 。
其程序流程图如下图所示 。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
【 例 6.8】
【 例 6.8】 编写程序完成求 1+ 2+ 3+ …… N的
累加和, 直到累加和超过 1000为止 。 统计被
累加的自然数的个数送 CN单元, 累加和送
SUM。 流程图如下图所示 。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
DATA SEGMENT
SUM DW?
CN DW?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START,MOV AX,DATA
MOV DS,AX ;初始化
MOV AX,0 ; 0送 AX
?第 6章 汇编语言程序设计
MOV BX,0 ; 0送 BX
LP,INC BX ; BX加 1
ADD AX,BX ;求累加和
CMP AX,1000 ;比较
JBE LP ; ≤1000转
MOV SUM,AX
MOV CN,BX ;送结果
MOV AH,4CH
INT 21H ;返回 DOS
CODE ENDS
END START ;汇编结束
?第 6章 汇编语言程序设计
2,多重循环程序设计
【 例 6.9】 在以 BUF为首址的字存储区中存放有 N个有符号数,
现需将它们按大到小的顺序排列在 BUF存储区中, 试编写
其程序 。
我们采用冒泡排序算法从第一个数开始依次对相邻两
个数进行比较, 如次序对, 则不交换两数位置;如次序不
对则使这两个数交换位置 。 可以看出, 第一遍需比较 ( N-
1) 次, 此时, 最小的数已经放到了最后;第二遍比较只
需考虑剩下的 ( N-1) 个数, 即只需比较 ( N-2) 次;第三
遍只需比较 ( N-3) 次, …… 整个排序过程最多需 ( N-1)
遍 。 如下面的 4个数即是采用冒泡排序比较的例子 。
?第 6章 汇编语言程序设计
数 10 8 16 90 32
第一遍 10 16 90 32 8
第二遍 16 90 32 10 8
第三遍 90 32 16 10 8
程序流程图如图 4.9所示 。
?第 6章 汇编语言程序设计
?第 6章 汇编语言程序设计
程序如下,
DATA SEGMENT
BUF DW 3,-4,6,7,9,2,0,-8,-9,-10,20
N=( $ -BUF) /2
DATA ENDS
STACK SEGNMENT STACK
DB 200 DUP( 0)
STACK ENDS
CODE SEGMENT
ASSUME CS,CODE,DS,DATA,SS,STACK
?第 6章 汇编语言程序设计
START,MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1,MOV DX,CX
MOV BX,0
LOOP2,MOV AX,BUF[BX]
CMP AX,BUF[BX+2]
JGE L
XCHG AX,BUF[BX+2]
MOV BUF[BX],AX
?第 6章 汇编语言程序设计
L,ADD BX,2
DEC CX
JNE LOOP2
MOV CX,DX
LOOP LOOP1
MOV AH,4CH
INT 21H
CODE ENDS
END START
?第 6章 汇编语言程序设计
程序运行后, BUF区中的内容如下,
20,9,7,6,3,2,0,-4,-8,-9,-10
若要对 N个无符号数按由大到小的顺序排列,
只需将指令,JGE L”改为,JAE L”即可。
返回本节
?第 6章 汇编语言程序设计
6.4 子程序结构与设计方法
6.4.1 子程序的基本概念
6.4.2 子程序的结构
6.4.3 子程序的定义和参数传递
6.4.4 子程序应用举例
返回本章首页
?第 6章 汇编语言程序设计
6.4.1 子程序的概念
在程序设计中, 我们会发现一些多次无
规律重复的程序段或语句序列 。 解决此类问
题一个行之有效的方法就是将它们设计成可
供反复调用的独立的子程序结构, 以便在需
要时调用 。 在汇编语言中, 子程序又称过程 。
调用子程序的程序称为主调程序或主程序。
返回本节
?第 6章 汇编语言程序设计
6.4.2 子程序的结构
子程序的基本结构包括以下几个部分,
( 1) 子程序说明
( 2) 保护现场和恢复现场
( 3) 子程序体
( 4) 子程序返回
返回本节
?第 6章 汇编语言程序设计
6.4.3 子程序的定义和参数传递
1,子程序的定义
子程序的定义是由过程定义伪指令 PROC和 ENDP来完成的 。
其格式如下,
过程名 PROC [NEAR/FAR]
┆
过程名 ENDP
其中 PROC表示过程定义开始, ENDP表示过程定义结束 。
过程名是过程入口地址的符号表示 。
一般过程名同标号一样,具有三种属性,即段属性、偏
移地址属性以及类型属性。
?第 6章 汇编语言程序设计
2.主程序与子程序参数传递方式
( 1) 寄存器法
( 2) 约定单元法
( 3) 堆栈法
返回本节
?第 6章 汇编语言程序设计
6.4.4 子程序应用举例
【 例 6.10】 将一个给定的二进制数按位转换成
相应的 ASCII码字符串, 送到指定的存储单
元并显示 。 如二进制数 10010011转换成字符
串为 ‘ 10010011’。 要求将转换过程写成子
程序, 且子程序应具有较好的通用性, 而必
须能实现对 8倍和 16倍二进制数的转换 。
?第 6章 汇编语言程序设计
入口参数,DX存放待转换的二进制数
CX存放待转换数的位数 ( 8位或 16位 )
DI存放 ASCII码首地址
出口参数:转换后的字符串存放在以 DI作指针的字节存贮区中
程序如下,
DATA SEGMENT
NUM8 DB 93H
NUM16 DW 0ABCDH
ASCBUF DB 20 DUP( 0)
DATA ENDS
?第 6章 汇编语言程序设计
CODE SEGMENT
ASSUME DS,DATA,CS,CODE,SS,STACK
START,MOV AX,DATA
MOV DS,AX
MOV DX,0
MOV DL,NUM8 ;转换二进制数送 DX
MOV CX,8 ;置位数 8
LEA DI,ASCBUF ;字符串首址 → DI
CALL BTASC ;调用子程序 BTASC
MOV [DI],BYTE PTR 0DH
MOV [DI+1],BYTE PTR 0AH
?第 6章 汇编语言程序设计
MOV [DI+2],BYTE PTR ‘$’
LEA DX,ASCBUF
MOV AH,9
INT 21H
MOV DX,NUM16
MOV CX,16 ;置位数 16
LEA DI,ASCBUF
CALL BTASC
MOV [DL],BYTE PTR 0DH
MOV [DL+1],BYTE PTR 0AH
MOV [DL+2],BYTE PTR ‘$ ’ ; 显示转换后的字符串
LEA DX,ASCBUF
MOV AH,9
INT 21H
?第 6章 汇编语言程序设计
BTASC PROC
PUSH AX ;保存 AX
MOV AL,0
CMP CX,8 ;比较 8位数
JNE L1 ;直接转换 16位数
MOV DH,DL ; 8位数转换送 DH
L1,ROL DX,,1 ; DX最高位移入 CF
RCL AL,1 ; CF移入 AL最低位
ADD AL,30H
MOV [DI],AL
?第 6章 汇编语言程序设计
INC DI
LOOP L1
POP AX
RET
BTASC ENDP
CODE ENDS
END START
返回本节
?第 6章 汇编语言程序设计
Thank you very much !
本章到此结束,谢谢您的光临 !
返回本章首页 结 束