第04章汇编语言程序设计_第1页
第04章汇编语言程序设计_第2页
第04章汇编语言程序设计_第3页
第04章汇编语言程序设计_第4页
第04章汇编语言程序设计_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

会计学1第04章汇编语言程序设计第4章汇编语言程序设计第一节汇编语言概述4.1汇编语言概述汇编语言是面向机器硬件的语言,要求程序设计者对MCS-51单片机具有很好的“软,硬结合”的功底。第1页/共67页第4章汇编语言程序设计1.汇编语言与汇编的概念

1.机器语言(machinelanguage)2.汇编语言(assemblylanguage)由助记符、保留字和伪指令等组成,容易被人们识别、记忆和读写,也称为符号语言或汇编语言。将汇编语言程序转换成为二进制代码表示的机器语言程序称为汇编程序。经汇编程序“汇编(翻译)”得到的机器语言程序称为目标程序,原来的汇编语言程序称为源程序。3.高级语言(high-levellanguage)

第一节汇编语言概述第2页/共67页第4章汇编语言程序设计2.汇编语言源程序的格式

采用汇编语言编写的程序称为汇编语言源程序。程序不能被计算机直接识别和执行,需人工或机器翻译成机器语言才能被计算机执行。为了使机器能识别和正确汇编,用户在程序设计时必须严格遵循汇编语言格式和语法规则,才能编写符合要求的汇编语言源程序。

对MCS-51来说,汇编语言源程序有两种基本类型:指令语句和伪指令语句。

第一节汇编语言概述第3页/共67页第4章汇编语言程序设计(1)指令语句

已在第3章介绍每一条指令语句在汇编时都产生一个指令代码――机器代码。

(2)伪指令语句

是为汇编服务的,在汇编时没有机器代码与之对应。第一节汇编语言概述第4页/共67页第4章汇编语言程序设计(3)MCS-51的汇编语言中每条语句典型的四分段格式

标号字段:操作码字段,操作数字段;注释字段规则:标号字段和操作字码段之间要有冒号“:”相隔;2)操作码字段和操作数字段间的分界符是空格;3)双操作数之间用逗号相隔;4)操作数字段和注释字段之间的分界符用分号“;”相隔。操作码字段为必选项,其余各段为任选项。

第一节汇编语言概述第5页/共67页第4章汇编语言程序设计(3)MCS-51的汇编语言中每条语句典型的四分段格式

例:ORG0080HSTART:MOVA,#00H;0→AMOVR1,#0AH;10→R1MOVR2,#00000011B;3→R2LOOP:ADDA,R2;A+R2→ADJNZR1,LOOP;R1内容减1不为零,则循环

NOPHERE:SJMPHEREEND程序共由9条语句组成,第1、9两条是指示性语句(伪指令),其余为指令性语句。第2、5两条是四分段齐全的语句,第3、4、6、7等四条是缺省标号段的语句,第7、9两条只有操作码字段。第一节汇编语言概述第6页/共67页第4章汇编语言程序设计(4)基本语法规则

1)标号字段位于一条语句的开头,是语句所在内存单元地址的标志符号。(1)标号后边必须跟以冒号“:”;(2)由1~8个ASCII字符组成(3)同一标号在一个程序中只能定义一次(4)不能使用汇编语言已经定义的符号作为标号

第一节汇编语言概述第7页/共67页第4章汇编语言程序设计(4)基本语法规则

2)操作码字段是指令的保留字(如上述程序中的MOV、ADD和NOP等),也可以是伪指令和宏指令的助记符(如ORG和END)。汇编语言指令中唯一不能空缺的部分,汇编程序就是根据这一字段来生成机器代码的。

第一节汇编语言概述第8页/共67页第4章汇编语言程序设计(4)基本语法规则

3)操作数字段用于存放指令的操作数或操作数地址,可以采用字母和数字等形式。通常有单操作数,双操作数和无操作数三种情况。如果是双操作数,则操作数之间,要以逗号隔开。(1)十六进制、二进制和十进制形式的操作数表示。(2)工作寄存器和特殊功能寄存器的表示。采用工作寄存器和特殊功能寄存器的代号来表示,也可用其地址来表示。(3)采用符号$。美元符号$常在转移类指令的操作数字段中使用用于表示该转移指令操作码所在的存储单元地址。4)注释字段

