第四章 8086汇编语言程序设计.docx
《第四章 8086汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《第四章 8086汇编语言程序设计.docx(26页珍藏版)》请在冰豆网上搜索。
第四章8086汇编语言程序设计
第四章8086汇编语言程序设计
本章共2小节。
主要内容:
1、程序设计分类
2、程序设计举例
重点内容:
顺序程序、分支程序和循环程序
本章学习目标
通过本章的学习,应当掌握以下内容:
•了解汇编语言的基本知识和特点。
•熟悉汇编语言的程序结构、段定义以及语句的格式。
•掌握汇编语言常用伪指令的使用方法。
•熟练掌握汇编语言程序设计的基本方法:
顺序结构、•分支结构、循环结构和子程序结构。
第一节:
机器语言、汇编语言与高级语言
程序设计语言通常分为3类:
机器语言(MachineLanguage)
汇编语言(AssemblerLanguage)
高级语言(HighLevelLanguage)
4、1、1机器语言和汇编语言
1.机器语言
(1)机器指令
机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。
(2)指令系统和机器语言
指令系统是指特定计算机上机器指令的集合。
机器语言是由指令系统以及机器指令的使用规则构成的。
机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。
4、1、1机器语言和汇编语言
1.机器语言
(1)机器指令
机器指令是指用二进制编码的指令,以表示计算机所要进行操作数及操作对象(数据或数据地址)。
(2)指令系统和机器语言
指令系统是指特定计算机上机器指令的集合。
机器语言是由指令系统以及机器指令的使用规则构成的。
机器语言是计算机惟一能识别的语言,只有用机器语言描述的程序,计算机才能直接执行。
(3)机器语言的主要特点
机器语言主要具有下列两个特点:
①机器语言与机器密切相关
②机器语言设计程序非常困难,但容易实现高性能
2.汇编语言
以助记符描述的指令称作汇编格式指令或符号指令,通常简称指令。
指令和伪指令的集合及其程序设计规则便构成了汇编语言。
用汇编语言编写的程序就是汇编语言源程序。
4、1、2汇编语言与高级语言
机器语言和汇编语言都是面向机器的,是低级语言。
高级语言在程序设计的简易性与代码的可移植性等方面有了质的飞跃。
当然,用高级语言编写的源程序必须经过编译和连接,将其转变为可执行程序或借助于解释程序方可在计算机上运行。
汇编语言和高级语言的比较:
语言
汇编语言
高级语言
代码效率
高
较低
源程序可读性
较差
好
对硬件的依附性
高
低
程序员硬件知识
高
较低
应用范围
较广
广泛
1.汇编程序
汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。
汇编程序是完成汇编任务的程序。
2.连接程序
连接程序的主要功能是实现多个目标文件及库文件的连接,并完成浮动地位的重定位。
从汇编语言源程序到可执行程序的生成过程如图所示。
1.汇编程序
汇编是把汇编语言程序翻译成机器语言描述的目标程序的过程。
汇编程序是完成汇编任务的程序。
2.连接程序
连接程序的主要功能是实现多个目标文件及库文件的连接,并完成浮动地位的重定位。
从汇编语言源程序到可执行程序的生成过程如图所示。
v操作数可以有一个,二个或三个操作数,也可以无操作数。
所以指令的一般格式如下所示:
CLCINCBXMOVAL,00H
操作码
(操作数1)
(操作数2)
(操作数3)
1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。
汇编语言一般由四部分组成。
其典型的汇编语句格式:
标号:
操作码操作数;注释
例如:
START:
MOVAL,30H;(AL)=30H
2.汇编语言的语句结构
(1)汇编语言的指令类型
计算机汇编语言,包含两类不同性质的指令。
基本指令:
即指令系统中的指令。
它们都是机器能够执行的指令,每一条指令都有对应的机器码
伪指令:
汇编时用于控制汇编的指令。
它们都是机器不执行的指令,无机器码。
伪指令:
1、符号定义语句
(1)等值语句EQU
格式:
符号名EQU表达式
如:
PORTEQU114
COUNTEQUCX
(2)等号语句=
与EQU类似:
如NUM=3;NUM=NUM+2
(3)ORG:
汇编起始地址命令:
用于规定目标程序的起始地址
格式:
ORG<地址>
如:
ORG8000H
START:
MOVAL,00H
2、数据定义语句
格式:
符号名Dn表达式
Dn形式:
DB:
表达式为一个字节数据
DW:
表达式为一个16位数据
DD:
表达式为一个32位数据
DQ:
表达式为一个4个字数据
DT:
表达式为一个10个字节数据
如:
TABDBC0H,F9H,A4H,B0H
3、段定义语句
格式:
段名SEGMENT
┊
段名ENDS
如:
DATASEGMENT
XDB6(X,Y分别代表一个存储器单元)
YDB?
DATAENDS
DATAASEGMENT
……;数据段内定义各类程序执行需要的相关的数据
DATAAENDS
STACKASEGMENT
……;根据具体程序的需要,定义堆栈段供程序执行过程
;中保持临时数据
STACKAENDS
CODEASEGMENT
ASSUMECS:
CODEA,DS:
DATAA,SS:
STACKA
START:
MOVAX,DATAA
MOVDS,AX
……;完成具体操作的指令序列
CODEAENDS
ENDSTART
第二节汇编语言程序设计特点
一、汇编语言程序特点
1、结构化、简明、易读、易调试、易维护
2、执行速度快
3、占用存储空间少
程序基本结构有4种:
顺序结构、分支结构、循环结构、子程序结构
二、程序设计方法和技巧
(1)采用模块化程序设计方法
应用系统的程序一般由包含多个功能模块的主程序和各种子程序组成。
各程序模块都要完成一个明确的任务,实现某个具体的功能,如:
发送、接收、延时、打印和显示等。
优点:
把一个多功能的复杂的程序划分为若干个简单的、功能单一的程序模块,有利于程序的设计和调试,有利于程序的优化和分工,提高了程序的阅读性和可靠性,使程序的结构层次一目了然。
(2)尽量采用循环结构和子程序
采用循环结构和子程序可以使程序的长度减少、占用内存空间减少。
多重循环,注意各重循环的初值和循环结束条件,避免出现“死循环”现象;
通用的子程序,除了用于存放子程序入口参数的寄存器外,子程序中用到的其它寄存器的内容应压入堆栈进行现场保护,并要特别注意堆栈操作的压入和弹出的平衡;
中断处理子程序除了要保护程序中用到的寄存器外,还应保护标志寄存器。
三、汇编语言程序设计
1.汇编语言程序设计步骤
Ø
(1)分析问题
Ø
(2)确定算法
Ø(3)设计程序流程图
Ø(4)编写汇编语言源程序
第三节汇编语言程序设计
第三节汇编语言程序设计
程序有顺序、循环、分支和子程序4种结构形式。
顺序程序设计,又叫直接程序设计。
它是相对于分支程序和循环程序设计而言的。
因此,可以说顺序程序是既不包含分支,又不包含循环的程序,顺序程序是从第一条指令开始,按其自然顺序,一条指令一条指令地执行,在运行期间,CPU既不跳过某些指令,也不重复执行某些指令,一直执行到最后一条指令为止。
一、顺序程序结构
例1:
求两个16位数相加之和。
这两个数从地址10050H开始连续存放,低位在小地址一端,结果放在两个数之后。
分析题目:
16位数相加,应考虑低8位相加后进位,相加时用ADC指令。
流程图见右图。
内存空间分配:
10050H:
存放被加数低8位;10051H:
存放被加数高8位;10052H:
存放加数低8位
10053H:
存放加数高8位;10054H:
存放和低8位;10055H:
存放和高8位寄存器分配:
DS=1000H;被加数指针SI=50H;加数指针DI=52H;和指针BX=54H
法1:
用字操作
MOVAX,1000H
MOVDS,AX
MOVSI,0050H
MOVDI,0052H
MOVBX,0054H
CLC
XORAX,AX
MOVAX,[SI]
ADCAX,[DI]
MOV[BX],AX
HLT
方法3:
求和:
3456H+ABCDH
DATASEGMENT
XDW3456H
YDW0ABCDH
ZDW0
DATAENDS;设置数据段,取名DATA
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
START:
MOVAX,DATA;取数码段DATA段址至AX
MOVDS,AX;段地址送DS
LEASI,X;将X的有效地址送S1
LEADI,Y;将Y的有效地址送D1
MOVAX,[SI];将X的值送AX
ADDAX,[DI];AX+Y的值送回AX
MOVZ,AX;将AX的值送到存储单元Z
MOVAH,4CH;设置功能号
INT21H;系统功能调用,返回DOS
CODEENDS
ENDSTART
例2:
将内存10050H单元内容拆成两段,每段4位,
并将它们分别存入内存10051H、10052H单元低4位中,
高4位为0。
分析题目:
以(10050H)=7AH为例。
高4位清0,
用到AND指令。
①7AH∧0FH=0AH10051H中
②7AH逻辑右移4位成07H10052H中。
二、分支程序:
条件转移程序
1.分支程序设计概述
分支程序结构可以有两种形式,如下图所示
分支结构程序设计的关键在于准确地知道操作结果影响的标志位状态和正确地使用条件转移指令。
根据对条件的判断而选择不同的处理方法是人的基本智能体现。
例1:
求AX和BX寄存器中两个无符号数之差的绝对值,结果放在内存2800H单元中。
分析题目:
AX、BX中数的大小不知道,只能先判断出大小再减。
例2:
从外设71H号中取一个数M,判断其值是否在10~20之间。
若:
M≥20H,从输出口73H输出0FFH;M<10H,从输出口73H输出00H;10H≤M<20H,从输出口73H输出88H;分析:
需2次判断M大小的问题,先判M是否大于10H,再判M是否大于20H。
三、循环程序设计
有时我们会需要能按一定规律,多次重复执行的一串语句,这类程序叫循环程序
有4部分组成:
1、初始化:
设置循环次数计数器、设定变量和存放数据的内存地址指针,装入初始值等。
2、循环体:
程序处理部分
3、循环控制:
包括修改变量和修改指针,判断循环是否结束。
4、结束处理:
用来分析和存放程序结果
循环程序分为单循环和多重循环,控制方式有计数控制、条件控制、状态控制等。
不管哪一种控制循环方式,最终都是要达到控制循环的目的。
若考虑不周,会造成死循环,这一点要注意。
例1:
求两个8字节数之和,这两个数在10050H地址开始连续存放,低位在小地址一端,结果放在两数之后。
分析:
这是一个重复累加内存单元中数的问题,用循环做。
用16位数相加4次,用8位数相加8次。
(如果是BCD码数相加,则在ADC指令后面加DAA)流程图见下图
例2、把数据区的数据按正、负数分开,并分别送到PLUS-DATA和MINUS-DATA两个缓冲区中.
解:
分析:
1有三个数据区指针设为SI、DI、BX。
2测试每个数的符号位用TEST指令。
程序:
START:
MOVSI,OFFSETBLOCK;源数据区指针SI
MOVDI,OFFSETPLUS-DATA;正数区指针DI
MOVBX,OFFSETMINUS-DATA;负数区指针BX
MOVCX,COUNT;计数器
CLD
GO:
LODSB;从源数据区取数
TESTAL,80H;测试符号
JNZMINUS;是负数转
STOSB;是正数存入正数区中
JMPAGAIN
MINUS:
XCHGBX,DI
STOSB;是负数存入负数区
XCHGBX,DI
AGAIN:
LOOPGO
HLT
例3:
设计一个软件延时程序,延时时间约1ms。
分析题目:
1、此题是想让计算机做一些无用的操作来延时。
我们可选NOP、PUSHF、POPF等指令完成。
2、此题选用PUSHF、POPF、LOOP分别为10个、8个和3个时钟周期,循环体共需要21个时钟周期。
设时钟频率8MHZ,时钟周期则为0.125µs。
则
延时时间1ms
X==≈374次
一次循环时间21*0.125µs
3、程序:
MOVCX,176H(374)
LP1:
PUSHF
POPF
LOOPLP1
HLT
4、延时1s,用双循环
MOVBX,3E8H(1000)
LP2:
MOVCX,176H
LP1:
PUSHF
POPF
LOOPLP1
DECBX
JNZLP2
HLT
四、子程序:
子程序调用与返回由CALL和RET指令实现。
一般是有共用性、重复性或有相对性的程序可设计成子程序。
1、现场保护:
保护调用子程序的现场,
即保护子程序中会用到的寄存器,
将这些寄存器入栈;
2、功能子程序:
子程序要完成的功能;
3、恢复现场:
为了使计算机返回到
主程序调用时的状态,将入栈的数据出栈。
例1:
编写统计X数据中的“1”的个数子程序,并编写主程序调用。
子程序如下:
RET
例1:
编写统计X数据中的“1”的个数子程序,并编写主程序调用。
子程序如下:
ABC:
PUSHBX
PUSHCX
XORBL,BL;累加器BL清0
MOVCX,08H;循环次数送CX
SUM:
SHRAL,1;逻辑右移1位
JNCNONE;CF=0,转移到NONE
INCBL;CF=1,BL+1→BL
NONE:
LOOPSUM
MOVAL,BL;AL里保存的是“1”的统计个数
POPCX
POPBX
RET
例2:
找出一个数据块中的最大数。
其中,数据快长度>1,长度放在内存2001H单元中,而数据块本身从2002H单元开始存放,找出最大数放在2000H单元中。
分析:
是个循环程序,而且在处理部分应包括判断分支环节。
寻找方法:
先用00H放在AL中作为最大值,然后用数据块第一个数与AL比较,将大数放在AL中,再与第二个数继续比较,直到最后AL中是最大数,而数据快总长度就是循环次数。
START:
MOVSI,2001H
MOVCL,[SI]
INCSI初始化
MOVAL,00H
M0VCH,00H
LP:
CLC;清CF
CMPAL,[SI]
JCBB;AL<[SI]转
JMPAA;AL中数大,转至AA
BB:
MOVAL,[SI]
AA:
INCSI
LOOPLP
MOV[2000H],AL
子程序形式:
因为上述程序可作为子程序处理,其中用到的寄存器AX、CX、SI必须先保存。
书中的例题请大家自学:
主要看:
例4-4、4-5、4-6、4-7、4-12、4-13
例如:
有温度控制系统,采集的温度值(Ta)放在累加器AL中,
此外,在10054H单元存放温度下限值(T54),
在10055H单元存放温度上限值(T55)。
若Ta>T55,程序转向JW(降温处理程序);
若Ta〈T54,则程序转向SW(升温处理程序);
若T55≥Ta≥T54,则程序转向FH(返回主程序)。