汇编语言程序设计方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第四章汇编语言程序设计方法
第一节汇编语言程序设计
1、程序设计语言
1)、机器语言
直接用二进制数表示指令和数据的最原始的程序设计语言。
2)、汇编语言
用助计符来表示的面向机器的程序设计语言。
用汇编语言编制的程序须要用“人工汇编”或“机器汇编”将其翻译成机器语言,才能被机器认识。
3)、高级语言
高级语言是一种面向过程而独立于计算机硬件结构的通用计算机语言。
如FORTRAN、PASCAL、C语言等。
注意:①机器语言直接面对机器,实时性好,但难以编出较复杂的程序,现基本上被汇编语言代替;
②汇编语言是目前单片机初学者采用的一种编程方法,它具有实时性强,对较复杂的程序也能编制。
③高级语言它面向过程易于编制复杂程序,具有通用性好,程序简单,但它要求占用较大的内存空间,实时性差,目前从事单片机的开发和研究工作须掌握这种方法。
2、汇编语言的规范
1)、汇编语言源程序的格式
标号:操作码目的操作数,源操作数;注释
2)、汇编语言伪指令
①ORG----起始地址伪指令;
功能:用来规定目标程序或数据的起始地址。
格式:[标号:] ORG 16位地址
说明:在一个程序中允许有多个ORG指令,以规定不同程序段的起始位置。
②END-----汇编结束伪指令;
功能:用来告诉汇编程序,此源程序到此结束。
格式:[标号:] END
说明:在一个程序中有且只有一个END指令。
例如:ORG 1000H
START:MOV A,B
JNB ACC.7,DONE
CPL A
DONE:MOV B,A
END
③EQU----赋值伪指令;
格式:字符名称EQU 数或汇编符号
功能:将右边值赋给左边用户定义的字符
说明:a、由EQU赋的字符可以作数值、数据地址、代码地址。
b、由EQU伪指令所定义的符号必须先定义后使用。
例如:SDGFG EQU 58H ;表示SDGFG=58H
④DB----定义字节伪指令;
格式:[标号:] DB 8位(二进制)数据表。
功能:用于告诉汇编程序从指定的地址单元开始,定义若干个字节存储单元的内容。
说明:a、数据表可以是二进制数也可以是ASCⅡ编码,数据之间用逗号分开,ASC
Ⅱ要加单引号,如C,要写成‘C’。
b、它只适应程序存储器。
例如:ORG 1000H
MOV A,#55H
DB 34H,67H,89H,70H
执行后的结果如图1所示
⑤、DW------定义值伪指令;
功能:用来告诉汇编程序从指定的地址单元开始,定义
若干个16位数据(二进制)。
格式:[标号:] DW 字常数或ASC Ⅱ字符 说明:a 、字常数可以是8位也可以是更多位。
b 、尽管在存储数据的形式上与DB 相同但使用不一样,DB 后面只能跟8位的数据或ASC Ⅱ字符。
C 、它只适应程序存储器。
d 、单个DW 、DB 定义的数表个数不得超过80个,多于80个数据应用多个指令完成
例如: ORG 1000H
PIOI :DW 5678H ,1234H ,2379H
结果如图2所示。
⑥、TA-----数据地址赋值伪指令; 格式:字符名称 DATA 表达式
功能:它的功能是给标号段中的标号赋以数值。
说明:a 、本语句与EQU 相似,但本语句可以先用后定义;
b 、在程序中它常用来定义数据地址。
⑦、BIT-----位地址赋值伪指令; 格式:字符名称 BIT 位地址
功能:用于告诉汇编程序,把位地址赋予规定的字符名称,用于位处理程序中。
例如: X0 BIT P1.0 3、汇编语言程序设计方法
1)、程序设计过程 ①建立数学模型 ②选择适当的算法 ③编制程序流程图 ④汇编语言程序设计 ⑤汇编语言程序调试 2)、程序流程图
①程序流程图的作用
能直观形象地表示各部分的逻辑关系及程序结构,它是设计程序特别是复杂程序的重要工具。
②程序流程图的组成
●端点框
表示,可在内填上相应文字。
●流程线
表示程序的组向,用方向键表示。
●处理框
表示一种处理功能;框内用文字说明。
用不
●判断框
用表示,该框用于指示一个判定点,从这点产生分支,在框内就注明测试条件,而测试结果应注明在各分支流程线上。
●连接框
连接框用表示,它表示流程中止而并非流程结束。
通常用来辟免流程线交叉,在流程图中标识相同的连接框表示流程相连。
●子程序框
用表示,该框表示调用子程序。
在该框内填入相应的子程序名称或入口地址。
③程序流程图的设计
程序流程图的设计将在具体的程序设计方法中针对具体的例子加以介绍。
第二节顺序与循环程序设计方法
1、顺序程序设计
1)、顺序结构程序设计方法
建立数学模型画程序流程图编写汇编程序
2)、应用举例
例1:设有16位二进制数存放在R0、R1中(R0存放高位),试编写实现16位二进制数“取反加1”的操作程序。
解法1:程序流程如图3所示,程序如下:
ORG 1000H
START:MOV A,R1
CPL A
ADD A,#01H
MOV R1,A
MOV A,R0
CPL A
ADDC A,#00H
MOV R0,A
END
解法2:通过将R0、R1分别送DPTR的高低字节,然后利用INC DPTR实现加1,
取反后再用:CPL A这样的指令实现。
例2:设在8031单片机内部RAM的40H单元中存放8位二进制数,要求将其转换
成相应BCD码并由高位的顺序存入内部RAM以60H为首址的3个连续单元中,试编写
相应程序:
解:本题的关键是如何将二进制数转换成BCD码。
由数学变换知:8位二进制/100=BCD码的百位数
余数/10= BCD码的十位数
余数= BCD个位数
程序如下:ORG 1000H
BINBCD:MOV R0,#60H
MOV A,40H
MOV B,#100
DIV AB ;整数存于A中
MOV @R0, A
INC R0
MOV A,#10
XCH A, B
DIV AB
MOV @R0, A
INC R0
XCH A, B
MOV @R0,A
END
思考题:对于任意一个16进制表示的数,如AB9EF087,存放在以20H为首址的单元中,如何将其转化成BCD码?
2、循环程序设计方法
1)、循环结构程序的组成
①初始化部分:它是用来设置循环初始化状态,如设置地址指针、循环计数器初值等。
②循环处理部分:它是重复执行的数据处理程序。
③循环控制部分:它通过检测循环次数或循环结束条件从而控制程序循环继续与否。
④结束部分:它是对结果分析处理和存放结果。
2)、循环程序设计方法
(1)单循环程序设计方法
①循环次数是已知的循环程序设计
先分析要解决的问题,建立解决问题的数学模型,然后编写出对应的程序,按已知条件设置程序循环次数。
②循环次数未知的循环程序设计
先分析要解决的问题,建立解决问题的数学模型,确定待测定循环的参数,在编程过程中,选取合适的判别语句控制程序的循环。
(2)多循环程序设计方法
多循环程序设计除必须满足单循环程序设计的规则外,尚须符合循环不允许交叉的规定。
3)、应用举例
单循环程序设计举例:
例1:已知80C51单片机使用6MHZ 晶振,要求设计一个软件延时程序,延时时间为
10ms 。
分析:晶振为6MHZ 的单片机一个机器周期为2us , 如果采用循环方法,控制程序循环次数,就可以实现定时功能。
如图4为程序流程。
如程序如下:
周期数 ORG 2000H
1 MOV R0,#0AH ;毫秒数 1 DL2:MOV R1,#MT 1 DL1:NOP 1 NOP
2 DJNZ R1,DL1 2 DJNZ R0,DL2
END
定时值的确定:
(1+1+2)×2us ×MT=1000us
MT=7DH
例2:用P1口作为数据读入口,为了读取稳定的值,要求连续读8次,然后取平均值。
分析:设R0、R1作为连续8次累加的16位工作寄存器,且R0存放高位,R1存放低位,在二进制数的运算中,×2=二进制数左移一位,÷2=二进制数右移一位。
因此本例中÷8=将数向右移3次。
程序流程如图5,程序如下: 程序: ORG 2000H MOV R0,#00H M0V R1,#00H
MOV R2。
#08H
LP2:MOV P1,#0FFH MOV A ,P1 ADD A ,R1 JNC LP1 INC R0
LP1:MOV R1,A DJNZ R2,LP2
MOV R2,#03H 图5 程序流程图 CLR C
LP3:MOV A ,R0 RRC A MOV R0,A MOV A ,R1 RRC A MOV R1,A DJNZ R2,LP3
LP :SJMP LP END
注意:二进制数乘法、除法的计算方法 例3:从22H 单元开始有一无符号数据块,其长度放在20H 单元中,求出数据快中最大值,并将
其放在21H 单元。
分析:采用比较法,先设A=00H ,然后依次取数与A 中的值比较,若所比较的数比A 大则用
所
取数替代A 中的数。
程序流程如图6,程序如下:
程序: ORG 2000H CLR A
MOV R2,20H
MOV R1,#22H
L P:CLR C
SUBB A,@R1
JNC NEXT
MOV A, @R1
SJMP NEXT1
NEX T:ADD A,@R1
NEXT1:INC R1
DJNZ R2,LP
MOV 21H,A
LP1:SJMP LP1 图6 程序流程图
END
第三节分支程序设计方法
1、分支结构的理论基础
①计算机具有逻辑判断能力,这是计算机实现分支程序的理论基础;
②条件转移指令和比较指令是计算机实现分支程序的具体体现;
2、分支程序设计过程
①建立数学模型
②选择确定分支条件
③设计程序流程和用适当的语句设计程序
3、分支程序设计方法
1)、无条件转移程序设计
这种程序转移方向是设计者事先安排的,它所使用的转移语句是无条件转移语句。
例如:在系统诊断程序中,设置,当发生故障时,系统将无条件停机。
2)、条件转移程序设计方法
它是根据执行程序对标志位或累加器或对内部RAM某位的影响结果,决定程序的走
向、形成各种分支。
在编写程序时要注意两点:
①选择适合的语句和安排可供判别的条件
②正确选定所用的转移条件和转移目标地址
例如:警情从单片机的P1.0输入,当系统检测到有警情发生时,立即调用拨号子程序,试编制实现上述过程的程序。
分析:设拨号程序为TAB,主程序为NAME,则程序如下、程序流程如图所示
程序:
ORG 1000H
NAME:SETB P1.0
JNB NAME
LJMP TAB
TA B:………
………
END
3)、散转程序设计方法
采用散转指令实现散转
散转指令为:JMP @A+DPTR 图7 程序流程图
实现方法:
✧将要转移的地址在程序存储器中按照某种规律编一个表,以便使用散转指令
✧在转移地址处用AJMP或LJMP等指令转到相应的处理程序
举例说明:
根据R7的内容,转向各个操作程序;
R7=0 转入OPR0
R7=1 转入OPR1
…………………………
R7=N 转入OPRN
解;程序流程如图8,程序如下:
JUMP1:MOV DPTR,#JPTAB1
MOV A,R7
ADD A,R7
JNC NOAD
INC DPH
NOAD:JMP @A+DPTR
JPTAB1:AJMP OPR0
AJMP OPR1
……………
AJMP OPRN
END 图8 程序流程图
第四节查表程序设计
1、查表指令
在80C51单片机汇编语言中有两条查表指令:
MOVC A,@A+DPTR;
MOVC A,@A+PC
由于PC是不断改变的值,通常在查表指令中使用MOVC A,@A+DPTR指令。
2、变量的查表程序设计
1)、单字节查表法
在程序存储器表格中,每个存储单元是一个数据。
例如:设计一个将十六进制转换成ASCⅡ码的子程序,设十六进制数存放在R0中的低4位,要求将转换后的ASCⅡ码送回R0中。
分析:0~9的ASCⅡ为30H—39H;AH—FH的ASCⅡ为41H—46H;表格设在程序存储器某一地址为首址的连续单元中存放30H---46H;查表使用:MOVC A,@A+DPTR。
程序:ORG 2000H
MOV A,R0
ANL A,#0FH
MOV A,#02H
MOVC A,@A+DPTR
MOV R0,A
DB 30H,31H,32H
……
END
第五节子程序设计
1、定义
在程序中反复用到的一段操作,将这一段程序独立编制供主程序调用,这这一段程序称为子程序。
2、子程序设计方法
1)、子程序的设计步骤
①确定子程序的名称,即其入口处的标号
②确定子程序的入口参数及出口参数
③确定所使用的寄存器和存储器单元
④确定子程序的算法、编写源程序
2)、子程序及其调用程序的设计
子程序是满足某一功能的须要而设计的,因此子程序的设计方法与程序的设计方法基本相同,不同的地方是要在程序的开始部分明确子程序入口地址,即子程序名;在出口用RET返回指令。
程序的设计中可以采用寄存器、寄存器间址、堆栈等作为主程序与子程序的数据传送方式。
3、子程序嵌套
子程序与主程序以及子程序与子程序之间的嵌套关系可用下图10表示:
图10 子程序嵌套示意图
4、举例说明
用程序实现C=a2+b2。
设a、b均为小于10。
A存31H单元中,b存32H单元中,把结果C存入33H中单元。
分析:依题意可以将某数的平方作为一个子程序,计算C=a2+b2只要两次调用子程序即可,程序如下:
ORG 2000H
START:MOV SP,#3FH ;设堆栈针
MOV A,31H ;取a值
LCALL SQR ;计算a2
MOV R1,A
MOV A,32H ;取b值
LCALL SQR
ADD A,R1
MOV 33H,A
SJMP ¥
子程序:
ORG 2400H
SQR:INC A
MOVC A,@A+PC
RET。