第一节汇编语言概述第9页/共67页第4章汇编语言程序设计3.伪指令

指示性语句又称伪指令,简称伪指令。每种汇编语言都有自己的伪指令,伪指令和指令是完全不同的,伪指令不是真正的指令。是用来对汇编语言过程进行某种控制,或者对符号和标号进行赋值等,也称为汇编程序控制命令。只有在汇编前的源程序中才有伪指令,经过汇编得到目标程序(机器代码),伪指令没有相应的机器代码产生。

第一节汇编语言概述第10页/共67页第4章汇编语言程序设计(1)汇编起始地址伪指令ORG(ORiGin)

指令格式:ORG16位地址或标号;规定下面的目标程序的起始地址常用于汇编语言源程序或数据块的开头,用一条ORG伪指令来实现规定程序的起始地址。在一个源程序中,可以多次使用ORG指令,用来规定不同程序段的起始地址。但,规定的地址必须是从小到大,不容许各程序段之间地址重叠。一个源程序如不用ORG规定,则汇编得到的目标程序将从0000H开始。

例:

ORG3000HSTART:MOVA,#12H;规定标号START代表地址为3000H开始存放。

第一节汇编语言概述第11页/共67页第4章汇编语言程序设计(2)

汇编结束伪指令END(ENDofassembly)

指令格式:END;

END标号;END指令是汇编语言源程序的结束标志,用于终止源程序的汇编工作。一个源程序只能有一个END命令,且位于程序的最后,在END以后写的指令,汇编程序都不给予处理。第一节汇编语言概述第12页/共67页第4章汇编语言程序设计(3)定义字节命令DB(DefineByte)

指令格式:[标号:]DB八位二进制数表;从标号指定的地址单元开始,定义若干个8位内存单元的内容。

例:

ORG3000HTABL:DB30H,31H,32H,33H,34H;0~4的ASCII码汇编后:3000H=30H,3001H=31H,3002H=32H,3003H=33H,3004H=34H。第一节汇编语言概述第13页/共67页第4章汇编语言程序设计(4)定义数据字命令DW(DefineWord)

指令格式:[标号:]DW十六位二进制数表;从标号指定的地址单元开始,定义若干个16位数据。一个16位数占据两个内存单元,其中,高8位存入低地址字节,低8位存入高地址字节。

例:

ORG3010HTAB:DW1234H,5678H,2010H汇编后从3010H开始连续6个存储单元的内容为:3010H=12H,3011H=34H,3012H=56H,3013H=78H,3014H=20H,3015H=10H。

第一节汇编语言概述第14页/共67页第4章汇编语言程序设计(5)

赋值命令EQU(EQUate)

指令格式:变量名称EQU数或汇编符号;将一个数或者特定的汇编符号赋予规定的变量名称。

“变量名称”不是标号,不能用“:”来做分隔符。用EQU赋值以后的变量可以用做数据地址、代码地址、位地址或者单做一个立即数来用。变量需赋值以后方可以使用,不能先使用后赋值。同时,变量名称不能和汇编语言关键字同名。例:TESTEQU2010H表示标号TEST=2010H,在汇编时,凡是遇到标号TEST时,均以2000H来代替。

第一节汇编语言概述第15页/共67页第4章汇编语言程序设计4.源程序的汇编

汇编语言源程序“翻译”成机器代码(指令代码)的过程称为“汇编”。汇编可分为手工汇编和机器汇编两类:(1)手工汇编

人工查表翻译指令。但遇到的相对转移指令的偏移量的计算,要根据转移的目标地址计算偏移量,不但麻烦,且容易出错。两次汇编过程。第一次汇编:确定地址,翻译成各条机器码,字符标号原样写出;第二次汇编:标号代真,将字符标号用所计算出的具体地址值或偏移量代换。

第一节汇编语言概述第16页/共67页第4章汇编语言程序设计(2)机器汇编

用编辑软件进行源程序的编辑。编辑完成后,生成一个ASCII码文件,扩展名为“.ASM"”。然后在微计算机上运行汇编程序,把汇编语言源程序翻译成机器代码。两次扫描过程。第一次扫描:检查语法错误,确定符号名字;建立使用的全部符号名字表;每一符号名字后跟一对应值(地址或数)。第二次扫描:是在第一次扫描基础上,将符号地址转换成地址(代真);利用操作码表将助记符转换成相应的目标码。

