《单片机课件-第四章.ppt》由会员分享,可在线阅读,更多相关《单片机课件-第四章.ppt(85页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章第四章 汇编语言程序设计汇编语言程序设计回顾:回顾:MCS-51单片机系统单片机系统硬件资源硬件资源 MCS-51单片机指令系统单片机指令系统单片机系统应用程序设计单片机系统应用程序设计:熟悉单片机的硬件原理熟悉单片机的硬件原理 掌握单片机的汇编指令掌握单片机的汇编指令 二者二者有机的组合,形成系统应用程序有机的组合,形成系统应用程序提高提高单片机控制系统的特性和效率单片机控制系统的特性和效率:熟悉控制系统本身的硬件结构熟悉控制系统本身的硬件结构 熟悉编程思路、技巧,掌握编程方法、步骤熟悉编程思路、技巧,掌握编程方法、步骤信息学院 4.1 汇编语言程序设计方法汇编语言程序设计方法 4.2
2、 简单和分支程序设计简单和分支程序设计 4.3 循环和查表程序设计循环和查表程序设计 4.4 子程序和运算程序设计子程序和运算程序设计信息学院4.1 4.1 汇编语言程序设计方法汇编语言程序设计方法4.1.1 4.1.1 程序设计步骤程序设计步骤1、汇编语言程序设计汇编语言程序设计:根据设计任务要求,采根据设计任务要求,采用汇编语言编制程序的过程。用汇编语言编制程序的过程。2、应用程序设计步骤:应用程序设计步骤:1.拟定任务书拟定任务书 2.建立数学模型建立数学模型 3.建立算法建立算法 4.绘制程序流程图绘制程序流程图 5.编制汇编语言源程序编制汇编语言源程序 6.上机调试上机调试 注意:注
3、意:汇编调试需要多次试验汇编调试需要多次试验信息学院4.1.2 4.1.2 程序结构设计的基本方法程序结构设计的基本方法汇编语言程序设计汇编语言程序设计基本要求基本要求:高质量、可读性好、存储容量小和执行速度快高质量、可读性好、存储容量小和执行速度快汇编程序结构设计的基本方法:汇编程序结构设计的基本方法:1.1.简单程序的设计简单程序的设计 2.2.分支程序设计分支程序设计 3.3.循环程序设计循环程序设计 4.4.子程序设计子程序设计5.5.查表程序设计查表程序设计6.6.散转程序设计散转程序设计信息学院4.2 4.2 简单和分支程序设计简单和分支程序设计4.2.1 4.2.1 简单程序设计
4、简单程序设计 例例4.14.1 请用请用5151汇编指令编写程序,将外部汇编指令编写程序,将外部RAMRAM单元中单元中40H40H单单元元4 4位位BCDBCD数转换成数转换成ASCIIASCII码,送到内部码,送到内部RAMRAM单元单元60H 60H 61H 61H之之中。中。简单程序简单程序:是指程序设计中没有使用转移类指令的程序段是指程序设计中没有使用转移类指令的程序段。也称也称顺序程序或直线程序。顺序程序或直线程序。程序执行程序执行:按照指令存储位置的先后顺序依次执行,中间不会按照指令存储位置的先后顺序依次执行,中间不会 有任何分支程序、循环程序等有任何分支程序、循环程序等。程序程
5、序特点:特点:结构简单,易于阅读理解结构简单,易于阅读理解,大量使用数据传送指令大量使用数据传送指令。解:解:根据根据ASCIIASCII字符表,十进制数字符表,十进制数0 0 9 9的的ASCIIASCII码和它的码和它的BCDBCD码之间仅相差码之间仅相差30H30H,本题需要把一个字节的两位,本题需要把一个字节的两位BCDBCD数进行数进行拆分,然后分别和拆分,然后分别和30H30H相加,即得到相应的相加,即得到相应的ASCIIASCII码。码。信息学院参考设计程序如下:参考设计程序如下:ORG 1000H ADDR1 DATA 0040H ADDR2 EQU 60H MOV DPTR,
6、#ADDR1 ;源地址源地址=DPTR MOV R0,#ADDR2 ;目标地址目标地址=R0 MOV R0,#00H ;目标地址单元清零目标地址单元清零 MOVX A,DPTR ;源地址单元中源地址单元中BCD数送数送A MOV B,A ANL A,#0FH ORL A,#30H ;完成低位完成低位BCD数转换数转换 MOV R0,A ;存入存入60H INC R0 MOV A,B ANL A,#0F0H SWAP A ;高位高位BCD数送低数送低4位位 ORL A,#30H ;完成高位完成高位BCD数转换数转换 MOV R0,A ;存入存入61H SJMP$END信息学院4.2.2 4.2.
7、2 分支程序设计分支程序设计n 分支程序的分支程序的特点特点是程序中含有转移指令。是程序中含有转移指令。由于转移指令有无条件转移和条件转移之分,因此分支由于转移指令有无条件转移和条件转移之分,因此分支程序也可分为程序也可分为无条件分支程序无条件分支程序和和条件分支程序条件分支程序两类。两类。无条件分支程序中含有无条件转移指令,因简单这里不无条件分支程序中含有无条件转移指令,因简单这里不作专门讨论;作专门讨论;条件分支程序条件分支程序中含有条件转移指令,是我们讨中含有条件转移指令,是我们讨论的重点。论的重点。v 条件分支程序体现了计算机执行程序时的分析判断能力。条件分支程序体现了计算机执行程序时
8、的分析判断能力。若某种条件满足,则机器就转移到另一分支上执行程序;若若某种条件满足,则机器就转移到另一分支上执行程序;若条件不满足,则机器就按原程序继续执行。条件不满足,则机器就按原程序继续执行。MCS-51 MCS-51中,条件转移指令共有中,条件转移指令共有1313条,分为累加器条,分为累加器A A判零判零条件转移、比较条件转移、减条件转移、比较条件转移、减1 1条件转移和位控制条件转移条件转移和位控制条件转移等四类。等四类。信息学院 例例4.24.2 已知已知VARVAR单元内有一自变量单元内有一自变量X X,请按如下条件编出求函,请按如下条件编出求函数值数值Y Y并将它存入并将它存入F
9、UNCFUNC单元的程序。单元的程序。Y 解:这是一个三分支归一的条件转移问题,程序实现通常可解:这是一个三分支归一的条件转移问题,程序实现通常可分为分为“先分支后赋值先分支后赋值”和和“先赋值后分支先赋值后分支”两种求解办法。两种求解办法。现分述如下:现分述如下:1先分支后赋值。题意告诉我们,自变量先分支后赋值。题意告诉我们,自变量X是个带符号数,是个带符号数,可采用累加器判零条件转移和位控制条件转移指令来实现,程可采用累加器判零条件转移和位控制条件转移指令来实现,程序流程如图序流程如图4-1(a)所示所示。信息学院相应程序为:相应程序为:ORG 1000HVAR DATA 30HFUNC
10、DATA 31H MOV A,VAR ;X送送AJZ DONE;若若X=0,则转则转DONE JNB ACC.7,POSI;若若X0,则转则转POSI MOV A,#0FFH ;若若X 0?A 1 存存结结果果A 1(a)先分支后赋值先分支后赋值 YN N Y 图图4-1 例例4.2流程图流程图 信息学院2先赋值后分支。先赋值后分支。先把先把X调入累加器调入累加器A,并判断它是并判断它是否为零?否为零?若若X0,则,则A中内容送中内容送FUNC单元;单元;若若X0,则先给则先给R0赋值(如赋值(如1),),然后判断然后判断A0?若若A0,则把则把R0修改成修改成1后送后送FUNC单元,单元,程
11、序流程如图程序流程如图4-1(b)所示。所示。(b)先赋值先赋值后分支后分支 A X,R0 0 R0 1 存存结结果果 R0 1A=0?A 0?YN YN 图图4-1 例例4.2流程图流程图 信息学院相应程序为:相应程序为:ORG 1000H VAR DATA 30H FUNC DATA 31H MOV R0,#00H MOV A,VAR ;X送送A JZ DONE ;若若X=0,则转则转DONE MOV R0,#0FFH ;若若X 0,则则1送送R0 JB ACC.7,DONE ;若若X 0,则则1送送R0 DONE:MOV FUNC,R0 ;存存Y值值 SJMP$END信息学院 例例4.3
12、 某系有某系有200名学生参加外语统考,若成绩已存放名学生参加外语统考,若成绩已存放在在MCS-51外部外部RAM始地址为始地址为ENGLISH的连续存储单元,的连续存储单元,现决定给成绩在现决定给成绩在95分分100分之间学生颁发分之间学生颁发A级合格证书和级合格证书和成绩在成绩在90分分94分之间学生颁发分之间学生颁发B级合格证书。试编制一级合格证书。试编制一个程序,可以统计个程序,可以统计A级和级和B级证书的学生人数,并把统计结级证书的学生人数,并把统计结果存入内部果存入内部RAM的的GRADA和和GRADB单元。单元。解:这是一个循环和分支相结合程序,解:这是一个循环和分支相结合程序,
13、程序流程图如图程序流程图如图4-2所示。所示。信息学院 A95?A90?完成否完成否?GRADB单元内容加单元内容加1修改修改DPTR指针指针 结结 束束GRADA单元单元内容加内容加1GRADA和和GRADB单元清零、单元清零、DPTR置初置初值值ENGLISH、循环计数器循环计数器R2置初值置初值200取某学生外语成绩取某学生外语成绩图图4-2 例例4.34.3程序流程图程序流程图 信息学院相应程序为:相应程序为:ORG 1000HENGLISH DATA 2000HGRADA DATA 20HGRADB DATA 21H MOV GRADA,#00H ;GRADA单元清零单元清零 MOV
14、 GRADB,#00H ;GRADB单元清零单元清零 MOV R2,#0C8H ;参考总人数送参考总人数送R2 MOV DPTR,#ENGLISH ;学生成绩始地址送学生成绩始地址送DPTRLOOP:MOVX A,DPTR ;取某学生成绩到取某学生成绩到A CJNE A,#5FH,LOOP1 ;和和95作比较,形成作比较,形成CyLOOP1:JNC NEXT1 ;若若A95,则,则NEXT1 CJNE A,#5AH,LOOP2 ;和和90作比较作比较LOOP2:JC NEXT ;A e63,则两个存贮单元中内容交换,则两个存贮单元中内容交换,反之就不交换;反之就不交换;然后使然后使e62和和e
15、63相比,按同样原则决定是否交换;相比,按同样原则决定是否交换;一直比较下去;最后完成一直比较下去;最后完成e1和和e2比较及交换,经过比较及交换,经过N-163次次比较(常用内循环比较(常用内循环63次来实现)后,次来实现)后,e1位置上必然得到数组中的位置上必然得到数组中的最大值,犹如一个气泡从水底冒到了水顶,如图最大值,犹如一个气泡从水底冒到了水顶,如图4-5所示。所示。第二次冒泡过程和第一次冒泡过程完全相同,比较次数也可第二次冒泡过程和第一次冒泡过程完全相同,比较次数也可以是以是63次(其实只需次(其实只需62次),冒泡后可以在次),冒泡后可以在e2位置上得到次最大位置上得到次最大值,
16、如图值,如图4-5所示。所示。冒泡循环次数计算:冒泡循环次数计算:(以(以 64个数的排序为例)个数的排序为例)大循环(外循环)共大循环(外循环)共63次;次;内循环:共内循环:共6363次。次。完成完成64个数的排序需要外循环个数的排序需要外循环63次、内循环次、内循环3969次。次。信息学院第一次冒泡排序(比较第一次冒泡排序(比较5次)次)N=6时时 比较比较1 比较比较2 比较比较3 比较比较4 比较比较5 e1 4 4 4 4 4 256e2 1 1 1 1 256 4 e3 0 0 0 256 1 1e4 42 42 256 0 0 0e5 36 256 42 42 42 42e6
17、256 36 36 36 36 36信息学院第第二二次冒泡排序(比较次冒泡排序(比较4次)次)N=6时时 比较比较1 比较比较2 比较比较3 比较比较4e1 256 256 256 256 256 256e2 4 4 4 4 42 42 e3 1 1 1 42 4 4e4 0 0 42 1 1 1e5 42 42 0 0 0 0e6 36 36 36 36 36 36信息学院第第三三次冒泡排序(比较次冒泡排序(比较3次)次)N=6时时 比较比较1 比较比较2 比较比较3e1 256 256 256 256 256 256e2 42 42 42 42 42 42 e3 4 4 4 36 36 3
18、6e4 1 1 36 4 4 4e5 0 36 1 1 1 1e6 36 0 0 0 0 0信息学院第第四四次冒泡排序(比较次冒泡排序(比较2次)次)N=6时时 比较比较1 比较比较2e1 256 256 256 256 256 256e2 42 42 42 42 42 42 e3 36 36 36 36 36 36e4 4 4 4 4 4 4e5 1 1 1 1 1 1e6 0 0 0 0 0 0信息学院第第五五次冒泡排序(比较次冒泡排序(比较1次)次)N=6时时 比较比较1e1 256 256 256 256 256 256e2 42 42 42 42 42 42 e3 36 36 36
19、36 36 36e4 4 4 4 4 4 4e5 1 1 1 1 1 1e6 0 0 0 0 0 0信息学院其实,其实,64个无符号数的数组排序需要冒泡个无符号数的数组排序需要冒泡63次的机会是很次的机会是很少的,每次冒泡所需的数据比较次数,也是从少的,每次冒泡所需的数据比较次数,也是从63逐次减少(每逐次减少(每冒一次泡减少一次比较)。冒一次泡减少一次比较)。为了禁止那些不必要的冒泡次数,人们常常设置一个为了禁止那些不必要的冒泡次数,人们常常设置一个“交交换标志位换标志位”。“交换标志位交换标志位”在循环初始化时清零,在数据交在循环初始化时清零,在数据交换时置位成换时置位成1(表示冒泡中进行
20、过数据交换)。(表示冒泡中进行过数据交换)。“交换标志位交换标志位”用来控制是否再需要冒泡:用来控制是否再需要冒泡:若若“交换标志位交换标志位”为为1,则表明刚刚进行的冒泡中发生过数,则表明刚刚进行的冒泡中发生过数据交换(即排序尚未完成),应继续进行冒泡;据交换(即排序尚未完成),应继续进行冒泡;若若“交换标志位交换标志位”为为0,则表明刚进行完的冒泡中未发生过,则表明刚进行完的冒泡中未发生过数据交换(即排序已完成),冒泡应该禁止。数据交换(即排序已完成),冒泡应该禁止。例如,对于一个已经排好序的数组:例如,对于一个已经排好序的数组:1,2,3,63,64,排序程序只要进行一次冒泡便可根据,排
21、序程序只要进行一次冒泡便可根据“交换标志位交换标志位”状态而状态而结束排序程序的再执行,这自然可以节省结束排序程序的再执行,这自然可以节省63162次的冒泡次的冒泡时间。冒泡程序流程如图时间。冒泡程序流程如图4-6所示。所示。信息学院开始开始数据块始址送数据块始址送R0块长块长1 送送 R2“交换标志位交换标志位”7FH清零清零 eN送送20H和和A 修改数据指针修改数据指针 eN-1送送21H eNeN-1?“交换标志交换标志”7FH=1?e和和e在数据块中位置交换在数据块中位置交换“交换标志交换标志”7FH置置”1”结束结束 R210?图图4-6 冒泡程序流程图冒泡程序流程图 信息学院参考
22、程序为:参考程序为:ORG 1000H BUBBLE:MOV R0,#30H ;置数据块指针置数据块指针R0 MOV R2,#64 ;块长送块长送R2 CLR 7FH ;交换标志交换标志2FH.7清零清零 DEC R2 ;块长块长1为比较次数为比较次数 BULOOP:MOV 20H,R0 ;e送送20H MOV A,R0 ;e送送A INC R0 MOV 21H,R0 ;e送送21H CJNE A,21H,LOOP ;(20H)和和(21H)比较比较 LOOP:JC BUNEXT ;若;若(20H)除数?计数器减1计数器=0?返回NYN1商2减去除数0 商YR5R4R3R2C左环移1位NSDI
23、V0 CC=1?(R5R4)(R7R6)AR1(F0)=1?返回YYN(AR1)(R5R4)(执行减法)(R2)+1 R2(上商1)(R5R4)(R7R6)1 F016 BC F0(B)-1 B=0?1 F0YNN比较除法程序框图无符号双字节除法程序框图信息学院 判断除法是否完成(判断除法是否完成(B=0)?)?若未完成,则重复执行第四步;若已完成,若未完成,则重复执行第四步;若已完成,则令则令F0=0,然后结束除法运算。然后结束除法运算。参考程序为:参考程序为:ORG 1000H NSDIV:MOV A,R6 ;除数低除数低8位送位送A JNZ START ;若除数若除数0,则,则START
24、 MOV A,R7 ;除数高除数高8位送位送A JZ ERR ;若除数若除数0,则转,则转ERR START:MOV A,R4 ;R4送送A CLR C ;Cy清零清零 SUBB A,R6 ;R4R6送送A,形成形成Cy MOV A,R5 ;R5送送A SUBB A,R7 ;R5R7Cy送送A,形成形成Cy JNC LOOP4 ;若;若R5R4R7R6,则,则LOOP4(溢出)溢出)MOV B,#16 ;否则,准备做除法否则,准备做除法信息学院LOOP1:CLR C ;Cy清零清零 MOV A,R2 ;R2送送A RLC A ;左移一位,低位补零左移一位,低位补零 MOV R2,A ;送回送回
25、R2 MOV A,R3 ;R3送送A RLC A ;左移一位左移一位 MOV R3,A ;送回送回R3 MOV A,R4 ;R4送送A RLC A ;左移一位左移一位 MOV R4,A ;送回送回R4 XCH A,R5 ;R5进入进入A,R5保存保存R4移位后的内容移位后的内容 RLC A ;左移一位左移一位 XCH A,R5 ;送回送回R5,A中保存中保存R4移位后的内容移位后的内容 MOV PSW.5,C ;被除数最高位送被除数最高位送F0 CLR C ;Cy清零清零 SUBB A,R6 ;R4R6 MOV R1,A ;送;送R1保存保存 MOV A,R5 ;R5送送A信息学院 SUBB
26、A,R7 ;R5R7Cy送送A JB PSW.5,LOOP2 ;若够减(若够减(F0=1),则),则LOOP2 JC LOOP3 ;若不够减,则若不够减,则LOOP3 LOOP2:MOV R5,A ;余数高字节送余数高字节送R5 MOV A,R1 ;余数低字节送余数低字节送A MOV R4,A ;存入存入R4 INC R2 ;上商上商1 LOOP3:DJNZ B,LOOP1 ;若除法未完,则若除法未完,则LOOP1 CLR PSW.5 ;若除法完成,若除法完成,则则F0清零清零 DONE:RET ;返回主程序返回主程序 LOOP4:SETB PSW.5 ;令;令F0=1 SJMP DONE ;
27、转入转入DONE ERR:;出错处理程序出错处理程序 END 上述子程序中,我们省略了累加器上述子程序中,我们省略了累加器A、B寄存器、寄存器、PSW和和R1中内容的保护和恢复语句。在实际编程中,若需要的话中内容的保护和恢复语句。在实际编程中,若需要的话可根据实际情况添补。可根据实际情况添补。信息学院(2)带符号多字节乘法运算程序)带符号多字节乘法运算程序 带符号多字节乘除法运算程序和无符号多字节乘除法运算带符号多字节乘除法运算程序和无符号多字节乘除法运算程序类似,只是符号位应单独处理。为了简便起见,以程序类似,只是符号位应单独处理。为了简便起见,以8位带位带符号乘法运算程序为例说明符号处理的
28、运算规则。符号乘法运算程序为例说明符号处理的运算规则。例例4.15 设设R0和和R1中有两个补码形式的带符号数,试编写出求中有两个补码形式的带符号数,试编写出求两数之积并把积送入两数之积并把积送入R3R2(R3内为积的高内为积的高8位位)中的程序。中的程序。解:解:MCS-51乘法指令是对两个无符号数求积的。若要对两个带乘法指令是对两个无符号数求积的。若要对两个带符号数求积,则可采用对符号位单独处理的办法。相应处理符号数求积,则可采用对符号位单独处理的办法。相应处理步骤如下:步骤如下:(1)单独处理被乘数和乘数的符号位。办法是单独取出被乘单独处理被乘数和乘数的符号位。办法是单独取出被乘数符号位
29、并和乘数符号位进行异或操作,因积的符号位的产数符号位并和乘数符号位进行异或操作,因积的符号位的产生规则是同号相乘为正和异号相乘为负。生规则是同号相乘为正和异号相乘为负。(2)求被乘数和乘数的绝对值,并使两绝对值相乘而获得积的求被乘数和乘数的绝对值,并使两绝对值相乘而获得积的绝对值。方法是分别判断被乘数和乘数的符号位:若它为正,绝对值。方法是分别判断被乘数和乘数的符号位:若它为正,则其本身就是绝对值;若它为负,则对它求补。则其本身就是绝对值;若它为负,则对它求补。(3)对积进行处理。若积为正,则对积不作处理;若它为负,对积进行处理。若积为正,则对积不作处理;若它为负,则对积求补,使之变为补码形式
30、。则对积求补,使之变为补码形式。信息学院8位带符号数乘法程序如下:位带符号数乘法程序如下:ORG 1000H SBIT BIT 20H.0 SBIT1 BIT 20H.1 SBIT2 BIT 20H.2 MOV A,R0 ;被乘数送被乘数送A RLC A ;被乘数符号送被乘数符号送Cy MOV SBIT1,C ;送入送入SBIT1 MOV A,R1 ;乘数送乘数送A RLC A ;乘数符号送乘数符号送Cy MOV SB IT2,C ;送入送入SBIT2 ANL C,/SBIT1 ;SBIT1SBIT2送送Cy MOV SBIT,C ;送入送入SBIT MOV C,SBIT1 ;SBIT1送送C
31、y ANL C,/SBIT2 ;SBIT1SBIT2送送Cy ORL C,SBIT ;积的符号位送积的符号位送Cy MOV SBIT,C ;送入送入SBIT信息学院 MOV A,R0 ;处理被乘数处理被乘数 JNB SBIT1,NCH1 ;若它为正,则转若它为正,则转NCH1 CPL A ;若它为负,则求补得绝对值若它为负,则求补得绝对值 INC A NCH1:MOV B,A ;被乘数绝对值送被乘数绝对值送B MOV A,R1 ;处理乘数处理乘数 JNB SBIT2,NCH2 ;若它为正,则转若它为正,则转NCH2 CPL A ;若它为负,则求补得绝对值若它为负,则求补得绝对值 ADD A,#
32、01H NCH2:MUL AB ;求积的绝对值求积的绝对值 JNB SBIT,NCH3 ;若它为正,则转若它为正,则转NCH3 CPL A ;若它为负,则低字节求补若它为负,则低字节求补 ADD A,#01H NCH3:MOV R2,A ;积的低字节存入积的低字节存入R2 MOV A,B ;积的高字节送积的高字节送A JNB SBIT,NCH4 ;若它为正,则转若它为正,则转NCH4 CPL A ;若它为负,则高字节求补若它为负,则高字节求补信息学院 ADDC A,#00H NCH4:MOV R3,A ;积的高字节存入积的高字节存入R3 SJMP$;结束结束 END 应当注意:应当注意:对积的
33、低字节求补时使用了对积的低字节求补时使用了ADD加法指令,之所以没有加法指令,之所以没有用用INC指令是因为指令是因为INC指令执行时不会影响指令执行时不会影响Cy标志。标志。这种对带符号数的处理方法,不仅可以用作单字节的乘法和除法,这种对带符号数的处理方法,不仅可以用作单字节的乘法和除法,而且对多字节的乘法和除法也是实用的。而且对多字节的乘法和除法也是实用的。信息学院 正正得正,负负得正,正负得负的原则可得积 的符号。清“0”符号位,执行无符号位乘法,最后送积的 符号例20将(R4R5)和(R6R7)中两个原码有符号数,相乘结果送R0开始的单元,操作数的符号位在最高位,根据右图所示的计算方法
34、,可直接编写程序:IMUL:MOV A,R4 XRLA,R6 MOVC,ACC.7 MOVF0,C;暂存积的符号 MOVA,R4 CLRACC.7;清“0”被乘数符号位 MOVR4,A MOVA,R6 CLRACC.7;清“0”乘数符号位 MOVR6,A原码乘法A0 B0 F0+A*B*C*F0 C0返回在做乘法之前信息学院 ACALLMLTY;调用无符号双字节乘法子程序 MOVA,R0 MOVC,F0;回送积符 MOVACC.7,C MOVR0,A RET信息学院除数低字节地址送除数低字节地址送R0,商字节赋初值商字节赋初值除数字节数存除数字节数存73H单元单元商单元清商单元清0除数除数BC
35、D码取补码取补被除数与除数补码相加被除数与除数补码相加 CY=1?商加商加1加进位位加进位位商加商加1后有进位?后有进位?BCD码修正码修正 除除数数=0?恢复余数恢复余数返返 主主 图图4.11 例例4.16程序流程程序流程Y N NYY(3)多字节多字节BCD码除法子程序码除法子程序 除法是乘法的逆运算,可以除法是乘法的逆运算,可以参照乘法的方法用左移相减来完成。参照乘法的方法用左移相减来完成。该过程与用竖式做除法类似,用手该过程与用竖式做除法类似,用手算除法时,是先判断被除数或余数算除法时,是先判断被除数或余数是否比除数大,再决定商上是否比除数大,再决定商上“1”做减法,或商上做减法,或
36、商上“0”不做减法。不做减法。而在计算机中,则是先做减法,再而在计算机中,则是先做减法,再由余数符号判别商上由余数符号判别商上“1”还是还是“0”。本节介绍另一种方法,。本节介绍另一种方法,用用连续减来完成多字节运算连续减来完成多字节运算,相对于,相对于左移相减,程序要短些,且易于理左移相减,程序要短些,且易于理解,但运算效率较低。这种除法的解,但运算效率较低。这种除法的流程如图流程如图4.11所示。所示。信息学院例例4.16 多字节无符号多字节无符号BCD码除法子程序如下:码除法子程序如下:入口:入口:30H为被除数低字节地址为被除数低字节地址 40H为除数低字节地址为除数低字节地址 R3存
37、除数字节数存除数字节数 出口:出口:50H为商低字节地址为商低字节地址 30H为余数低字节地址为余数低字节地址 74存商字节数存商字节数 源程序:源程序:ORG 2000H DIVB:MOV R0,#40H ;除数低字节地址送除数低字节地址送R0 MOV 74H,#01H ;商字节数赋初值商字节数赋初值 MOV 73H,R3 ;除数字节数送除数字节数送73H DIV1:MOV A,R0 ;判除数为判除数为0?JNZ DIV2 ;除数非除数非0,转,转DIV2 INC R0 ;除数为除数为0,转,转DIV4,返回主程序返回主程序 DJNZ R3,DIV1 SJMP DIV4 DIV2:MOV R
38、3,73H MOV R0,#50H信息学院 DIV3:MOV R0,#00H ;商单元清商单元清0 INC R0 DJNZ R3,DIV3 MOV R3,73H ;除数除数BCD码取补码取补 MOV R0,#40H MOV R1,#60H CLR C MOV A,#9AH DIV5:SUBB A,R0 MOV R1,A INC R1 INC R0 MOV A,#99H DJNZ R3,DIV5 DIV6:MOV R0,#30H ;被除数与除数补码相加被除数与除数补码相加 MOV R3,73H MOV R1,#60H MOV R5,74H信息学院 CLR C DIV7:MOV A,R0 ADDC
39、 A,R1 DA A MOV R0,A INC R0 INC R1 DJNZ R3,DIV7 JNC DIV10 ;被除数小于除数,转被除数小于除数,转DIV10 CLR C ;被除数大于除数,商增被除数大于除数,商增1 MOV R3,73H MOV R0,#50H MOV A,R0 ADD A,#01H DA A MOV R0,A DJNZ R5,DIV8信息学院 JC DIV9 ;商为商为1字节,其值字节,其值100,转,转DIV9 SJMP DIV6 ;否则,转否则,转DIV6 DIV8:INC R0 ;伤字节数伤字节数1,商进位加,商进位加1,并进行,并进行BCD修正。修正。MOV A
40、,R0 ;ADDC A,#00H DA A MOV R0,A ;JNC DIV6 ;无进位转无进位转DIV6 DJNZ R5,DIV8 ;有进位,商字节未加完继续有进位,商字节未加完继续 DIV9:INC R0 ;商最低字节商最低字节100,进位加,进位加1,或最高字节加,或最高字节加1 有进位商有进位商 INC R0 INC 74H SJMP DIV6DIV10:CLR C MOV R0,#30H MOV R1,#40H信息学院 MOV R3,73H DIV11:MOV A,R0 ADDC A,R1 DA A MOV R0,A INC R0 INC R1 DJNZ R3,DIV11 DIV4
41、:RET信息学院4.4.3 4.4.3 代码转换程序代码转换程序 代码转换是计算机程序中经常遇到的一种数据处理过程,以下介绍代码转换是计算机程序中经常遇到的一种数据处理过程,以下介绍几种代码转换程序,供使用时参考。几种代码转换程序,供使用时参考。(1)4位二进制转换为位二进制转换为ASCII代码代码 从从ASCII编码表可知,若编码表可知,若4位二进制数小于位二进制数小于10,则此二进制数加上,则此二进制数加上30H即变为相应的即变为相应的ASCII码,若大于码,若大于10,则应加上,则应加上37H方可。由于该过方可。由于该过程比较简单,所以下面直接给出转换子程序。程比较简单,所以下面直接给出
42、转换子程序。入口:入口:R2存放转换前存放转换前4位二进制数位二进制数 出口:出口:R2存放转换后的存放转换后的ASCII码码 源程序:源程序:ORG 1000H ASCB1:MOV A,R2 ANL A,#0FH ;取出四位二进制数取出四位二进制数 PUSH ACC ;压入堆栈压入堆栈 CLR C SUBB A,#0AH ;与数与数10 比较比较信息学院 POP A JC LOOP ;小于小于10,则转,则转LOOP执行执行 ADD A,#07H ;否则,该数加否则,该数加7 LOOP:ADD A,#30H ;加加30H,转换为转换为ASCII码码 MOV R2,A ;保存结果,结果存于保存
43、结果,结果存于R2 RET ;返回返回 (2)ASCII码转换为四位二进制数码转换为四位二进制数 这是上述转换的逆过程,程序如下:这是上述转换的逆过程,程序如下:入口:转换前入口:转换前ASCII码送码送R2。出口:转换后的二进制数存于出口:转换后的二进制数存于R2。源程序:源程序:ORG 1000H BCDB1:MOV A,R2 CLR C SUBB A,30H ;ASCII码减码减30H MOV R2,A ;二进制数据保存于二进制数据保存于R2 SUBB A,#0AH ;JC LOOP ;若该数若该数10,返回主程序,返回主程序信息学院 MOV A,R2 ;若该数若该数10,再减再减7 S
44、UBB A,07H MOV R2,A ;所得二进制数送所得二进制数送R2 LOOP:RET ;返回主程序返回主程序 (3)BCD 码转换为二进制码子程序码转换为二进制码子程序 设有用设有用BCD码表示的码表示的4位十进制数分别存放于位十进制数分别存放于R1、R2中,其中中,其中R2存存千位和百位数,千位和百位数,R1存拾位和个位数,要把其转换为纯二进制码,可用存拾位和个位数,要把其转换为纯二进制码,可用由高位到低位逐位检查由高位到低位逐位检查BCD码的数值,然后累加码的数值,然后累加各十进制位对应的二各十进制位对应的二进制数来实现。其中进制数来实现。其中1000D=03E8H,100D=006
45、4H,10=000AH(各位各位数的数的BCD码与二进制码相同)。子程序如下:码与二进制码相同)。子程序如下:入口:待转换的入口:待转换的BCD码存于码存于R1、R2中,分配如下中,分配如下 低位字节低位字节 拾位数拾位数 个位数个位数 R1 高位字节高位字节 千位数千位数 百位数百位数 R2 出口:结果存在出口:结果存在20H、21H单元中,其中单元中,其中20H存低字节,存低字节,21H存高字节。存高字节。信息学院 原程序:原程序:BCDBI1:MOV 20H,#00H MOV 21H,#00H ;存结果单元存结果单元 MOV R3,#0E8H MOV R4,#03H ;1千的二进制数送千
46、的二进制数送R3、R4 MOV A,R2 ANL A,#0F0H ;取千位数取千位数 SWAP A ;将千位数移至低四位将千位数移至低四位 JZ BRAN1 ;千位数为千位数为0,则转,则转BRAN1 LOOP1:DEC A ACALL ADDT ;千位数不为千位数不为0,加千位数二进制码,加千位数二进制码 JNZ LOOP1 BRAN1:MOV R3,#64H MOV R4,#00H ;百位数的二进制码送百位数的二进制码送R3、R4 MOV A,R2 ANL A,#0FH ;取百位数取百位数 JZ BRAN2 ;为为0则转则转BRAN2,否则继续否则继续信息学院 LOOP2:DEC A AC
47、ALL ADDT JNZ LOOP2 ;加百位数的二进制码加百位数的二进制码 BRAN2:MOV R3,#0AH MOV A,R1 ANL A,#0F0H ;取十位数取十位数 SWAP A ;将十位数移至低四位将十位数移至低四位 JZ BRAN3 ;十位数为十位数为0,转,转BRAN3,否则继否则继续续 LOOP3:DEC A ACALL ADDT JNZ LOOP3 ;加十位数的二进制玛加十位数的二进制玛 BRAN3:MOV A,R1 ANL A,#0FH MOV R3,A ACALL ADDT RET ADDT:PUSH PSW CLR C信息学院 MOV A,20H ;在;在20H、21H单元中,单元中,ADD A,R3 ;累计转换结果累计转换结果 MOV 20H,A MOV A,21H ADDC A,R4 MOV 21H,A POP PSW RET