1、第四章第四章 80C51单片微机的程序设计单片微机的程序设计 4.1概述概述4.1.1 汇编语言格式汇编语言格式 1.计算机语言计算机语言机器语言、汇编语言与高级语言机器语言、汇编语言与高级语言 程序程序:为计算某一算式或完成某一工作的若干指令的有序:为计算某一算式或完成某一工作的若干指令的有序集合。计算机的全部工作概括起来,就是执行这一指令序列的集合。计算机的全部工作概括起来,就是执行这一指令序列的过程。过程。程序设计:程序设计:为计算机准备这一指令序列前的过程。为计算机准备这一指令序列前的过程。机器语言机器语言机器语言系统机器语言系统:用二进制代码表示的指令系统,简称为机器语言。:用二进制
2、代码表示的指令系统,简称为机器语言。直接用机器语言编写的程序称为手编程序或机器语言程序。直接用机器语言编写的程序称为手编程序或机器语言程序。汇编语言汇编语言 在机器语言,这些英文字符被称为在机器语言,这些英文字符被称为助记符助记符。用这种助记符。用这种助记符表示指令系统的语言称为表示指令系统的语言称为汇编语言汇编语言或符号语言,用汇编语言编写或符号语言,用汇编语言编写的程序称为汇编语言程序。特点:的程序称为汇编语言程序。特点:助记符指令与机器指令是助记符指令与机器指令是-对应的,用汇编语言编写的程序效对应的,用汇编语言编写的程序效率高,占用存储空间小,运行速度快,而且能反映计算机的实际率高,占
3、用存储空间小,运行速度快,而且能反映计算机的实际运行情况,所以用汇编语言能编写出最优化的程序。运行情况,所以用汇编语言能编写出最优化的程序。汇编语言是汇编语言是“面向机器面向机器”的语言,编程比使用高级语言困难。的语言,编程比使用高级语言困难。汇编语言能直接访问存储器、输入与输出接口及扩展的各种芯汇编语言能直接访问存储器、输入与输出接口及扩展的各种芯片片(比如比如A/D、D/A等等),也可直接处理中断,汇编语言能直接管理,也可直接处理中断,汇编语言能直接管理和控制硬件设备。和控制硬件设备。汇编语言通用性差,汇编语言和机器语言一样,都面向一台具体汇编语言通用性差,汇编语言和机器语言一样,都面向一
4、台具体的机器,不同的单片微机具有不同的指令系统,并且不能通用。的机器,不同的单片微机具有不同的指令系统,并且不能通用。不能直接识别在汇编语言中出现的字母、数字和符号,需要不能直接识别在汇编语言中出现的字母、数字和符号,需要将其转换成用二进制代码表示的机器语言程序,才能够识别和执行。将其转换成用二进制代码表示的机器语言程序,才能够识别和执行。通常把这一转换(翻译)工作称为通常把这一转换(翻译)工作称为汇编汇编。人工汇编人工汇编:由程序员通过查指令表把汇编指令程序转换为机器语言:由程序员通过查指令表把汇编指令程序转换为机器语言程序的过程。程序的过程。由专门的程序来进行汇编,这种程序称为汇编程序。经
5、汇编程序汇由专门的程序来进行汇编,这种程序称为汇编程序。经汇编程序汇编而得到的机器语言程序,计算机能够识别和执行,这一机机器语编而得到的机器语言程序,计算机能够识别和执行,这一机机器语言程序称为目的程序或言程序称为目的程序或目标程序目标程序,而汇编语言程序称为,而汇编语言程序称为源程序源程序。这。这3者之间的关系如者之间的关系如图图41所示。所示。高级语言高级语言 比如比如BASIC、FORTRAN、COBOL及及PASCAL等,都是等,都是一些参照数学语言而设计的、近似于人们日常用语的语言。通用一些参照数学语言而设计的、近似于人们日常用语的语言。通用性强,易于移植到不同类型的机器中去。计算机
6、也不能直接识别性强,易于移植到不同类型的机器中去。计算机也不能直接识别和执行高级语言,需要将其转换为机器语言才能识别和执行。对和执行高级语言,需要将其转换为机器语言才能识别和执行。对于高级语言,这一转换工作通常称为编译或者解释。进行编译或于高级语言,这一转换工作通常称为编译或者解释。进行编译或者解释的专用程序称为编译程序或者解释程序。者解释的专用程序称为编译程序或者解释程序。由于高级语言不受具体机器的限制,而且使用了许多数学由于高级语言不受具体机器的限制,而且使用了许多数学公式和习惯用语,从而简化了程序设计的过程,因此是一种面向公式和习惯用语,从而简化了程序设计的过程,因此是一种面向问题或者面
7、向过程的语言。问题或者面向过程的语言。比如,比如,APT、PROLOG、LISP、PL/M以及以及C语言等。而语言等。而80C51系列单片微机作为工业标准地位,从系列单片微机作为工业标准地位,从1985年开始就有年开始就有C语言编译语言编译器,简称器,简称C51。汇编语言汇编语言 汇编语言语句的种类和格式汇编语言语句的种类和格式 汇编语言语句的种类汇编语言语句的种类 指令语句:每指令语句:每1个指令语句都在汇编时产生个指令语句都在汇编时产生1个目标代个目标代码,对应着机器的码,对应着机器的1种操作。种操作。例如:例如:MOV A,#0 伪指令语句:主要是为汇编语言服务的,在汇编时没有目标伪指令
8、语句:主要是为汇编语言服务的,在汇编时没有目标代码与之对应。代码与之对应。例如:例如:ONE EQU 1 宏指令语句:用以代替汇编语言源程序中重复使用的程序段宏指令语句:用以代替汇编语言源程序中重复使用的程序段的的1种语句,由汇编程序在汇编时产生相应的目标代码。种语句,由汇编程序在汇编时产生相应的目标代码。汇编语言语句的格式汇编语言语句的格式 指令语句的格式为:指令语句的格式为:【标号(名字)】:助记符【标号(名字)】:助记符(操作码)【操作数(参数)操作码)【操作数(参数)】;【注释【注释】伪指令语句的格式:伪指令语句的格式:名字名字 定义符定义符 参数参数 ;注释;注释各字段之间用各字段之
9、间用1个空格或字段定界符分隔,常用的字段定界符有个空格或字段定界符分隔,常用的字段定界符有冒号冒号“:”、逗号、逗号“,”和分号和分号“;”。其中方括号括起来的。其中方括号括起来的是可选择部分。是可选择部分。标号域标号域:说明指令的地址。标号可以作为说明指令的地址。标号可以作为LJMP、AJMP、LCALL及及ACALL等指令的操作数。等指令的操作数。在指令语句中,标号位于一个语句的开头位置,由字母和在指令语句中,标号位于一个语句的开头位置,由字母和数符组成,字母打头,冒号数符组成,字母打头,冒号“:”结束。结束。标号中的字符个数一般不超过标号中的字符个数一般不超过8个,若超过个,若超过8个,
10、则以前面的个,则以前面的8个为有效,后面字符不起作用。个为有效,后面字符不起作用。不能使用本汇编语言中已经定义了的符号作标号,比如指不能使用本汇编语言中已经定义了的符号作标号,比如指令助记符令助记符(如如ADD)、伪指令、伪指令(如如END)一条语句可以有标号,也可以没有标号一条语句可以有标号,也可以没有标号操作码域操作码域:是指令的助记符或定义符,用来表示指令的性质,规定这是指令的助记符或定义符,用来表示指令的性质,规定这个指令语句的操作类型。个指令语句的操作类型。伪指令语句中的定义符规定这个指令语句的伪操作功能。伪指令语句中的定义符规定这个指令语句的伪操作功能。对于标号缺省的语句,操作码域
11、作为一行的开始。但在书写对于标号缺省的语句,操作码域作为一行的开始。但在书写时,应与上一行的操作码对齐。时,应与上一行的操作码对齐。操作数域操作数域:给出的是参与运算或进行其它操作的数据或这些数据的地址。给出的是参与运算或进行其它操作的数据或这些数据的地址。操作数与操作码之间用空格操作数与操作码之间用空格“”“”分隔,若有两个操作数,这分隔,若有两个操作数,这两个操作数之间必须用逗号两个操作数之间必须用逗号“,”分开。分开。对于操作数域出现的常数:若采用十六进制数表示,其末尾必对于操作数域出现的常数:若采用十六进制数表示,其末尾必须加须加“H”说明;若十六进制数以说明;若十六进制数以A、B、C
12、、D、E、F开头,其开头,其前面必须添前面必须添1个个“0”进行引导说明。进行引导说明。若采用二进制数表示,其末尾必须用若采用二进制数表示,其末尾必须用“B”说明。说明。若采用十进制数表示,可以不加后缀或加若采用十进制数表示,可以不加后缀或加“D”说明。说明。注释域注释域由分号由分号“;”引导开始,是说明语句功能、性质以及执行结果引导开始,是说明语句功能、性质以及执行结果的文字。以分号的文字。以分号“;”引导。引导。例:把片外存储器例:把片外存储器2200H单元中的数送入片内单元中的数送入片内70H单元中。单元中。标号域标号域 操作码域操作码域 操作数域操作数域 注释域注释域BEGIN:MOV
13、 DPTR,#2200H ;(DPTR)=2200H MOV R0,#70H ;(R0)=70H MOVX A,DPTR ;(A)=(DPTR)MOV R0,A ;(R0)=(A)伪指令:为了便于编程和对汇编语言程序进行汇编,伪指令:为了便于编程和对汇编语言程序进行汇编,各种汇编程序都提供一些特殊的指令,供人们编程使用。各种汇编程序都提供一些特殊的指令,供人们编程使用。由伪指令确定的操作称为伪操作。由伪指令确定的操作称为伪操作。伪指令又称汇编程序控制译码指令。伪指令又称汇编程序控制译码指令。“伪伪”体现在汇编时不产生机器指令代码,不影响程序体现在汇编时不产生机器指令代码,不影响程序的执行,仅指
14、明在汇编时执行一些特殊的操作。的执行,仅指明在汇编时执行一些特殊的操作。4.1.2 伪指令语句伪指令语句 ORG(ORiGIN)汇编起始地址伪指令汇编起始地址伪指令指令格式为:指令格式为:ORG 表达式表达式 含义:向汇编程序说明,下述程序段的起始地址由表达含义:向汇编程序说明,下述程序段的起始地址由表达式指明。表达式通常为式指明。表达式通常为16进制地址码。进制地址码。一般规定,在由一般规定,在由ORG伪指令定位时,其地址应当由小到大,伪指令定位时,其地址应当由小到大,不能重叠。不能重叠。它的有效范围一直到下一条它的有效范围一直到下一条ORG伪指令出现为止。伪指令出现为止。跟在跟在ORG伪指
15、令后面的程序段或数据段是绝对地址还是浮伪指令后面的程序段或数据段是绝对地址还是浮动地址段,依赖于动地址段,依赖于ORG右边的表达式性质。右边的表达式性质。ORG 1000H START:MOV A,12H含义:通知汇编程序,从含义:通知汇编程序,从 START开始的程序段,其起始地开始的程序段,其起始地址由址由1000H开始。由于开始。由于1000H是立即数型地址码,所以还隐含地指是立即数型地址码,所以还隐含地指明该程序段是绝对地址段。明该程序段是绝对地址段。假定假定ORG右边的表达式是浮动程序段中定义的标号右边的表达式是浮动程序段中定义的标号RELOCA,则则 ORG RELOCA SUBR
16、OU:表明表明 SUBROU起始于起始于 RELOCA(它是相对地址它是相对地址)浮动地址的程序浮动地址的程序段。段。END(END of assembly)汇编结束伪指令汇编结束伪指令 汇编结束伪指令一般有以下两种格式:汇编结束伪指令一般有以下两种格式:主程序模块:标号主程序模块:标号 END 表达式表达式 子程序模块:子程序模块:标号标号 END 含义:通知汇编程序,该程序段汇编至此结束。含义:通知汇编程序,该程序段汇编至此结束。END语句应设置在整个程序(包括伪指令在内)的后面。语句应设置在整个程序(包括伪指令在内)的后面。当源程序为主程序时,当源程序为主程序时,END伪指令中可有标号,
17、这个标伪指令中可有标号,这个标号应是主程序第一条指令的符号地址。若源程序为子程序,则号应是主程序第一条指令的符号地址。若源程序为子程序,则在在 END伪指令中不需要带标号。伪指令中不需要带标号。EQU(EQUate)赋值伪指令)赋值伪指令 指令格式为:标号指令格式为:标号 EQU 表达式表达式 含义:把表达式赋值于标号,这里的标号和表达式是必含义:把表达式赋值于标号,这里的标号和表达式是必不可少的。例如:不可少的。例如:LOOP EQU 2002H是向汇编程序表明,标号是向汇编程序表明,标号LOOP的值为的值为2002H。又如:。又如:LOOP1 EQU LOOPLOOP已赋值为已赋值为200
18、2H,则相当于,则相当于LOOP1LOOP,即,即LOOPI也为也为2002H,在程序中,在程序中LOOP和和LOOP1可以互换使用。可以互换使用。用用EQU语句给一个标号赋值以后,在整个源程序中该标语句给一个标号赋值以后,在整个源程序中该标号的值是固定的,不能更改。号的值是固定的,不能更改。DLDL定义标号值伪指令定义标号值伪指令 指令格式为:指令格式为:DL 含义:说明标号等值于表达式。同样,标号和表达式是必含义:说明标号等值于表达式。同样,标号和表达式是必不可少的。例如;不可少的。例如;COUNT DL 3000H ;S定义标号定义标号COUNT的值为的值为;3000H COUNT DL
19、 COUNT十十1 ;重新定义;重新定义COUNT的值为的值为;3000Hl可用可用DL语句在同一源程序中给同一标号赋予不同的值,语句在同一源程序中给同一标号赋予不同的值,即可更改已定义的标号值;而用即可更改已定义的标号值;而用EQU语句定义的标号,在整个源语句定义的标号,在整个源程序中不能更改。程序中不能更改。DB(Define Byte)定义字节伪指令定义字节伪指令 指令格式为:标号指令格式为:标号 DB 表达式或表达式表表达式或表达式表 含义:将表达式或表达式表所表示的数据或数据串存入从标含义:将表达式或表达式表所表示的数据或数据串存入从标号开始的连续存储单元中。标号为可选项,它表示数据
20、存储单元号开始的连续存储单元中。标号为可选项,它表示数据存储单元地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。地址。表达式或表达式表是指一个字节或用逗号分开的字节数据。可以是用引号括起来的字符串。字符串中的字符按可以是用引号括起来的字符串。字符串中的字符按ASCII码存于码存于连续的连续的ROM中。例如:中。例如:ORG 2000H TABLE DB 73H,04,100,32,00,2,“ABC”表示字节串数据存入由表示字节串数据存入由TABLE标号为起始地址的连续存标号为起始地址的连续存储器单元中。即从储器单元中。即从2000H存储单元开始依次连续存放数据为:存储单元开始依次连
21、续存放数据为:73H,04H,64H,20H,00H,FEH,41H,42H,43H。若不采用若不采用ORG伪指令专门规定数据区的起始地址,则数伪指令专门规定数据区的起始地址,则数据区的起始地址即根据据区的起始地址即根据DB命令前一条指令的地址确定。这时命令前一条指令的地址确定。这时DB所定义的数据字节的起始地址为所定义的数据字节的起始地址为DB命令前一条指令的地址加上命令前一条指令的地址加上该指令的字节数。该指令的字节数。DW(Define Word)定义字伪指令定义字伪指令指令格式为:标号指令格式为:标号 DW 表达式或表达式表表达式或表达式表含义:把字或字串值存入由标号开始的连续存储单元
22、中,含义:把字或字串值存入由标号开始的连续存储单元中,且把字的高字节数存入低地址单元,低字节数存入高地址单元。且把字的高字节数存入低地址单元,低字节数存入高地址单元。按顺序连续存放。按顺序连续存放。DW100H,3456H,814表示按顺序存入表示按顺序存入01H,00H,34H,56H,03H,2EH注:注:DB和和DW定义的数表,数的个数不得超过定义的数表,数的个数不得超过80个。若数据的个。若数据的数目较多时,可以使用多个定义命令。数目较多时,可以使用多个定义命令。一般以一般以DB来定义数据,以来定义数据,以DW来定义地址。来定义地址。DS(Define Storage)定义存储区伪指令
23、定义存储区伪指令 指令格式为:指令格式为:DS 含义:通知汇编程序,在目标代码中,以标号为首地址保留表达含义:通知汇编程序,在目标代码中,以标号为首地址保留表达式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋式值的若干存储单元以备源程序使用。汇编时,对这些单元不赋值。例如:值。例如:BASE DS 100H通知汇编程序,从标号通知汇编程序,从标号BASE开始,保留开始,保留100H个存储单元,个存储单元,以备源程序另用。以备源程序另用。注意,对于注意,对于80C51单片微机,单片微机,DB、DW、DS等伪指令只能等伪指令只能应用于应用于程序存储器程序存储器,而不能对数据存储器使用。,而
24、不能对数据存储器使用。BIT 位定义伪指令位定义伪指令 命令格式为:命令格式为:BIT 含义:给字符名称赋予位地址。其中,位地址可以是绝含义:给字符名称赋予位地址。其中,位地址可以是绝对地址,也可以是符号地址。对地址,也可以是符号地址。例:例:ABCBITP3.1把把P3.1位地址赋值给位地址赋值给ABC,在后面的编程中,在后面的编程中,ABC即可即可作为位地址作为位地址P3.1使用。使用。例例1.伪指令应用伪指令应用ORG 8100HBUFFER DS 10H DW “A B”DW 100H,1ACH,-814说明:说明:从从8100H至至810FH为缓冲区空间为缓冲区空间(8110H)=4
25、1H(A)(8111H)=42H(B)8112H单元起存放单元起存放01H、00H、01H、ACH、FCH、D2H 4.2 80C51 4.2 80C51汇编语言程序设计汇编语言程序设计 汇编语言程序设计,就是采用汇编指令来编写计算机程序。汇编语言程序设计,就是采用汇编指令来编写计算机程序。在实际编程中,如何正确选择指令、寻址方式和合理使用工作寄在实际编程中,如何正确选择指令、寻址方式和合理使用工作寄存器,包括数据存储器单元,如何对扩展的存器,包括数据存储器单元,如何对扩展的I/O端口进行操作等,端口进行操作等,都是基本的汇编语言程序设计技巧。都是基本的汇编语言程序设计技巧。程序结构一般采用以
26、下程序结构一般采用以下3种基本控制结构,即顺序结构、种基本控制结构,即顺序结构、分支结构和循环结构来组成,再加上使用广泛的子程序及中断服分支结构和循环结构来组成,再加上使用广泛的子程序及中断服务子程序,共有务子程序,共有5种基本结构种基本结构。按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至按照逻辑操作顺序,从某一条指令开始逐条顺序执行,直至某一条指令为止。某一条指令为止。例例2.数据传送和交换。数据传送和交换。将将R0与与R7内容互换,内容互换,R4与内存与内存20H单元内容互换。单元内容互换。XCHR:MOVA,R0 XCH A,R7 XCHA,R0 ;R0与与R7内容互换内容互换 M
27、OVA,R4 XCHA,20H XCHA,R4 ;R4与与20H单元内容互换单元内容互换 4.2 4.2.1 .1 顺序结构程序设计顺序结构程序设计 设被加数存放于片内设被加数存放于片内RAM的的20H(低位字节)、(低位字节)、21H(高位字节),加数存放于(高位字节),加数存放于22H(低位字节)和(低位字节)和23H(高位字(高位字节),运算结果的和数存放于节),运算结果的和数存放于20H(低位字节)和(低位字节)和21H(高位字(高位字节)中。实现节)中。实现16位相加。位相加。START:PUSH ACC;将;将A中内容进栈保护中内容进栈保护MOV R0,20H ;将;将20H地址送
28、地址送R0 MOV R1,22H ;将;将22H地址值送地址值送R1 MOV A,R0 ;被加数低字节内容送;被加数低字节内容送A ADD A,R1 ;低字节数相加;低字节数相加 MOV R0,A ;低字节数和存;低字节数和存20H中中例例3.不带符号多字节加法不带符号多字节加法。INC R0 ;指向被加数高位字节;指向被加数高位字节 INC R1 ;指向加数高位字节;指向加数高位字节 MOV A,R0 ;被加数高位字节送;被加数高位字节送A ADDC A,R1 ;高字节数带进位相加;高字节数带进位相加MOV R0,A;高字节数和存;高字节数和存21H中中CLRAADDCA,#00HMOV 1
29、0H,A;进位暂存于;进位暂存于10H中中 POP ACC ;恢复;恢复A原内容原内容 注意:对于对注意:对于对带符号数带符号数原码原码的减法的减法运算,只要先将减数原码的符运算,只要先将减数原码的符号位取反,即可把减法运算按加法运算的原则来处理。号位取反,即可把减法运算按加法运算的原则来处理。对于对于带符号数的加法带符号数的加法运算,首先要进行两数符号的判定,运算,首先要进行两数符号的判定,若两数符号相同,则进行两数相加,并以被加数符号为结果的符若两数符号相同,则进行两数相加,并以被加数符号为结果的符号。号。如果两数符号不同,则进行两数相减。如果相减结果为正,如果两数符号不同,则进行两数相减
30、。如果相减结果为正,则该数即为最后结果,并以被减数符号为结果的符号。如果两数则该数即为最后结果,并以被减数符号为结果的符号。如果两数相减的结果为负,则应将其差数取补,并把被减数的符号取反后相减的结果为负,则应将其差数取补,并把被减数的符号取反后作为结果的符号。作为结果的符号。多字节乘法的基础是加法。分别相乘后对应字节相加多字节乘法的基础是加法。分别相乘后对应字节相加(个个位、十位、百位等分别相加,并考虑低字节向高字节的进位位、十位、百位等分别相加,并考虑低字节向高字节的进位)。选用工作寄存器暂存中间积。选用工作寄存器暂存中间积。分析:设被乘数低字节(分析:设被乘数低字节(addrl)用)用A表
31、示,高字节(表示,高字节(addr2)用用B表示;乘数低字节(表示;乘数低字节(addr3)用)用L表示,高字节(表示,高字节(addr4)用)用M表示。表示。例例.双字节乘法双字节乘法。双字节相乘的过程如下:双字节相乘的过程如下:工作寄存器用来存放部分积,工作寄存器用来存放部分积,R2存放存放(HALLBLLMA),R3存放存放(HBL+CY HMALBM),R4存放存放(HBM十十CY)。START:PUSH PSW ;PSW、A、B入入栈栈PUSH ACCPUSH B MOV PSW,18H ;选用工作寄存器组;选用工作寄存器组 3 MOV R0,addrl ;被乘数低字节地址送;被乘数
32、低字节地址送R0 MOV R1,addr3 ;乘数低字节地址送;乘数低字节地址送R1 MOV A,R0 ;被乘;被乘 数低字节内容送数低字节内容送APUSH A;被乘;被乘 数低字节内容数低字节内容A压栈压栈MOV B,R1 ;乘数低字节内容送;乘数低字节内容送B MUL AB ;(1)AL MOV R0,A ;积的最低字节存入;积的最低字节存入addrl中中 MOVR2,B ;HAL送送R2中中 INC R0 ;指向被乘数高字节;指向被乘数高字节 MOV A,R0 ;被乘数高字节送;被乘数高字节送A MOV B,R1 ;乘数低字节送;乘数低字节送B MUL AB ;(2)BLADD A,R2
33、 ;HAL十十LBL MOV R2,A ;HAL十十LBI之和送之和送R2 MOV A,B ;HBL送送A ADDC A,00H ;HBLCY MOV R3,A ;HBL送送R3 POP A;被乘;被乘 数低字节内容数低字节内容L出栈出栈INCR1;指向;指向ddr4MOV B,R1 ;M送送B MUL AB ;(3)MA ADD A,R2 ;LMA(R2)MOV R2,A ;LMAHAL十十LBL之和送之和送R2 MOV A,B ;HMA送送A ADDC A,R3 ;HMA十十HBLCY MOV R3,A ;HMAHBLCY之和送之和送R3 MOV R4,0 ;清;清R4 JNC LOOP
34、;CY0,转,转LOOP INC R4 ;CY1,则(则(R4)R4l LOOP MOV A,R0 ;B送送 A MOV B,R1 ;M送送B MUL AB ;(4)MB ADD A,R3 ;HMA十十HBLLBM MOV R3,A ;HMAHBLLBM之和送之和送R3 MOV A,B ;HBM送送A ADDCA,R4 ;R4HBMRES3 MOV R1,A ;RES3存入存入 addr4中中 MOV A,R2;RES1存入存入addr2中中MOV R0,A DEC R1 ;指向;指向addr3 MOV A,R3;RES2存入存入addr3中中 MOV R1,A POP B ;B、A、PSW出
35、栈出栈POP ACC POP PSW对于带符号数的乘法,其原则为:对于带符号数的乘法,其原则为:原码相乘,原码相乘,乘积的符号位为被乘数与乘数符号位的乘积的符号位为被乘数与乘数符号位的“异或异或”查表:根据变量查表:根据变量x,在表格中查找对应的,在表格中查找对应的y值,使值,使yf(x)。)。y与与x的对应关系可有各种形式,而表格也可有各种结构。的对应关系可有各种形式,而表格也可有各种结构。一般表格常量设置在程序存储器的某一区域内。一般表格常量设置在程序存储器的某一区域内。MOVC A,ADPTR;远程查表;远程查表MOVC A,A+PC;近程查表;近程查表 例例.查表查表 设有一个巡回检测
36、报警装置,需对设有一个巡回检测报警装置,需对4 路输入进行控制,每路路输入进行控制,每路设有一个最大额定值,为双字节数。控制时需根据检测的路号设有一个最大额定值,为双字节数。控制时需根据检测的路号找出该路对应的最大额定值。设找出该路对应的最大额定值。设R2用于寄存检测路号,查找到用于寄存检测路号,查找到的对应的最大额定值存放于的对应的最大额定值存放于31H和和32H单元中。单元中。查找最大允许额定值子程序如下:查找最大允许额定值子程序如下:地址地址 机器码机器码 源程序源程序注释注释 ORG 2000H2000 EA MOV A,R2;检测路号送;检测路号送A2001 2A ADDA,R2;(
37、;(R2)22002 F531 MOV 31H,A ;距表首址偏移量;距表首址偏移量2004 2408 ADD A,#19H;偏移量;偏移量2006 83 MOVC A,A+PC;查表,读取第;查表,读取第1个字节内容个字节内容2007 C531 XCH A,31H;第;第1字节存入字节存入31H单元单元2009 2404 ADD A,#15H;偏移量;偏移量200B 83 MOVC A,A+PC;查表,读取第;查表,读取第2字节字节200C F532 MOV 32H,A;第;第2字节存入字节存入32H单元单元200E ORG 2020H;最大额定值表;最大额定值表20201230 TAB D
38、W 1230H,;路号;路号020221540 DW 1540H ;路号;路号120242340 DW 2340H,;路号;路号220262430 DW 2430H;路号;路号3 END 说明:说明:relrel计算计算2020H-(2006H+1)=19H2020H-(2006H+1)=19H (2020H+1)-(200BH+1)=15H(2020H+1)-(200BH+1)=15H设表中有设表中有1024个元素,每个元素为两个字节,则表格总长个元素,每个元素为两个字节,则表格总长为为2048个字节。现按个字节。现按R4和和R5的内容从表格中查出对应的数据元的内容从表格中查出对应的数据元素
39、值,送存素值,送存R4和和R5中。中。TBDP1:MOV DPTR,#TBDP2;表格首地址值送;表格首地址值送DPTR MOVA,R5 ;查表参数低位字节送;查表参数低位字节送A CLR C ;清;清CY RLC A ;带进位左移一位;带进位左移一位 XCH A,R4 ;将查表参数;将查表参数R4内容送内容送A RLC A ;带进位左移一位;带进位左移一位 XCH A,R4 ;R4与与R5内容互换内容互换 例例.查表查表ADD A,DPL ;DPL查表参数低位字节查表参数低位字节 MOV DPL,A ;调整;调整DPL、DPH MOV A,DPH ;DPH送送A ADDC A,R4 ;DPH
40、查表参数高位字节查表参数高位字节 MOV DPH,A ;相加和存;相加和存DPH CLR A ;清;清A MOVC A,ADPTR ;查表,读第;查表,读第1字节字节 MOV R4,A;第;第1字节存入字节存入R4 CLR A ;清;清A INCDPTR ;(;(DPTR)1 MOVC A,ADPTR ;查表,读第;查表,读第2字节字节 MOV R5,A ;第;第2字节存入字节存入R5 RET TBDP2 DW ;数据表;数据表 DW 特点:程序执行流程中必然包含有条件判断,符合条件要求特点:程序执行流程中必然包含有条件判断,符合条件要求和不符合条件要求分别有不同的处理路径。和不符合条件要求分
41、别有不同的处理路径。在程序设计时,往往借助程序框图(判断框)来指明程序的在程序设计时,往往借助程序框图(判断框)来指明程序的走向。走向。一般情况下,每个分支均需单独一段程序,在程序的起始地一般情况下,每个分支均需单独一段程序,在程序的起始地址赋予一个地址标号,以便当条件满足时转向指定地址单元去执址赋予一个地址标号,以便当条件满足时转向指定地址单元去执行,条件不满足时仍顺序往下执行。行,条件不满足时仍顺序往下执行。4.2.2 4.2.2 分支结构程序设计分支结构程序设计 单分支结构单分支结构 程序仅有两个出口,两者选一。程序仅有两个出口,两者选一。通常用条件判跳指令来选择并转移。通常用条件判跳指
42、令来选择并转移。可实现单分支程序转移的指令有位条件转移指令,可实现单分支程序转移的指令有位条件转移指令,如:如:JC、JNC、JB、JNB和和JBC等,还有一些条件转等,还有一些条件转移指令,如:移指令,如:JZ、JNZ、DJNZ等。等。有有3 3种典型形式(见种典型形式(见图图42)。)。图图42(a),当条件满足时执行分支程序),当条件满足时执行分支程序1,否,否则执行分支程序则执行分支程序2。图图42(b),当条件满足时跳过程序段),当条件满足时跳过程序段1,从程,从程序段序段2开始继续顺序执行;否则,顺序执行程序段开始继续顺序执行;否则,顺序执行程序段1和和程序段程序段2。图图42(c
43、),当条件满足时程序顺序执行程序段),当条件满足时程序顺序执行程序段2;否则,重复执行程序段;否则,重复执行程序段1,直到条件满足为止。实,直到条件满足为止。实际是循环结构程序。际是循环结构程序。设对设对addrl,addrl1的双字节数取补后存入的双字节数取补后存入addr2和和 addr2十十1单元中,其中高位字节在高地址单元中。单元中,其中高位字节在高地址单元中。8位微机对双字节数位微机对双字节数取补需分两次进行。首先对低字节数取补,然后判其结果是否为取补需分两次进行。首先对低字节数取补,然后判其结果是否为全全“0”。若为。若为“0”,则高字节数取补;否则,高位字节数取反。,则高字节数取
44、补;否则,高位字节数取反。START:MOV R0,addrl ;原码低字节地址码送;原码低字节地址码送R0 MOV R1,addr2;补码低字节地址码送;补码低字节地址码送R1 MOV A,R0 ;原码低字节内容送;原码低字节内容送ACPL A INC A ;A内容取反加内容取反加l,即取补,即取补 MOV R1,A ;低字节补码存;低字节补码存addr2单元单元例例.求双字节补码程序求双字节补码程序INC R0 ;指向原码高字节;指向原码高字节 INC R1 ;指向补码高字节;指向补码高字节 JZ LOOP1 ;当(;当(A)0,转,转LOOP1 MOV A,R0;原码高字节送;原码高字节
45、送A CPL A ;高字节内容取反;高字节内容取反 MOV R1,A ;字节反码存;字节反码存(addr2十十1)单元单元 SJMP LOOP2 ;转;转LOOP2,结束,结束 LOOP1:MOV A,R0 ;低字节补码为;低字节补码为0 CPL A ;对高字节数取补;对高字节数取补 INC A MOV R1,A ;高字节补码存;高字节补码存(addr2+1)单元单元LOOP2:END;结束;结束Y=a2b (当当b10时时)Y=a2b (当当b10)转)转MMMOV R3,A;R3bMOV A,R0CLR CSUBB A,,3;(R1)(R0)a2-b MOV R0,AMOV A,R1SUB
46、B A,#00HMOV R1,AMMNN:MOV Y0,R0;(Y1)(Y0)结果结果MOV Y1,R1HERE:AJMP HERE 注:注:Y1、Y0需用位定义伪指令赋值。需用位定义伪指令赋值。多分支选择结构多分支选择结构 多分支结构:程序的判别部分有两个以上的出口多分支结构:程序的判别部分有两个以上的出口流向。流向。通常有两种形式,参见通常有两种形式,参见图图43。分支结构程序允许嵌套即一个程序的分支又由分支结构程序允许嵌套即一个程序的分支又由另一个分支程序所组成,从而形成多级另一个分支程序所组成,从而形成多级分支程序结构。分支程序结构。80C51设有两条多分支选择指令:设有两条多分支选择
47、指令:散转指令散转指令 JMP ADPTR 散转指令由数据指针散转指令由数据指针DPTR决定多分支转移程序的首地址,决定多分支转移程序的首地址,由累加器由累加器A中内容动态地选择对应的分支程序,可从多达中内容动态地选择对应的分支程序,可从多达256个个分支中选一。分支中选一。比较指令比较指令 CJNE A,direct,rel比较两个数的大小,必然存在大于、等于、小于比较两个数的大小,必然存在大于、等于、小于3种情况,种情况,这时就需从这时就需从3个分支中选一。个分支中选一。另外,还可以使用查地址表的办法、查转移指令表的办法另外,还可以使用查地址表的办法、查转移指令表的办法或通过堆栈来实现多分
48、支程序转移。或通过堆栈来实现多分支程序转移。设分支转移序号在设分支转移序号在R3中,分支程序入口地址放在中,分支程序入口地址放在BRTAB表中。表中。MOV DPTR,#BRTAB;分支入口地址表首地址;分支入口地址表首地址MOV A,R3RL A;2MOV R1,AINC A;取低位地址;取低位地址MOVC A,A+DPTRPUSH A;低位地址入栈;低位地址入栈MOV A,R1MOVC A,A+DPTR;取高位地址,并入栈;取高位地址,并入栈PUSH ARET ;分支入口地址出栈送入;分支入口地址出栈送入PCBRTAB DW BR0,BR1,;分支程序入口地址表;分支程序入口地址表注:注:
49、RETRET指令与两条指令与两条PUSHPUSH指令配对,压栈时先指令配对,压栈时先“低低”后后“高高”。而而DWDW伪指令在字节存放时,先伪指令在字节存放时,先“高高”后后“低低”。例例.通过堆栈操作实现分支程序转移通过堆栈操作实现分支程序转移由由40H单元中动态运行结果值来选择分支程序单元中动态运行结果值来选择分支程序 (40H)0,转处理程序,转处理程序0 (40H)1,转处理程序,转处理程序1 (40H)n,转处理程序,转处理程序nSTART:MOV DPTR,#ADDR16;多分支转移指令表首址送;多分支转移指令表首址送;DPTR MOV A,40H ;40H单元内容送单元内容送A
50、CLR C ;清;清CY RLC A ;A内容左移一位内容左移一位 例例.通过查转移指令表实现多分支程序转移通过查转移指令表实现多分支程序转移JNC TABLE ;若;若CY0,转转TABEL INC DPH ;若;若CYl,DPH内容十内容十1 TABEL:JMP A十十DPTR ;多分支转移;多分支转移ADDR16:AJMP LOOP0;转分支程序;转分支程序0 AJMP LOOP1;转分支程序;转分支程序1 AJMP LOOPn;转分支程序;转分支程序n 由于选用绝对转移指令由于选用绝对转移指令AJMP,每条指令占用两个字节,每条指令占用两个字节,因此,要求因此,要求A中内容为偶数,在程
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。