第一节汇编语言概述第17页/共67页第4章汇编语言程序设计第二节汇编语言程序的结构4.2汇编语言程序的结构1.汇编语言程序设计步骤汇编语言设计一个程序大致上可分为以下几个步骤。

1)分析题意,明确要求。解决问题之前,首先要明确所要解决的问题和要达到的目的、技术指标等。

2)确定算法。根据实际问题的要求、给出的条件及特点,找出规律性,最后确定所采用的计算公式和计算方法,这就是一般所说的算法。算法是进行程序设计的依据,它决定了程序的正确性和程序的指令。

第18页/共67页第4章汇编语言程序设计1.汇编语言程序设计步骤3)画程序流程图,用图解来描述和说明解题步骤。4)分配内存工作单元,确定程序与数据区的存放地址。5)编写源程序。6)程序优化。7)

上机调试、修改和最后确定源程序。

第二节汇编语言程序的结构第19页/共67页第4章汇编语言程序设计2.顺序程序结构

顺序结构程序是一种最简单、最基本的程序(也称为简单程序),它是一种无分支的直线形程序,按照程序编写的顺序依次执行。

第二节汇编语言程序的结构例:编写程序,将外部RAM单元中40H单元4位BCD数转换成ASCII码,送到内部RAM单元60H61H之中。解:根据ASCII字符表,十进制数09的ASCII码和它的BCD码之间仅相差30H,本题需要把一个字节的两位BCD数进行拆分,然后分别和30H相加,即得到相应的ASCII码。程序如下:

第20页/共67页第4章汇编语言程序设计2.顺序程序结构

第二节汇编语言程序的结构

ORG0000HADDR1DATA0040HADDR2EQUMOVDPTR,#ADDR1;源地址=>DPTRMOVR0,#ADDR2;目标地址=>R0MOV@R0,#00H;目标地址单元清零MOVXA,@DPTR;源地址单元中BCD数送AMOVB,A;ANLA,#0FH;ORLA,#30H;完成低位BCD数转换MOV@R0,A;存入60HINCR0MOVA,BANLA,#0F0HSWAPA;高位BCD数送低4位ORLA,#30H;完成高位BCD数转换MOV@R0,A;存入61HSJMP$END第21页/共67页第4章汇编语言程序设计3.分支程序结构

分支程序的特点是改变程序的执行顺序,跳过一些指令,去执行另外一些指令。应注意:对每一个分支都要单独编写一段程序,每一分支的开始地址赋给一个标号。在编写分支程序时,关键是如何判断分支的条件。在MCS-51系列单片机中可以直接用来判断分支条件的指令并不多,只有累加器为零(或不为零)、比较条件转移指令CJNE等,MCS-51单片机还提供了位条件转移指令,如JC,JB等。把这些指令结合在一起使用,就可以完成各种各样的条件判断。

第二节汇编语言程序的结构第22页/共67页第4章汇编语言程序设计3.分支程序结构第二节汇编语言程序的结构例:设计比较两个无符号8位二进制数大小,并将较大数存入高地址中的程序。设两数分别存入30H和31H中。并设30H=42H,31H=30H。

解:程序流程图如图所示,为选择结构程序中的单分支程序流程图。汇编语言程序如下:

第23页/共67页第4章汇编语言程序设计3.分支程序结构第二节汇编语言程序的结构解:ORG 0000H LJMP STAR ORG 2000HSTAR:MOV 30H,#42H ;30H←42H MOV 31H,#30H;31H←30HCLR C ;C←0MOV A,30H ;A←30H SUBB A,31H ;作减法比较两数

JC NEXT ;31H≥30H转

MOV A,30H ;30H大则

XCH A,31H;大数存入31H中

