《《汇编程序设计》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《汇编程序设计》PPT课件.ppt(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第4章:汇编语言程序设计章:汇编语言程序设计本章基本要求:本章基本要求:汇编语言的构成汇编语言的构成源程序的设计与汇编源程序的设计与汇编*应用程序设计应用程序设计*4.14.1汇编语言的构成汇编语言的构成4.1.14.1.1程序设计语言程序设计语言用用户户要要使使计计算算机机能能完完成成各各式式各各样样的的任任务务,就就要要设设计计各各种种相相应应的的应应用用程程序序,而而设设计计程程序序就就要要用用到到程序设计语言。程序设计语言。程序设计语言有程序设计语言有3 3种种:机器语言机器语言汇编语言汇编语言高级语言。高级语言。4.14.1汇编语言的构成汇编语言的构成1 1、机器语言、机器语言计计
2、算算机机能能直直接接识识别别和和执执行行的的二二进进制制代代码码形形式式的的指指令令称称为为机机器器指指令令,而而该该类类指指令令的的集集合合称称为为计计算算机机的的机机器器语语言言,或或称称指指令令系系统统。机机器器语语言言是是面面向向计计算算机机系系统统的的。由由于于各各种种计计算算机机内内部部结结构构,线线路路的的不不同同,每每种种计计算算机机系系统统都都有有它它自自己己的的机机器器语语言言,即使执行同一操作即使执行同一操作,其指令也不相同。其指令也不相同。4.14.1汇编语言的构成汇编语言的构成2 2、汇编语言、汇编语言计计算算机机所所能能执执行行的的每每条条指指令令都都对对应应一一组
3、组二二进进制制代代码码。为为了了容容易易理理解解和和记记忆忆计计算算机机的的指指令令,人人们们用用一一些些英英语语的的单单词词和和字字符符以以及及数数字字作作为为助助记记符符来来描描述述每每一一条条指指令令的的功功能能。用用助助记记符符描描述述的的指指令令系系统统,称为机器的汇编语言系统称为机器的汇编语言系统,简称汇编语言。简称汇编语言。汇汇编编语语言言也也是是面面向向机机器器的的,每每种种计计算算机机系系统统也也都都有有它它自自己己的的汇汇编编语语言言,用用汇汇编编语语言言编编写写的的程程序序,称为汇编语言源程序或汇编源程序。称为汇编语言源程序或汇编源程序。4.14.1汇编语言的构成汇编语言
4、的构成3 3、高级语言、高级语言 高高级级语语言言(如如:PASCAL:PASCAL、C C、FORTRANFORTRAN、BASICBASIC等等)克克服服了了汇汇编编语语言言的的缺缺点点,是是一一种种面面向向问问题题或或过过程程的的语语言言。它它是是一一种种接接近近于于自自然然语语言言和和数数学学算算法法的的语语言言,与与机机器器的的硬硬件件无无关关,用用户户编编程程时时不不必必仔仔细细了了解解所所用用计计算算机机的的具具体体性性能能和和指指令令系系统统。高高级级语语言言不不但但直直观观、易易学学、易易懂懂,而而且且通通用用性性强强,可可以以在在不不同同的计算机上运行的计算机上运行,因此可
5、移植性好。因此可移植性好。4.14.1汇编语言的构成汇编语言的构成表表4-1 4-1 机器语言和汇编语言的形式机器语言和汇编语言的形式地址地址机器语言形式机器语言形式汇编语言形式汇编语言形式二进制形式二进制形式十六进十六进制形式制形式2000H0111010000000101B7405HSTART:MOVA,#05H2002H0020010000001010B240AHADDA,#0AH2004H1111010100100000BF520HMOV20H,A2006H1000000011111110B80FEHSJMP$机机器器语语言言中中二二进进制制形形式式不不便便记记忆忆,常常采采用用十十六
6、进制形式记忆六进制形式记忆4.14.1汇编语言的构成汇编语言的构成在在KeilKeil调试环境下反汇编程序调试环境下反汇编程序1 1、汇编源程序:、汇编源程序:2 2、反汇编程序:、反汇编程序:地址地址机器码机器码反汇编程序反汇编程序汇编源程序汇编源程序4.14.1汇编语言的构成汇编语言的构成4.1.24.1.2汇编语言格式汇编语言格式MCS51MCS51系系列列单单片片机机是是用用5151系系列列单单片片机机的的指指令令系系统统来来编编程程的的,其其汇汇编编语语言言的的语语句句格格式式,也也就就是是单单片机的指令格式片机的指令格式,即即:标号标号:操作码操作码 操作数操作数 ;注释注释说明:
7、说明:1 1、内的部分为可选项;内的部分为可选项;2 2、标标号号是是一一条条指指令令在在存存储储器器存存放放的的地地址址,是是以以字字母开头的字母数字串,不可以是保留字;母开头的字母数字串,不可以是保留字;3 3、操作码和操作数必须按照指令格式书写;、操作码和操作数必须按照指令格式书写;4.14.1汇编语言的构成汇编语言的构成举例:举例:ORG ORG0060H0060H START:MOV START:MOV A,#00H ;A0A,#00H ;A0MOV R2,#0AH ;R210MOV R2,#0AH ;R210MOVMOVR1,#03H ;R13R1,#03H ;R13 LOOP:A
8、DD LOOP:ADDA,R1 ;AA+R1A,R1 ;AA+R1 DJNZ R2,LOOP ;DJNZ R2,LOOP ;若若R2-10,R2-10,则跳到则跳到LOOPLOOP NOP NOP SJMP$SJMP$END END4.14.1汇编语言的构成汇编语言的构成4 4、操作数可以写成以下形式(、操作数可以写成以下形式(5 5种种-128-128页):页):二进制、十进制、十六进制形式二进制、十进制、十六进制形式工作寄存器、特殊功能寄存器。如:工作寄存器、特殊功能寄存器。如:R0-R7R0-R7、A A地址标号。如:地址标号。如:M(MM(M已在某处定义过)已在某处定义过)带带加加减减
9、算算符符的的表表达达式式。如如:M+1 M+1 M(MM(M已已在在某某处处定定义过)义过)采用采用符如:符如:JNBTF0,$4.14.1汇编语言的构成汇编语言的构成举例:举例:MOV A,#00110101B ;A53 MOV A,#00110101B ;A53 MOV MOV A,#20D ;A20A,#20D ;A20 MOV A,#20 ;A20 MOV A,#20 ;A20 MOV R0,#20H ;R020HMOV R0,#20H ;R020HMOVMOVR1,#0BFH ;R1BFHR1,#0BFH ;R1BFH SJMP$;SJMP$;原地跳转原地跳转 MOV R7,R2 ;
10、R7R2 MOV R7,R2 ;R7R2 MOV A,LABLE ;A MOV A,LABLE ;A标号地址标号地址 MOV A,LABLE+1 ;A MOV A,LABLE+1 ;A标号地址标号地址+1+1 4.14.1汇编语言的构成汇编语言的构成4.1.34.1.3汇编语言构成汇编语言构成汇编语言语句分为:指令性语句、指示性语句两类。汇编语言语句分为:指令性语句、指示性语句两类。1 1、指令性语句、指令性语句包包括括指指令令系系统统中中的的全全部部指指令令,每每条条指指令令有有对对应应的机器代码,并可由的机器代码,并可由CPUCPU执行。执行。2 2、指示性语句、指示性语句在在汇汇编编源源
11、程程序序的的过过程程中中,还还有有一一些些指指令令不不要要求求CPUCPU进进行行任任何何操操作作,也也没没有有对对应应的的机机器器码码,不不影影响响程程序序的的执执行行,仅仅仅仅是是能能够够指指导导汇汇编编进进行行处处理理的的一一些些指指令令,称之为伪指令。称之为伪指令。4.14.1汇编语言的构成汇编语言的构成伪伪指指令令的的主主要要功功能能是是:用用来来指指定定程程序序或或数数据据的的起起始始位位置置,给给出出一一些些连连续续存存放放数数据据的的确确定定地地址址,或或为为中中间间运运算算结结果果保保留留一一部部分分存存储储空空间间以以及及表表示示源源程序结束等等。程序结束等等。不不同同版版
12、本本的的汇汇编编语语言言,伪伪指指令令的的符符号号和和含含义义可可能有所不同能有所不同,但是基本用法是相似的。但是基本用法是相似的。下面介绍几种常用的基本伪指令。下面介绍几种常用的基本伪指令。MCS-51MCS-51单片机伪单片机伪指令指令伪指令仅在汇编过程中起控制作用不产生伪指令仅在汇编过程中起控制作用不产生可执行可执行目标代码,又称为软指令目标代码,又称为软指令1、起点指令、起点指令 ORG格式:格式:ORG H (16位地址或标号)位地址或标号)功能:功能:给程序给程序起始地址起始地址或数据块的或数据块的起始地址起始地址赋值赋值例:例:用法:用法:一般出现在每段源程序或数据块的开始一般出
13、现在每段源程序或数据块的开始一个源程序可多次出现一个源程序可多次出现ORG指令指令ORG 2000HSTART:MOV A,#64H ;源程序的起始地址源程序的起始地址为为2000H首地址首地址首地址首地址2、结束命令、结束命令 END格式:格式:END功能:汇编程序结束标志功能:汇编程序结束标志附在一个源程序的结尾附在一个源程序的结尾 一个源程序只能出现一次一个源程序只能出现一次END指令指令用法:用法:MCS-51MCS-51单片机伪单片机伪指令指令3、等值命令、等值命令 EQU格式:格式:字符名称字符名称 EQU 数据或汇编符号数据或汇编符号功能:功能:将一个数据或将一个数据或汇编符号汇
14、编符号(如如R0R0等等)赋予标赋予标号段规定的字符名称号段规定的字符名称例:例:ORG 8000H AA EQU R6MOV A,AA;AA与与R6等值等值;A (R6)MCS-51MCS-51单片机伪单片机伪指令指令例例:A10 EQU 10DELY EQU 07EBH MOV A,A10 LCALL DELY;A10=10;DELY=07EBH;转向入口地址;转向入口地址 07EBH使用使用EQU指令,须先赋值后使用,不能反之指令,须先赋值后使用,不能反之4、数据地址赋值等值命令、数据地址赋值等值命令 DATA格式:格式:字符名称字符名称 DATA 数据或表达式数据或表达式功能:功能:此
15、命令把数据此命令把数据/代码地址赋予标号段所规定的代码地址赋予标号段所规定的字符名称。定义的字符名称可先使用后定义字符名称。定义的字符名称可先使用后定义INDEXJ XDATA 8096H 16位地址需要用位地址需要用XDATAORG 8000HINDEXJ XDATA 8096H LJMP INDEXJENDORG 8000H LJMP 8096HEND;INDEXJ这个字符名称的地址为这个字符名称的地址为8096H例:例:等等价价于于MCS-51MCS-51单片机伪单片机伪指令指令 EQU与与 DATA的区别的区别(1)DATA与与EQU相似,但相似,但DATA定义的字符名称定义的字符名称
16、,可先使用后定义可先使用后定义,EQU则不能则不能(2)EQU指令可把汇编符号指令可把汇编符号(如如Rn)赋给字符名赋给字符名称,称,DATA则不能则不能 (3)DATA可把表达式的值赋给字符名称,可把表达式的值赋给字符名称,EQU则不能则不能 DATA常在程序中定义常在程序中定义数据地址数据地址EQU常在程序中定义常在程序中定义字符数据字符数据 MCS-51MCS-51单片机伪单片机伪指令指令5、定义字节命令、定义字节命令 DB格式:格式:功能:功能:标号:标号:DB 字节常数或字符串字节常数或字符串 (8 8位)位)定义字节的内容,汇编程序把定义字节的内容,汇编程序把DB定义的定义的字节依
17、次存入字节依次存入标号开始标号开始的存储单元的存储单元有定义的内存单元有定义的内存单元地址地址项或项表项或项表例:例:ORG 8000HTAB:DB 45H,73,5,ATAB1:DB 101B伪指令伪指令ORG 定义了定义了TAB的起始地址为的起始地址为8000H,伪指令伪指令DB定义了定义了8000H8003单元的内容依次为:单元的内容依次为:(8000H)=45H(8001H)=49H(8002H)=35H(8003H)=41H(8004H)=05HTABTAB1(1)由由 ORG定义定义(2)跟在其他源程序之后跟在其他源程序之后6、定义字命令、定义字命令DW格式:格式:功能:功能:标号
18、:标号:DW 字或字表字或字表定义若干个字(双字节)定义若干个字(双字节)例:例:ORG 8000HTAB:DW 7234H,8AH,10(8000H)=72H(8001H)=34H(8002H)=00H(8003H)=8AH(8005H)=0AH高高8位位在前低在前低8位在后位在后汇编后:汇编后:(8004H)=00HMCS-51MCS-51单片机伪单片机伪指令指令7、定义空间命令、定义空间命令 DS格式:格式:功能:功能:标号:标号:DS 数据或字符数据或字符及及表达式表达式例:例:(8008H)=30H(8009H)=8AH从指定单元地址开始,由数据或字符及从指定单元地址开始,由数据或字
19、符及表达式的值来定义应保留的单元数表达式的值来定义应保留的单元数,备用备用ORG 8000HDS 08HDB 30H,8AH即:即:8000H8007H单元保留备用单元保留备用定义空定义空间间MCS-51MCS-51单片机伪单片机伪指令指令8、位地址符号命令、位地址符号命令 BIT格式:格式:字符名称字符名称 BIT 位地址位地址功能:功能:把位地址赋予标号段的字符名称把位地址赋予标号段的字符名称 A1 BIT P1.0A2 BIT P2.0例:例:;,;,赋予位地址字符名称赋予位地址字符名称 A1、A2,在编程时可以直接把,在编程时可以直接把 A1、A2 当成位地址使用当成位地址使用MCS-
20、51MCS-51单片机伪单片机伪指令指令4.2汇编源程序的设计与汇编汇编源程序的设计与汇编4.2.14.2.1 汇编程序设计步骤汇编程序设计步骤1 1、确定方案和计算方法、确定方案和计算方法2 2、了解应用系统的硬件配置、性能指标。、了解应用系统的硬件配置、性能指标。3 3、建立系统数学模型,确定控制算法和操作步骤。、建立系统数学模型,确定控制算法和操作步骤。4 4、画程序流程图,表示程序结构和程序功能。、画程序流程图,表示程序结构和程序功能。5 5、编制源程序、编制源程序 合理分配存储器单元和了解合理分配存储器单元和了解I/OI/O接口地址。接口地址。按功能设计程序,明确各程序之间的相互关系
21、。按功能设计程序,明确各程序之间的相互关系。用注释行说明程序,便于阅读和修改调试和修改。用注释行说明程序,便于阅读和修改调试和修改。6 6、上机调试,对程序的正确性作最后的确定。、上机调试,对程序的正确性作最后的确定。4.2汇编源程序的设计与汇编汇编源程序的设计与汇编程序设计步骤流程:程序设计步骤流程:拟制设计任务书拟制设计任务书建立或修改数学模型建立或修改数学模型确定算法确定算法编制或修改流程图编制或修改流程图编制或修改程序编制或修改程序汇编通过?汇编通过?上机调试上机调试调试通过?调试通过?程序有大问题?程序有大问题?试运行通过?试运行通过?完成完成Y YN NY YY YY YN NN
22、NN N4.2汇编源程序的设计与汇编汇编源程序的设计与汇编4.2.24.2.2 源程序的汇编源程序的汇编CPUCPU可可以以执执行行的的只只能能是是机机器器码码程程序序。称称:把把源源程程序序翻翻译译成成机机器器码码的的过过程程为为汇汇编编。汇汇编编可可:人人工工汇汇编编和和机机器器汇汇编编两类。两类。1 1、人工汇编、人工汇编由人工直接将汇编源程序翻译成机器码。由人工直接将汇编源程序翻译成机器码。2 2、机器汇编、机器汇编使使用用计计算算机机执执行行“汇汇编编程程序序”来来代代替替人人工工实实现现将将汇汇编编源程序翻译成机器码。源程序翻译成机器码。汇编语言汇编语言源程序源程序机器语言机器语言
23、 汇编汇编 反汇编反汇编汇编汇编汇编程序的操作汇编程序的操作分两次扫描(汇编)分两次扫描(汇编)第一次扫描(汇编)第一次扫描(汇编)检查语法结构,对源程序检查语法结构,对源程序中的符号、表达式、标号中的符号、表达式、标号进行定义,处理伪指令,进行定义,处理伪指令,建立符号表建立符号表显示显示 ERROR,并提示行号,并提示行号显示显示 ERROR,并提示行号,并提示行号修改!修改!修改!修改!第二次扫描(汇编)第二次扫描(汇编)汇编成目标代码和汇编程序汇编成目标代码和汇编程序清单清单可执行的代码(机器码)可执行的代码(机器码)例例4.1 4.1 设设在在内内部部RAMRAM的的BLOCKBLO
24、CK单单元元内内有有一一无无符符号号数数据据块块的的长长度度,无无符符号号数数据据块块起起始始地地址址是是BLOCK+1BLOCK+1。试试编编程程求求无无符符号号数数据据块块中中数数据据的的累累加加和和(不考虑进位不考虑进位加法之和),并把它存入加法之和),并把它存入SUMSUM单元。单元。程序:程序:ORGORG1000H1000H SUM SUMDATADATA1FH1FH BLOCK BLOCKDATA DATA 20H20H START:START:MOVMOVR0,#BLOCK ;R0,#BLOCK ;数据块长度地址送数据块长度地址送R0R0MOVMOVA,R0 ;A,R0 ;数据
25、块长度送数据块长度送A ACJNECJNEA,#00H,LOOP;A,#00H,LOOP;若数据块长度若数据块长度00,则,则LOOPLOOP HERE:HERE:SJMPSJMP$;$;若数据块长度若数据块长度=0=0,则结束,则结束 LOOP:LOOP:CLRCLRA A NEXT:NEXT:INC R0 ;INC R0 ;修改数据指针修改数据指针ADDADDA,R0 ;A,R0 ;加一个数加一个数DJNZ DJNZ BLOCK,NEXT;BLOCK,NEXT;若(若(BLOCKBLOCK)-1 0,-1 0,则则NEXTNEXT MOV MOV SUM,A ;SUM,A ;存累加和存累加
26、和 SJMP HERE SJMP HERE END END汇编程序经两次汇编得机器码汇编程序经两次汇编得机器码 第一次汇编第一次汇编 第二次汇编第二次汇编 地址地址指令码指令码标号标号指令助记符指令助记符1000H1000H7820H7820HSTARTSTARTMOV R0,#BLOCKMOV R0,#BLOCK1002H1002HE6HE6HMOV A,R0MOV A,R01003H1003HB400LOOPB400LOOPCJNE A,#00H,LOOPCJNE A,#00H,LOOP1006H1006H80$80$HEREHERESJMP$SJMP$1008H1008HE4HE4HLO
27、OPLOOPCLR ACLR A1009H1009H08H08HNEXTNEXTINC R0INC R0100AH100AH26H26HADD A,R0ADD A,R0100BH100BHD520NEXTD520NEXTDJNZ BLOCK,NEXTDJNZ BLOCK,NEXT100EH100EHF51FHF51FHMOV SUM,AMOV SUM,A1010H1010H80 HERE80 HERESJMP HERESJMP HERE地址地址指令码指令码标号标号指令助记符指令助记符1000H1000H7820H7820HSTARTSTARTMOV R0,#BLOCKMOV R0,#BLOCK
28、1002H1002HE6HE6HMOV A,R0MOV A,R01003H1003HB40002B40002CJNE A,#00H,LOOPCJNE A,#00H,LOOP1006H1006H80 FEH80 FEHHEREHERESJMP$SJMP$1008H1008HE4HE4HLOOPLOOPCLR ACLR A1009H1009H08H08HNEXTNEXTINC R0INC R0100AH100AH26H26HADD A,R0ADD A,R0100BH100BHD520FBHD520FBHDJNZ BLOCK,NEXTDJNZ BLOCK,NEXT100EH100EHF51FHF51
29、FHMOV SUM,AMOV SUM,A1010H1010H80 F4H80 F4HSJMP HERESJMP HERE转移转移地址地址计算计算LOOP=1008H-1003H-3=02H;NEXT=1009H-100BH-3=-5=0FBHLOOP=1008H-1003H-3=02H;NEXT=1009H-100BH-3=-5=0FBH$=1006H-1006H-2=-2=0FEH;HERE=1006H-1010H-2=-12=0F4H$=1006H-1006H-2=-2=0FEH;HERE=1006H-1010H-2=-12=0F4H偏移地址偏移地址偏移地址偏移地址=指令所在地址指令所在地
30、址指令所在地址指令所在地址-跳转地址跳转地址跳转地址跳转地址-指令字节数指令字节数指令字节数指令字节数4.3简单程序与分支程序设计简单程序与分支程序设计4.3.14.3.1简单程序设计简单程序设计 例例4.24.2请请编编写写能能把把20H20H单单元元内内两两个个BCDBCD数数变变成成相相应应的的ASCIIASCII码码并并放放在在21H21H(高高位位BCDBCD数的数的ASCIIASCII码)和码)和22H 22H(低位(低位BCDBCD数的数的ASCIIASCII码)单元的程序。码)单元的程序。程序:程序:ORG 0500H ORG 0500H MOV R0,#22H ;R0=22H
31、 MOV R0,#22H ;R0=22H MOV R0,#00H ;(22H)=0 MOV R0,#00H ;(22H)=0 MOV A,20H ;A(20H)BCD MOV A,20H ;A(20H)BCD码码 XCHD A,R0 ;XCHD A,R0 ;低位低位BCDBCD码与码与22H22H半字节交换半字节交换 ORL 22H,#30H ;ORL 22H,#30H ;加加30H30H完成完成ASCIIASCII码变换码变换 SWAP A ;SWAP A ;高位高位BCDBCD码高低位半字节交换码高低位半字节交换 ORL A,#30H ;ORL A,#30H ;加加30H30H完成完成AS
32、CIIASCII码变换码变换 MOV 21H,A ;MOV 21H,A ;存入存入21H21H单元单元 SJMP$SJMP$END END 例例4.34.3已已知知一一个个补补码码形形式式的的1616位位二二进进制制(低低8 8位位在在NUMNUM单单元元,高高8 8位位在在NUM+1NUM+1单元),试编写能求该单元),试编写能求该1616位二进制数原码的绝对值得程序。位二进制数原码的绝对值得程序。程序:程序:ORG 0300H ORG 0300H NUM DATA 20H NUM DATA 20H MOV R0,#NUM ;R0=NUM MOV R0,#NUM ;R0=NUM MOV A
33、MOV A,R0 ;R0 ;低低8 8位送入位送入A A CPL A ;A CPL A ;A求反求反 ADD A ADD A,#01H ;A#01H ;A中内容变补,保留中内容变补,保留CYCY MOV R0,A ;MOV R0,A ;存数存数 INC R0 ;INC R0 ;地址加地址加1 1,指向高,指向高8 8位位 MOV A,R0 ;MOV A,R0 ;高高8 8位送入位送入A A CPL A ;CPL A ;取反取反 ADDC A,#00H ;ADDC A,#00H ;加进位加进位 ANL A,#7FH ;ANL A,#7FH ;去掉符号位去掉符号位(多余)多余)MOV R0,A ;
34、MOV R0,A ;存数存数 SJMP$SJMP$END END4.3简单程序与分支程序设计简单程序与分支程序设计 例例4.44.4已已知知20H20H单单元元中中有有一一个个8 8位位二二进进制制数数,请请编编程程把把它它转转换换为为3 3位位BCDBCD数数,把把百百位位数数存存入入FIRSTFIRST单单元元的的低低4 4位位,十十位位和和个个位位BCDBCD数数放放在在SECONDSECOND单单元元,十位十位BCDBCD数在数在SECONDSECOND单元的高单元的高4 4位。位。程序:程序:ORG 0200H ORG 0200H FIRST DATA 30H FIRST DATA
35、30H SECOND DATA 31H SECOND DATA 31H MOV A,20H ;A=(20H)MOV A,20H ;A=(20H)MOV B,#64H ;MOV B,#64H ;除数除数100 100 DIV AB ;A/100 DIV AB ;A/100 MOV FIRST,A ;MOV FIRST,A ;低低8 8位送入位送入A A MOV A,B ;MOV A,B ;余数送余数送A A MOV B,#0AH ;MOV B,#0AH ;除数除数1010 DIV AB ;A/10 DIV AB ;A/10 SWAP A ;SWAP A ;十位十位BCDBCD送高送高4 4位位
36、ORL A,B ;ORL A,B ;完成十位和个位装配完成十位和个位装配 MOV SECOND,A ;MOV SECOND,A ;存入存入SECONDSECOND单元单元 SJMP$SJMP$END END4.3简单程序与分支程序设计简单程序与分支程序设计4.3.24.3.2分支程序设计分支程序设计可可分分为为无无条条件件和和有有条条件件分分支支程程序序两两类类。重重点点以以条件分支举例。条件分支举例。例例4.5 4.5 已已知知VARVAR单单元元内内有有一一自自变变量量,请请按按如如下下条条件件编编出出求函数值求函数值Y,Y,并将它存入并将它存入FUNCFUNC单元的程序。单元的程序。1
37、X0 1 X0 Y=0 X=0 Y=0 X=0 -1 X0 -1 X0?A-1存结果A 1程序:程序:ORG 0100HORG 0100H VAR DATA 30H VAR DATA 30H FUNC DATA 31H FUNC DATA 31H MOV A,VAR ;AX MOV A,VAR ;AX JZ DONE ;JZ DONE ;若若=0=0,则转,则转DONEDONE JNB ACC.7,POSI;JNB ACC.7,POSI;若若00,则转,则转POSIPOSI MOV A,#0FFH ;MOV A,#0FFH ;若若00,则,则A-1 A-1 SJMP DONE ;SJMP DO
38、NE ;转转DONEDONE POSI:MOV A,#01H ;POSI:MOV A,#01H ;则则A 1A 1 DONE:MOV FUNC,A ;DONE:MOV FUNC,A ;存结果存结果 SJMP$SJMP$END ENDY YY YN NN N一个判断决策框,程序有两条出路。两种分支结构:一个判断决策框,程序有两条出路。两种分支结构:条件满足?N影响条件Y处理段条件满足?N影响条件Y处理1处理2练习:练习:求求R2R2中补码绝对值,正数不变,负数变补。中补码绝对值,正数不变,负数变补。MOV A MOV A,R2R2,NEXT NEXT;为正数?;为正数?CPL ACPL A ;负
39、数变补;负数变补 INC AINC A MOV R2MOV R2,A ANEXTNEXT:SJMP NEXT SJMP NEXT ;结束;结束 END END练习:练习:某系有某系有200200名学生参加外语统考,若成绩已存放在外名学生参加外语统考,若成绩已存放在外部部RAMRAM起始地址为起始地址为ENGLISHENGLISH的连续存储单元,现决定给成绩在的连续存储单元,现决定给成绩在95-10095-100分之间的学生颁发分之间的学生颁发A A级合格证书,并给成绩在级合格证书,并给成绩在90-9490-94分之分之间的学生颁布间的学生颁布B B级合格证书。试编写程序,统计获得级合格证书。试
40、编写程序,统计获得A A级和级和B B级级证书的学生人数,并把统计结果存入内存证书的学生人数,并把统计结果存入内存RAMRAM的的GRADAGRADA和和GRADBGRADB单元。单元。1441444.4循环与查表程序设计循环与查表程序设计4.4.14.4.1 循环程序设计循环程序设计循循环环程程序序一一般般由由四四部部分分组组成成:循循环环初初始始化化、循循环环处处理理、循环控制、循环结束。循环控制、循环结束。循环程序一般使用两种结构,如下图:循环程序一般使用两种结构,如下图:初始化循环处理循环控制循环结束完成?NY初始化循环处理循环控制循环结束完成?NY循环程序的构成循环程序的构成各个环节
41、任务:一初始化部分一初始化部分 循环准备工作。如:清结果单元、设指针、设循环控制变量初值等。二循环体二循环体 循环工作部分:需多次重复处理的工作。循环控制部分:1.修改指针和循环控制变量。2.检测循环条件:满足循环条件,继续循环,否则退出循环。三三.结束部分结束部分 处理和保存循环结果。允许0次循环的循环结构:在循环工作之前检测循环条件。4.4循环与查表程序设计循环与查表程序设计一、单重循环一、单重循环例例:求求n n个个单单字字节节数数据据的的累累加加,设设数数据据串串已已在在43H43H起起始始单单元元,数数据据串串长长度度在在42H42H单元,累加和不超过单元,累加和不超过2 2个字节。
42、个字节。SUMSUM:MOVMOVR0R0,#42H#42H;设指针;设指针MOVMOVA A,R0R0MOVMOVR2R2,A A ;循环计数器;循环计数器nnCLRCLRA A ;结果单元清;结果单元清0 0MOVMOVR3R3,A AADD1ADD1:INC INCR0R0 ;修改指针;修改指针ADDADDA A,R0 R0 ;累加;累加JNC NEXTJNC NEXT ;处理进位;处理进位INCINCR3R3 ;有进位,高字节加;有进位,高字节加1 1NEXT:NEXT:DJNZ DJNZ R2,ADD1 R2,ADD1 ;循环控制:数据是否加完;循环控制:数据是否加完?MOVMOV4
43、0H40H,A A ;循环结束,保存结果;循环结束,保存结果MOVMOV41H41H,R3R3RETRET简单循环结构:循环体中不套循环。找找正正数数表表最最小小值值。正正数数表表存存在在片片外外RAMRAM中中以以LISTLIST为为起起始始单单元元,用用-1-1作作为结束标志。为结束标志。STARTSTART:MOV DPTR MOV DPTR,#LIST#LIST ;数表首地址;数表首地址 MOV B MOV B,#127#127 ;预置最小值;预置最小值NEXTNEXT:MOVX A MOVX A,DPTRDPTR ;取数;取数 INC DPTR INC DPTR ;修改指针;修改指针
44、 CJNE A CJNE A,#-1#-1,NEXT1 NEXT1 ;是否为数表结尾?;是否为数表结尾?SJMP DONE SJMP DONE ;循环结束;循环结束NEXT1NEXT1:CJNE A CJNE A,B B,NEXT2NEXT2 ;比较;比较NEXT2NEXT2:JNC NEXT JNC NEXT MOV B MOV B,A A ;保存较小值;保存较小值 SJMP NEXT SJMP NEXTDONEDONE:SJMP DONE SJMP DONE练习:练习:二、多重循环二、多重循环例将内存一串单字节无符号数升序排序。例将内存一串单字节无符号数升序排序。步骤:步骤:每次取相邻单元
45、的两个数比较,决定是否需要交换数据位置。每次取相邻单元的两个数比较,决定是否需要交换数据位置。第一次循环,比较第一次循环,比较N-1N-1次,取到数据表中最大值。次,取到数据表中最大值。第二次循环,比较第二次循环,比较N-2N-2次,取到次大值。次,取到次大值。第第N-1N-1次循环:比较一次,排序结束。次循环:比较一次,排序结束。内循环控制内循环控制?循环工作循环工作循环结束循环结束外循环控制外循环控制?内循环初始化内循环初始化开始开始外循环初始化外循环初始化循环体中套循环结构。以双重循环使用较多。SORTSORT:MOV MOV A A,#N-1#N-1;N N个数据排序个数据排序 MOV
46、 MOV R4 R4,A A ;外循环次数;外循环次数LOOP1LOOP1:MOV MOV A A,R4R4 MOV MOV R3 R3,A A ;内循环次数;内循环次数 MOV MOV R0 R0,#TAB#TAB;设数据指针;设数据指针LOOP2LOOP2:MOV MOV A A,R0R0 ;取二数;取二数 MOV MOV B B,A A INC INC R0 R0 MOV MOV A A,R0R0 CJNE A CJNE A,B B,L1L1;比较;比较L1L1:JNC JNC UNEX UNEX;ABAB,不交换,不交换 DEC DEC R0 R0;否则交换数据;否则交换数据 XCH
47、XCH A A,R0R0UNEXUNEX:INC INC R0 R0 MOV MOV R0 R0,A A DJNZ R3 DJNZ R3,LOOP2LOOP2;内循环结束?;内循环结束?DJNZ R4 DJNZ R4,LOOP1LOOP1;外循环结束?;外循环结束?RET RETR3R31=0?B(R0)A (R0+1)循环结束循环结束外循环次数外循环次数R4R4R41=0?内循环次数内循环次数R3表首表首TABR0开始开始A BA B?(R0)(R0+1)(R0)(R0+1)R0 R0+1R0 R0+1Y YN N4.4循环与查表程序设计循环与查表程序设计4.4.24.4.2查表程序设计查表
48、程序设计所所谓谓查查表表是是依依据据ROMROM中中的的数数据据表表格格的的项项数数来来查查找与之对应的表中数值。找与之对应的表中数值。有两条专门的查表指令:有两条专门的查表指令:MOVCMOVC A,A+DPTRA,A+DPTRMOVCMOVC A,A+PCA,A+PC查查表表指指令令一一般般用用于于代代码码转转换换、显显示示、散散转转等等应应用场合。用场合。当用当用DPTRDPTR作基址寄存器时,查表的步骤分三步:作基址寄存器时,查表的步骤分三步:基址值(表格首地址)基址值(表格首地址)DPTRDPTR;变址值(表中要查的项与表格首地址之间的变址值(表中要查的项与表格首地址之间的间隔字间隔
49、字节数)节数)AA;执行执行MOVC AMOVC A,A+DPTRA+DPTR。当当用用PCPC作作基基址址寄寄存存器器时时,其其表表格格首首地地址址与与PCPC值值间间距距不不能能超超过过256256字字节节,且且编编程程要要事事先先计计算算好好偏偏移移量量,比比较较麻麻烦。因此,一般情况下用烦。因此,一般情况下用DPTRDPTR作基址寄存器。作基址寄存器。例:例:在单片机应用系统中,常用在单片机应用系统中,常用LEDLED数码管显示数码,但显数码管显示数码,但显 示数字示数字(9)9)与显示数字编码并不相同,需要将显示数与显示数字编码并不相同,需要将显示数 字转换为显示字段码,通常是用查表
50、的方法。现要求字转换为显示字段码,通常是用查表的方法。现要求 将将30H30H中的显示数字转换为显示字段码并存入中的显示数字转换为显示字段码并存入30H30H。已。已 知共阴字段码表首址为知共阴字段码表首址为TABDTABD。程序如下:程序如下:CHAG:MOV DPTR,#TABD ;CHAG:MOV DPTR,#TABD ;置共阴字段码表首址置共阴字段码表首址MOV A,30H ;MOV A,30H ;读显示数字读显示数字 MOVC A,A+DPTR ;MOVC A,A+DPTR ;查表查表,转换为显示字段码转换为显示字段码 MOV 30H,A ;MOV 30H,A ;存显示字段码存显示字