MOV 30H,A ;小数存入30H中NEXT:SJMP $END第24页/共67页第4章汇编语言程序设计4.循环程序结构顺序程序和分支程序中的指令,最多只执行一次。在实际问题中重复地做某些事的情况是很多的,用计算机来做这些事就要重复地执行某些指令。重复地执行某些指令,最好用循环程序实现。第二节汇编语言程序的结构第25页/共67页第4章汇编语言程序设计4.循环程序结构循环程序一般由4部分组成。(1)置循环初值。即设置循环过程中有关工作单元的初始值,如置循环次数、地址指针及工作单元清零等。(2)循环体。即循环的工作部分,完成主要的计算或操作任务,是重复执行的程序段。(3)循环修改。每循环一次,就要修改循环次数、数据及地址指针等。(4)循环控制。根据循环结束条件,判断是否结束循环。

第二节汇编语言程序的结构第26页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构第27页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构例:多个单字节数求知。已知有10个单字节数,依次存放在内部RAM40H单元开始的数据存储区中,求和并将结果存人寄存器R2、R3中(高位存R2,低位存R3)。解:要重复进行加法运算,因此采用循环结构程序。循环次数就是数据块字节数,这是已知的。在置初值时,将数据块长度置人寄存器R5;将数据块首地址送人寄存器R0,即以R0作为数据块的地址指针,采用间接寻址方式:每做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器R5减l。到R5减为0时,求和结束。

:第28页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构解:

ORG2000H

SUM:MOVR0,#40H;设地址指针

MOVR5,#0AH;计数器初值送R5SUM:MOVA,#00H

MOVR2,A

LP:ADDA,@R0

JNCLP1

INCR2;若有进位,和的高八位+1LP1:INCR0;地址指针+1

DJNZR5,LP;判循环结束条件

MOVR3,A;存和的低八位

END

第29页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构解:

ORG2000H

SUM:MOVR0,#40H;设地址指针

MOVR5,#0AH;计数器初值送R5SUM:MOVA,#00H

MOVR2,A

LP:ADDA,@R0

JNCLP1

INCR2;若有进位,和的高八位+1LP1:INCR0;地址指针+1

DJNZR5,LP;判循环结束条件

MOVR3,A;存和的低八位

END

第30页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构例:已知内部RAM的BLOCK单元开始有一无符号数据块,块长在LEN单元。请编出求数据块中各数累加和、并存入SUM单元的程序。

为了使读者对两种循环结构有一个全面了解,以便进行分析比较,现给出两种设计方案。求累加和参考程序:

第31页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构解:1.先判断后处理(见图4-6(a))

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;块长送R2MOVR1,#BLOCK;块始地址送R1INCR2;块长+1SJMPCHECKLOOP:ADDA,@R1;A+(R1)送AINCR1;修改数据块指针R1CHECK:DJNZR2,LOOP;若未完,则转LOOPMOVSUM,A;存累加和

SJMP$END第32页/共67页第4章汇编语言程序设计4.循环程序结构第二节汇编语言程序的结构解:2.先处理后判断(见图4-6(b))

ORG1000HLENDATA20HSUMDATA21HBLOCKDATA22HCLRA;A清零

MOVR2,LEN;块长送R2MOVR1,#BLOCK;数据始地址送R1NEXT:ADDA,@R1;A+(R1)送AINCR1;修改数据块指针R1DJNZR2,NEXT;若未完,则转NEXTMOVSUM,A;存累加和

SJMP$END第33页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

汇编语言编程时,应考虑到恰当地使用子程序,使整个程序的结构清楚,而且阅读和理解方便。使用子程序还可以减少源程序和目标程序的长度。在多次调用同样的程序段时,采用子程序就不必每次重复书写同样的指令,而只需书写一次。当然从程序的执行来看,每调用一次子程序都要附加保护断点、进栈和出栈等操作,增加程序的执行时间。但一般来说,付出这些代价总是值得的。

在汇编语言源程序中使用子程序时,一般要注意两个问题:参数传递和现场保护第二节汇编语言程序的结构第34页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构参数传递一般可采用以下方法:·传递数据。·传送地址。·通过堆栈传递参数。·通过位地址传送参数。第35页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构例:设计一程序,由它的主程序循环调用子程序SHY。子程序SHY使连接到单片机P1口上的8个LED灯中的某个闪烁5次。主程序中的指令RLA将确定某个LED灯闪烁。

解:本例中的子程序入口地址是标号SHY地址,子程序返回指令是RET,主程序调用该子程序的调用指令是ACALLSKY。为观察到LED灯的闪烁,要求状态时钟信号频率低,为此,单片机可采用频率很低的外部振荡器信号。

第36页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构解:ORG0000HMOVA,#0FEH;灯亮初值STAR:ACALLSKY ;调用闪烁子程序

RLA;左移

SJMPSTAR;短跳到STAR,循环;以上程序段为主程序,以下程序段为子程序,标号SHY为其入口SKY:MOVR2,#5;闪烁子程序,闪烁5次计数SKY1:MOVP1,A;点亮

NOP;延时

MOVPL,#0FFH;熄灭

NOP ;延时

DJNZR2,SHY1;循环

RET ;子程序返回

END第37页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构例:将内部数据存储器某一单元中的一个字节的十六进制数转换成两位ASCII码,结果存放在内部数据存储器的两个连续单元中。假设一个字节的十六进制数在内部数据存储器40H单元,结果存于41H、42H单元中,用堆栈进行参数传递。

第38页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构解:

MAIN:MOVSP,#55H

MOVR1,#41H;R1为存结果指针

MOVA,40H;取要转换的数据

SWAPA;先转换高位字节

PUSHACC;压栈

LCALLHEASC;调用低半字节转换成

第39页/共67页第4章汇编语言程序设计5.主程序调用子程序结构

第二节汇编语言程序的结构解:ASCII码程序

POPACC;要转换的数据出栈

MOV@R1,A;存高半字节转换结果

INCR1

PUSH40H

LCALLHEASC

POPACC

MOV@R1,A;存低半字节转换结果

ENDHEASC:MOVR0,SP

DECR0

DECR0

XCHA,@R0;取被转换数据

ANDA,#0FH;保留低半字节

ADDA,#2;修改A

MOVCA,@A+PC;查表

XCHA,@R0;结果送回堆栈

RETTAB:DB30H,31H,32H,…第40页/共67页第4章汇编语言程序设计第三节算术运算程序设计4.3算术运算程序设计1.加法程序51指令系统中有加、减、乘、除、加1、减1等指令,可通过设计程序来处理一般不大复杂的算术运算。设计中要注意程序执行对PSW的影响。

多字节加、减运算是应用程序设计中经常要进行的一种运算,加、减运算程序可以分为无符号多字节数加减运算和带符号多字节数加减运算程序两种。第41页/共67页第4章汇编语言程序设计1.加法程序例:两个无符号双字节数相加。设被加数存放在内部存储器40H(高位字节)、41H(低位字节)单元,加数存放在内部存储器50H(高位字节)、51H(低位字节)单元,和存入40H(高位字节)、41H(低位字节)单元。

第三节算术运算程序设计第42页/共67页第4章汇编语言程序设计1.加法程序解:ORG

0000H

CLR

C;将C清零

MOV

R0,#41H;送被加数首址

MOV

R1,#51H;送加数首址

MOV

A,@R0;取被加数低字节

ADD

A,@R1;两个低字节相加

MOV

@R0,A;低字节和存人被加数低字节

DEC

R0;修改指针,指向被加数高字节

DEC

R1;修改指针,指向加数高字节

MOV

A,@R0;取被加数高字节

ADDC

A,@R1;高字节相加

MOV

@R0,A;存结果

END

第三节算术运算程序设计第43页/共67页第4章汇编语言程序设计1.加法程序例:设在BLOCK和BLOCK+1单元中有两个补码形式的带符号数。请编出求两数之和,并把它放在SUM和SUM+1单元(低8位在SUM单元)的子程序。

解:在两个8位二进制带符号数相加时,其和很可能会超过8位数能表示的范围而需要采用16位数形式来表示,因此,在进行加法时,可以预先把这两个加数扩张成16位二进制补码形式,然后对它完成双字节相加。

因此,一个8位二进制正数扩张成16位时只要把它的高8位变成全“0”,一个8位二进制负数扩张成16位时需要把它的高8位变成全“1”。据此,我们在编程时应在加减运算前先对加数和被加数进行扩张,然后完成求和。设R2和R3分别用来存放被加数和加数高8位

第三节算术运算程序设计第44页/共67页第4章汇编语言程序设计1.加法程序解:ORG1000HSBADD:PUSHACCPUSHPSW;保护现场

MOVPSW,#08H MOVR0,#BLOCK;R0指向一个加数

MOVR1,#SUM;R1指向和单元

MOVR2,#00H;高位先令其为零

MOVR3,#00HMOVA,@R0;一个加数

JNBACC.7,POS1;若为正数,则转POS1MOVR2,#0FFH;若为负数,则全“1”送R2第三节算术运算程序设计第45页/共67页第4章汇编语言程序设计1.加法程序POS1:INCR0;R0指向下一个加数

MOVB,@R0;取第二加数到BJNBB.7,POS2;若是正数,则转POS2MOVR3,#0FFH;若是负数,则全“1”送R3POS2:ADDA,B;低8位相加

MOV@R1,A;存低8位和

INCR1;R1指向SUM+1单元

MOVA,R2ADDCA,R3;完成高8位求和

MOV@R1,A;存高8位和

POPPSW;恢复现场

POPACCRETEND第三节算术运算程序设计第46页/共67页第4章汇编语言程序设计2.减法程序例:已知BLOCK1和BLOCK2为起始地址的存储区中分别有5字节无符号被减数和减数(低位在前,高位在后)。请编制一个减法子程序,令它们相减,并把差值放入BLOCK1为起始地址的存储单元。解:用减法指令从低字节开始相减。相应程序为:

第三节算术运算程序设计第47页/共67页第4章汇编语言程序设计2.减法程序解:ORG1000HSBYTESUB:MOVR0,#BLOCK1;被减数始址送R0MOVR1,#BLOCK2;减数始址送R1MOVR2,#05H;字长送R2LOOP:CLRC;Cy清零

MOVA,@R0;被减数送ASUBBA,@R1;相减

MOV@R0,A;存差

INCR0;修改被减数地址指针

INCR1;修改减数地址指针

DJNZR2,LOOP;若未完,则LOOPRETEND第三节算术运算程序设计第48页/共67页第4章汇编语言程序设计2.减法程序MCS-51指令系统中只有十进制加法调整指令DAA,也即该指令只有在加法指令(ADD、ADDC)后,才能得到正确的结果。为了用十进制加法调整指令对十进制减法进行调整,必须采用补码相加的办法,用9AH减去减数即得到以十为模的减数的补码。例:多字节十进制BCD码减法子程序如下:

入口:被减数低字节地址在R1,减数低字节地址在R0,字节数在R2。出口:差(补码)的低字节地址在R0,字节数在R3。07H为符号位,“0”为正,“1”为负。第三节算术运算程序设计第49页/共67页第4章汇编语言程序设计2.减法程序程序为:ORG1000HSBCD:MOVR3,#00H;差字节数置0CLR07H;符号位清0CLRC;借位位清0SBCD1:MOVA,#9AH;减数对100求补码

SUBBA,@R0ADDA,@R1;补码相加

DAA;十进制相加调整

MOV@R0,A;存结果

INCR0;地址值增加1INCR1INCR3;差字节增加1CPLC;进位位求反,以形成正确的借位

DJNZR2,SBCD1;未减完,转SBCD1,继续

JNCSBCD2;无借位,转SBCD2SETB07H;有借位,置“1”符号位SBCD2:RET;返回主程序第三节算术运算程序设计第50页/共67页第4章汇编语言程序设计3.乘除法程序例:设R0和R1中有两个补码形式的带符号数,试编写出求两数之积并把积送入R3R2(R3内为积的高8位)中的程序。

解:MCS-51乘法指令是对两个无符号数求积的。若要对两个带符号数求积,则可采用对符号位单独处理的办法。相应处理步骤如下:单独处理被乘数和乘数的符号位。求被乘数和乘数的绝对值,并使两绝对值相乘而获得积的绝对值。对积进行处理。若积为正,则对积不作处理;若它为负,则对积求补,使之变为补码形式。

8位带符号数乘法程序如下:第三节算术运算程序设计第51页/共67页第4章汇编语言程序设计3.乘除法程序解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘数送ARLCA;被乘数符号送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘数送ARLCA;乘数符号送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;积的符号位送CyMOVSBIT,C;送入SBITMOVA,R0;处理被乘数

JNBSBIT1,NCH1;若它为正,则转NCH1CPLA;若它为负,则求补得绝对值

INCA第三节算术运算程序设计第52页/共67页第4章汇编语言程序设计3.乘除法程序续解:ORG1000HSBITBIT20H.0SBIT1BIT20H.1SBIT2BIT20H.2MOVA,R0;被乘数送ARLCA;被乘数符号送CyMOVSBIT1,C;送入SBIT1MOVA,R1;乘数送ARLCA;乘数符号送CyMOVSBIT2,C;送入SBIT2ANLC,SBIT1;SBIT1∧SBIT2送CyMOVSBIT,C;送入SBITMOVC,SBIT1;SBIT1送CyANLC,/SBIT2;SBIT1∧SBIT2送CyORLC,SBIT;积的符号位送CyMOVSBIT,C;送入SBITMOVA,R0;处理被乘数

JNBSBIT1,NCH1;若它为正,则转NCH1CPLA;若它为负,则求补得绝对值

INCA第三节算术运算程序设计第53页/共67页第4章汇编语言程序设计3.乘除法程序续:NCH1:MOVB,A;被乘数绝对值送BMOVA,R1;处理乘数

JNBSBIT2,NCH2;若它为正,则转NCH2CPLA;若它为负,则求补得绝对值

ADDA,#01HNCH2:MULAB;求积的绝对值

JNBSBIT,NCH3;若它为正,则转NCH3CPLA;若它为负,则低字节求补

ADDA,#01HNCH3:MOVR2,A;积的低字节存入R2MOVA,B;积的高字节送AJNBSBIT,NCH4;若它为正,则转NCH4CPLA;若它为负,则高字节求补

ADDCA,#00HNCH4:MOVR3,A;积的高字节存入R3SJMP$;结束

END第三节算术运算程序设计第54页/共67页第4章汇编语言程序设计3.乘除法程序例:多字节无符号BCD码除法子程序如下:入口:30H为被除数低字节地址

40H为除数低字节地址

R3存除数字节数出口:50H为商低字节地址

30H为余数低字节地址

74存商字节数第三节算术运算程序设计第55页/共67页第4章汇编语言程序设计3.乘除法程序解:ORG2000HDIVB:MOVR0,#40H;除数低字节地址送R0MOV74H,#01H;商字节数赋初值

MOV73H,R3;除数字节数送73HDIV1:MOVA,@R0;判除数为0?

JNZDIV2;除数非0,转DIV2INCR0;除数为0,转DIV4,返回主程序

DJNZR3,DIV1SJMPDIV4DIV2:MOV R3,73H MOV R0,#50HDIV3:MOV@R0,#00H;商单元清0INCR0DJNZR3,DIV3MOVR3,73H;除数BCD码取补

MOVR0,#40HMOVR1,#60HCLRCMOVA,#9AH

第三节算术运算程序设计第56页/共67页第4章汇编语言程序设计3.乘除法程序续:DIV5:SUBBA,@R0MOV@R1,AINCR1INCR0MOVA,#99HDJNZR3,DIV5DIV6:MOVR0,#30H;被除数与除数补码相加

MOVR3,73HMOVR1,#60HMOVR5,74H第三节算术运算程序设计第57页/共67页第4章汇编语言程序设计第四节非数值操作程序设计4.4非数值操作程序设计

1.码制转换程序在单片机应用程序的设计中,经常涉及到各种码制的转换问题。在单片机系统内部进行数据计算和存储时,多采用二进制码。二进制码具有运算方便、存储量小的特点。在输入/输出中,按照人的习惯多采用代表十进制数的BCD码(用4位二进制数表示的十进制数)表示。第58页/共67页第4章汇编语言程序设计1.码制转换程序1)二进制(或十六进制)数转换成BCD码十进制数常用BCD码表示。而BCD码又有两种形式:一种是1个字节放1位BCD码,一种是压缩的BCD码,【例4-17】将单字节二进制数转换成BCD码第四节非数值操作程序设计第59页/共67页第4章汇编语言程序设计1.码制转换程序解:ORG0000H MOV A,#89H ;十六进制数89H送A中

MOV B,#100 ;100作为除数送入B中

DIV AB ;十六进制除以100 MOV R3,A ;百位数送R3,余数在B中

MOV A,#10 ;分离十位和个位数

XCH A,B;余数送入A中,除数10在B中

DIV AB ;分离出十位在A中个位在B中

SWAP A ;十位数交换到A中的高

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论