第4章程序设计

上传人:无*** 文档编号:237724176 上传时间:2023-12-19 格式:PPT 页数:62 大小:291.10KB
收藏 版权申诉 举报 下载
第4章程序设计_第1页
第1页 / 共62页
第4章程序设计_第2页
第2页 / 共62页
第4章程序设计_第3页
第3页 / 共62页
资源描述:

《第4章程序设计》由会员分享,可在线阅读,更多相关《第4章程序设计(62页珍藏版)》请在装配图网上搜索。

1、第章第章 程序设计程序设计 虽虽然然单单片片机机的的每每条条指指令令能能使使计计算算机机完完成成一一种种特特定定的的操操作作。但但要要完完成成某某一一特特定定的的任任务务还还需需要要将将这这些些指指令令按按工工作作要要求求有有序序组组合合为为一一段段完完整整的的程程序序。程程序序实实际际上上是是一一系系列列计计算算机机指指令令的的有有序序集集合合。我我们们把把利利用用计计算算机机的的指指令令系系统统来来合合理理地地编编写写出出解解决决某某个个问问题题的的程程序序的的过过程,称之为程序设计。程,称之为程序设计。4.1 简单汇编语言程序设计简单汇编语言程序设计 编制程序的步骤编制程序的步骤1.1.

2、任务分析(硬件、软件系统分析)任务分析(硬件、软件系统分析)2.2.确定算法和工作步骤;确定算法和工作步骤;3.3.程序总体设计和流程图绘制程序总体设计和流程图绘制关于流程图符号:关于流程图符号:开始、结束开始、结束-圆角矩形圆角矩形工作任务工作任务-矩形矩形判断分支判断分支-菱形菱形程序流向程序流向-程序连接程序连接-开始结束4.4.分配内存,确定程序与数据区存放地址;分配内存,确定程序与数据区存放地址;5.5.编写源程序;编写源程序;6.6.调试、修改,最终确定程序。调试、修改,最终确定程序。方法技巧方法技巧1.1.模块化设计(按功能分:显示、打印、输入、模块化设计(按功能分:显示、打印、

3、输入、发送等)发送等)2.2.尽量采用循环及子程序结构(节省内存)尽量采用循环及子程序结构(节省内存)汇编语言的规范汇编语言的规范1.1.汇编语言源程序由以下两种指令构成汇编语言源程序由以下两种指令构成汇编语句(指令语句)汇编语句(指令语句)伪指令(指示性语句)伪指令(指示性语句)2.2.汇编语句的格式:汇编语句的格式:标号标号:操作码操作码操作数操作数;注释;注释数据表示形式:数据表示形式:二进制(二进制(B B)、)、十六进制十六进制(H)(H)、十进制十进制(D(D或省略或省略)、ASCIIASCII码(以单引号标识)码(以单引号标识)3.3.伪指令:控制汇编用的特殊指令,这些指令不属伪

4、指令:控制汇编用的特殊指令,这些指令不属 于指令系统,不产生机器代码。于指令系统,不产生机器代码。4.1.1 分支程序分支程序分支程序可根据要求分支程序可根据要求无条件无条件或或条件地条件地改变程序执行流向。改变程序执行流向。编写分支程序主要在于正确使用编写分支程序主要在于正确使用转移指令转移指令。分支程序有:。分支程序有:单分支结构、双分支结构、多分支结构(散转)单分支结构、双分支结构、多分支结构(散转)条件成立?下条指令程序段A单分支结构YN条件成立?程序段AYN程序段A双分支结构分支程序分支程序可根据要求无条件或条件地改变程序执行流向。分支程序可根据要求无条件或条件地改变程序执行流向。编

5、写分支程序主要在于正确使用转移指令。分支程序有:编写分支程序主要在于正确使用转移指令。分支程序有:单分支结构、双分支结构、多分支结构(散转)单分支结构、双分支结构、多分支结构(散转)K=?程序段nn0程序段1多分支结构程序段011比较数的大小比较数的大小 入入口口条条件件:两两个个带带符符号号数数分分别别存存在在内内部部RAM 30H和和31H单单元元中中,试试比比较较它它们们的的大大小小,将将较较大大的的数存入数存入32H单元中。单元中。X XY Y为正为正:OV0,则,则XYOV=1,则,则XYX XY Y为负为负:OV0,则,则XYOV1,则,则XY ORG0100HMOV A,30H;

6、取初值取初值CLRCSUBB A,31H;XYJZDZ1;X=Y?JC EBBJBOV,EB1;XY0 0,OV=1,XYAJMP DZ1;XY0 0,OV=0,XYEBB:JB OV,DZ1;XY0 0,OV=1,XYEB1:MOVA,31H;XYAJMP JS0DZ1:MOVA,30H;XYJS0:MOV32H,AEND例例:设变量:设变量x x以补码形式存放在片内以补码形式存放在片内RAM 30HRAM 30H单元单元中,变量中,变量y y与与x x的关系是:的关系是:编程根据编程根据x x的值求的值求y y值并放回原单元。值并放回原单元。2函数运算 A=?y=x+50y=20Hy=x0

7、取x 即(30h)A开始存y 即y 30h结束 ORG 0000HORG 0000HSTART:MOV A,30HSTART:MOV A,30H JZ NEXT ;x=0,JZ NEXT ;x=0,转移转移 ANL A,#80H ;ANL A,#80H ;保留符号位保留符号位 JZ ED ;x0,JZ ED ;x0,转移转移 MOV A,#05H ;x0,MOV A,#05H ;x0,不转移不转移 ADD A,30HADD A,30H MOV 30H,A MOV 30H,A SJMP ED SJMP ED NEXT:MOV 30H,#20H NEXT:MOV 30H,#20H ED:SJMP$

8、ED:SJMP$STARTSTART:MOV DPTRMOV DPTR,#TAB#TAB MOV A MOV A,R7R7 ADD A,R7 ADD A,R7 ;R7R72 2A A MOV R3,A ;MOV R3,A ;暂存暂存R3R3 MOVC A,A+DPTR MOVC A,A+DPTR ;取高位地址取高位地址 XCH A XCH A,R3R3 INC A INC A MOVC A MOVC A,A+DPTR A+DPTR ;取低位地址取低位地址 MOV DPLMOV DPL,A A MOV DPH MOV DPH,R3 R3 ;转移地址送入转移地址送入DPTRDPTR CLR A C

9、LR A JMP A+DPTR JMP A+DPTR TAB:TAB:DWDW P0 P0 DWDW P1 P1 DW DW PN PN例例例例:根据根据根据根据R7R7R7R7的内容,转至对应的分支程序。设的内容,转至对应的分支程序。设的内容,转至对应的分支程序。设的内容,转至对应的分支程序。设R7R7R7R7的的的的内容为内容为内容为内容为0 0 0 0 N N N N,对应的处理程序地址分别为对应的处理程序地址分别为对应的处理程序地址分别为对应的处理程序地址分别为P0P0P0P0 P7P7P7P7P0高位P0低位TABP1高位P1低位TAB+2 4.3.3 4.3.3 循环程序循环程序循

10、环程序一般由:循环程序一般由:初始化部分初始化部分 循环体部分循环体部分-处理部分、修改部分、控制部分处理部分、修改部分、控制部分 结束部分结束部分其结构一般有两种:其结构一般有两种:先进入处理部分,再控制循环先进入处理部分,再控制循环 至少执行一次循环体至少执行一次循环体 先控制循环,再进入处理部分先控制循环,再进入处理部分 循环体是否执行,取决于判断结果。循环体是否执行,取决于判断结果。开始设置循环初值循环处理循环修改结束处理结束循环结束?开始设置循环初值循环处理循环修改结束处理结束循环结束?NYYN循环控制的一般方法:循环控制的一般方法:v 循环次数已知循环次数已知 利用循环次数控制利用

11、循环次数控制v 循环次数未知循环次数未知 利用关键字控制利用关键字控制v 利用利用“逻辑尺逻辑尺”根据根据“逻辑尺逻辑尺”的内容,进行控制。的内容,进行控制。例:统计数据块的长度 入口条件:内部入口条件:内部RAM 30HRAM 30H开始的存储区有若干个数据,开始的存储区有若干个数据,最后一个数据为字符最后一个数据为字符FFHFFH,结果存入结果存入40H40H单元。单元。ORGORG 0100H 0100HMAINMAIN:MOV R1MOV R1,#30H#30H;R1R1作为地址指针作为地址指针 CLRCLRA A;累加器累加器A A作为计数器作为计数器LOOPLOOP:CJNECJN

12、ER1R1,#0FFH#0FFH,NEXTNEXT;与数据与数据FFFF比较,不等转移比较,不等转移 SJMPSJMPJSH1JSH1;找到结束符号,结束循环找到结束符号,结束循环NEXTNEXT:INC INC A A;计数器加计数器加1 1 INC INCR1R1;指针加指针加l l SJMP L00P SJMP L00P;循环循环JSHlJSHl:INCINCA A ;再加入再加入l l个字符个字符 MOVMOV40H40H,A A;存结果存结果 ENDEND 4.1.3 延时程序延时程序 10.1s延时程序(晶振为延时程序(晶振为12M)ORG 0100HMOV R2,#200LOOP

13、:MOVR3,#250DJNZR3,$DJNZR2,LOOPRET由由于于采采用用12M晶晶振振,机机器器周周期期为为1s,DJNZ的的指指令令周周期期为为2,整整个个程程序序的的执执行行时时间间为为25020021s100000s0.1s 21s延时程序(晶振为延时程序(晶振为12M)ORG0100H MOVR1,#10LOOP1:MOVR2,#200LOOP:MOV R3,#250DJNZR3,$DJNZR2,LOOPDJNZR1,LOOP1RET例:50ms50ms延时子程序。设晶振频率为延时子程序。设晶振频率为12MHz12MHz,则机则机器周期为器周期为1us1us。DEL:MOV

14、R7,#200 ;1MCDEL:MOV R7,#200 ;1MCDEL1:MOV R6,#123 ;1MCDEL1:MOV R6,#123 ;1MC NOP ;1MC NOP ;1MC DJNZ R6,$;2MC DJNZ R6,$;2MC DJNZ R7,DEL1 ;2MC DJNZ R7,DEL1 ;2MC RET ;2MC RET ;2MC延时时间:延时时间:t=1+200(1+1+2*123)+2+2 50000us=50ms4.2 MCS-51常用子程序常用子程序 4.2.1 代码转换类程序设计代码转换类程序设计 4.2.2 查表程序设计查表程序设计 4.2.3 定点数运算子程序定点

15、数运算子程序 4.2.4 浮点数运算子程序浮点数运算子程序 子程序问题子程序问题子程序设计时注意事项:子程序设计时注意事项:1.1.给子程序赋一个名字。实际为入口地址代号。给子程序赋一个名字。实际为入口地址代号。2.2.要能正确传递参数:要能正确传递参数:入口条件:子程序中要处理的数据如何给予。入口条件:子程序中要处理的数据如何给予。出口条件:子程序处理结果如何存放。出口条件:子程序处理结果如何存放。(寄存器、存储器、堆栈方式)(寄存器、存储器、堆栈方式)3.3.保护与恢复现场:保护与恢复现场:保护现场:保护现场:压栈指令压栈指令PUSHPUSH 恢复现场:恢复现场:弹出指令弹出指令POPPO

16、P4.4.子程序可以嵌套子程序可以嵌套 4.2.1 代码转换类程序设计代码转换类程序设计 1单字节十六进制数转换成双字节单字节十六进制数转换成双字节ASCII码码 表4-1 十六进制数与ASCII码之间的关系十 六进制数十 六进制数十 六进制数十 六进制数 0 30H 4 34H 8 38H C 43H 1 31H 5 35H 9 39H D 44H 2 32H 6 36H A 41H E 45H 3 33H 7 37H B 42H F 46H入口条件:入口条件:待转换的单字节十六进制数在寄存器待转换的单字节十六进制数在寄存器R2中。中。出口:高四位的出口:高四位的ASCII码在码在A中,低四

17、位的中,低四位的ASCII码在码在B中。中。ORGORG0100H0100H MOVMOVA A,R2R2 MOVMOVB B,A A ;暂存待转换的单字节十六进制数暂存待转换的单字节十六进制数 LCALLLCALL MS1 MS1;转换低四位转换低四位 XCHXCHA A,B B;存放低四位的存放低四位的ASCIIASCII码码 SWAPSWAPA A;准备转换高四位准备转换高四位 LCALLLCALL MS1 MS1;转换高四位转换高四位 SJMPSJMP$MS1MS1:ANLANLA A,#0FH#0FH;将累加器的低四位转换成将累加器的低四位转换成 ASCII ASCII 码码 ADD

18、ADDA A,#90H#90H DADA A A ADDCADDCA A,#40H#40H DA DA A A RETRET将多位十六进制数转换成将多位十六进制数转换成ASCIIASCII码,设码,设R0R0指向十六进制数低位,指向十六进制数低位,R2R2存放字节数,转换后存放字节数,转换后R1R1指向指向ASCIIASCII码高位。码高位。HTASC:MOV A,R0 ;HTASC:MOV A,R0 ;取十六进制数取十六进制数 ANL A,#0FH ;ANL A,#0FH ;取低四位取低四位 ADD A,#15 ;ADD A,#15 ;偏移修正偏移修正 MOVC A,A+PC ;MOVC A

19、,A+PC ;查表得查表得ASCIIASCII码码 MOV R1,A ;MOV R1,A ;保存保存 INC R1INC R1 MOV A,R0 ;MOV A,R0 ;取十六进制数高四位取十六进制数高四位 SWAP A ;SWAP A ;ANL A,#0F0H ANL A,#0F0H ADD A,#06H ;ADD A,#06H ;偏移修正偏移修正 MOVC A,A+PC ;MOVC A,A+PC ;查表查表 MOV R1,A ;MOV R1,A ;保存保存 INC R0 ;INC R0 ;指向下一单元指向下一单元 INC R1INC R1 DJNZ R2,HTASC DJNZ R2,HTAS

20、C RET RETASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37HASCTAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46H DB 38H,39H,41H,42H,43H,44H,45H,46H2.ASCII码转换成十六进制数码转换成十六进制数入口条件:待转换的入口条件:待转换的 ASCII 码在码在R2中。中。出口:转换后的十六进制数在出口:转换后的十六进制数在R3中。中。ORG 0100HMOV A,R2 SUBB A,#30H CLR C JNB ACC.4,M

21、1 SUBB A,#7M1:MOV R3,A SJMP$END3.3.3.3.十六进制整数转换成单字节码整数十六进制整数转换成单字节码整数十六进制整数转换成单字节码整数十六进制整数转换成单字节码整数 入口条件:入口条件:待转换的单字节十六进制整数在待转换的单字节十六进制整数在R2中。中。出出口口:转转换换后后的的码码整整数数(十十位位和和个个位位)在在R5中中,百位在百位在R3中。中。MOV A,R2HBCD:MOV B,#100;分离出百位,存放在分离出百位,存放在 R3中中 DIVAB MOV R3,A MOV A,#10;余数继续分离十位和个位余数继续分离十位和个位 XCH A,B DI

22、VAB SWAP A ORLA,B;将十位和个位拼装成码将十位和个位拼装成码 MOV R5,A SJMP$END4双字节十六进制整数转换成双字节码整数双字节十六进制整数转换成双字节码整数 入口条件:入口条件:入口条件:入口条件:待转换的双字节十六进制整数在待转换的双字节十六进制整数在待转换的双字节十六进制整数在待转换的双字节十六进制整数在R6R6、R7R7中。中。中。中。出口:转换后的三字节码整数在出口:转换后的三字节码整数在出口:转换后的三字节码整数在出口:转换后的三字节码整数在R3R3、R4R4、R5R5中。中。中。中。ORGORG 0100H0100HHB2HB2:CLRCLRA A;码

23、初始化码初始化码初始化码初始化 MOVMOVR3R3,A A MOV MOVR4R4,A A MOV MOVR5R5,A A MOV MOV R2R2,#10H#10H;转换双字节十六进制整数转换双字节十六进制整数转换双字节十六进制整数转换双字节十六进制整数HB3HB3:MOVMOV A A,R7 R7;从高端移出待转换数的一位到从高端移出待转换数的一位到从高端移出待转换数的一位到从高端移出待转换数的一位到 CY CY 中中中中 RLCRLCA A MOV MOV R7R7,A A MOV MOVA A,R6R6 RLC RLCA A MOVR6,A MOVA,R5;码带进位自身相加,相当于乘

24、码带进位自身相加,相当于乘 ADDCA,R5 DAA;十进制调整十进制调整 MOVR5,A MOVA,R4 ADDC A,R4 DAA MOVR4,A MOVA,R3 ADDCA,R3 MOVR3,A;双字节十六进制数的万位数不超过,不用调整双字节十六进制数的万位数不超过,不用调整 DJNZR2,HB3;判断判断16位处理完?位处理完?SJMP$END5双字节码整数转换成双字节十六进制整数双字节码整数转换成双字节十六进制整数 入口条件:入口条件:待转换的双字节码整数在待转换的双字节码整数在R2、R3中。中。出口:出口:转换后的双字节十六进制整数仍在转换后的双字节十六进制整数仍在R2、R3中。中

25、。ORG 0100HBH2:MOV A,R3;将低字节转换成十六进制将低字节转换成十六进制 LCALL BCD1 MOV R3,A MOV A,R2;将高字节转换成十六进制将高字节转换成十六进制 LCALL BCD1 MOV B,#100;扩大一百倍扩大一百倍 MUL AB ADD A,R3;和低字节按十六进制相加和低字节按十六进制相加 MOV R3,A CLR A ADDCA,B MOV R2,A SJMP$BCD1:MOVB,#10H;分离十位和个位分离十位和个位 DIV AB MOV R4,B;暂存个位暂存个位 MOV B,#10;将十位转换成十六进制将十位转换成十六进制 MUL AB

26、ADD A,R4;十六进制加上个位十六进制加上个位 RET END 4.2.2 查表程序设计查表程序设计 MOVC A,A+DPTRMOVC A,A+PC1查表求查表求ASCII码码入入口口条条件件:R0低低四四位位有有一一个个十十六六进进制制数数(0F)。)。出出口口:将将查查表表找找出出的的相相应应ASCII码码并并送送回回R0中。中。ORG0100HMOVA,R0ANLA,#0FH;屏蔽高屏蔽高4位位ADDA,#03H;查查表表指指令令PC值值与与表表格格PC值相差值相差3字节字节MOVCA,A+PC;查表查表MOVR0,A;存结果存结果SJMP$ASCTAB:DB 0,1,2,3,4,

27、5,6,7DB 8,9,A,B,C,D,E,F4.2.3 定点数运算子程序定点数运算子程序 1多字节码加法多字节码加法 入入口口条条件件:字字节节数数在在R7中中,被被加加数数在在30H起起始始单单元元中,加数在中,加数在40H起始单元中。起始单元中。出口:出口:和在和在30H起始单元中,最高位进位在起始单元中,最高位进位在CY中。中。ORG 0100HMOV R7,#03HMOV R0,#30HMOV R1,#40HMOV A,R7 ;取字节数至取字节数至 R2 中中 MOV R2,A ADD A,R0;初始化数据指针初始化数据指针MOVR0,AMOVA,R2ADD A,R1MOVR1,AC

28、LR CBB1:DEC R0;调整数据指针调整数据指针DEC R1MOV A,R0ADDC A,R1;按字节相加按字节相加DAA;十进制调整十进制调整MOV R0,A;和存回和存回 R0 中中DJNZ R2,BB1;处理完所有字节处理完所有字节END2多字节码减法多字节码减法入口条件:入口条件:字节数在字节数在 R7 中,被减数在中,被减数在R0 中,减数在中,减数在 R1 中。中。出口:出口:差在差在 R0 中,最高位借位在中,最高位借位在CY中。中。ORG 0100HORG 0100HBCDBBCDB:LCALL MN1 LCALL MN1;减数;减数 R1 R1 十进制取补十进制取补 L

29、CALL BCDA LCALL BCDA;按多字节码加法处理;按多字节码加法处理 CPL CCPL C;将补码加法的进位标志转换成借位标志将补码加法的进位标志转换成借位标志 MOV F0MOV F0,C C LCALL MN1 LCALL MN1;恢复减数恢复减数 R1 R1 的原始值的原始值 MOV CMOV C,F0F0;恢复借位标志恢复借位标志 RETRETMN1MN1:MOVMOVA A,R0 R0;R1 R1 十进制取补子程序入口十进制取补子程序入口 XCHXCH A A,R1R1;交换指针交换指针 XCHXCH A A,R0R0 LCALL LCALLNEGNEG;通过通过 R0

30、R0 实现实现 R1 R1 取补取补 MOVMOV A A,R0R0 XCH XCH A A,R1 R1;换回指针换回指针 XCHXCH A A,R0R0 RET RETBCDABCDA:MOV MOV A A,R7 R7;取字节数至取字节数至 R2 R2 中中 MOVMOV R2R2,A A ADD ADD A A,R0 R0;初始化数据指针初始化数据指针 MOVMOV R0R0,A A MOV MOV A A,R2R2 ADDADD A A,R1R1 MOV MOV R1R1,A A CLR CLR C CBCD1BCD1:DECDECR0R0;调整数据指针调整数据指针 DECDECR1R

31、1 MOV MOVA A,R0R0 ADDC ADDCA A,R1 R1;按字节相加按字节相加 DADA A A;十进制调整十进制调整 MOVMOVR0R0,A A;和存回和存回 R0 R0 中中 DJNZDJNZR2R2,BCD1BCD1;处理完所有字节处理完所有字节 RETRETNEGNEG:MOVMOVA A,R7R7;BCDBCD码取补子程序码取补子程序 DECDECA AMOVMOVR2R2,A AMOVMOVA A,R0R0MOVR3,ANEG0:CLR CMOVA,#99HSUBBA,R0;按字节十进制取补按字节十进制取补MOVR0,A;存回存回 R0 中中INCR0;调整数据指

32、针调整数据指针DJNZR2,NEG0;处理完(处理完(R2)字节字节MOVA,#9AH;最低字节单独取补最低字节单独取补SUBB A,R0MOVR0,AMOVA,R3;恢复指针恢复指针MOV R0,ARET 4双字节二进制无符号数乘法子程序双字节二进制无符号数乘法子程序入口条件:被乘数在入口条件:被乘数在R2、R3 中,乘数在中,乘数在R6、R7中。中。出口:乘积在出口:乘积在 R2、R3、R4、R5 中。中。ORG 0100HMULD:MOV A,R3;计算计算 R3 乘乘 R7MOVB,R7MULABMOVR4,B;暂存部分积暂存部分积MOVR5,AMOVA,R3;计算计算 R3 乘乘 R

33、6MOVB,R6MULABADDA,R4;累加部分积累加部分积MOVR4,ACLRA ADDCA,BMOVR3,AMOVA,R2;计算计算 R2 乘乘 R7MOVB,R7MULABADDA,R4;累加部分积累加部分积MOVR4,AMOVA,R3ADDCA,BMOVR3,ACLRARLCAXCHA,R2;计算计算 R2 乘乘 R6MOVB,R6MULABADDA,R3;累加部分积累加部分积MOVR3,AMOVA,R2ADDCA,BMOVR2,ARET6双字节二进制无符号数除法子程序双字节二进制无符号数除法子程序入入口口条条件件:被被除除数数在在 R2、R3、R4、R5 中中,除除数在数在 R6、

34、R7 中。中。出出口口:OV=0 时时,双双字字节节商商在在 R2、R3 中中,OV=1 时溢出。时溢出。ORG 0100HDIVD:CLR C;比较被除数和除数比较被除数和除数 MOV A,R3 SUBB A,R7 MOV A,R2 SUBB A,R6 JC DVD1 SETB OV;溢出溢出 RETDVD1:MOV B,#10H;计算双字节商计算双字节商DVD2:CLRC;部分商和余数同时左移一位;部分商和余数同时左移一位MOVA,R5RLCAMOVR5,AMOVA,R4RLCAMOVR4,AMOVA,R3RLCAMOVR3,AXCHA,R2RLCAXCHA,R2MOVF0,C;保存溢出位

35、保存溢出位CLRCSUBBA,R7;计计算算(R2R3 R6R7)MOVR1,AMOVA,R2SUBBA,R6ANLC,/F0;结果判断结果判断JC DVD3MOVR2,A;够减,存放新的余数够减,存放新的余数MOVA,R1MOVR3,AINCR5;商的低位置一商的低位置一DVD3:DJNZ B,DVD2;计计算算完完十十六六位位商商(R4R5)MOVA,R4;将商移到将商移到 R2R3 中中MOVR2,AMOVA,R5MOVR3,ACLROV;设立成功标志设立成功标志RET4.2.4 浮点数运算子程序浮点数运算子程序1浮点数的表示浮点数的表示(1)二进制浮点操作数)二进制浮点操作数 用三个字

36、节表示,第一个字节的最高位为数用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为时,便称为规格化浮点当尾数的最高位为时,便称为规格化浮点数,简称操作数数,简称操作数(2 2)十进制浮点操作数)十进制浮点操作数用三个字节表示,第一个字节的最高位为数符,用用三个字节表示,第一个字节的最高位为数符,用来表示正负数(来表示正负数(0 0表示正数,表示正数,1 1表示负数)其

37、余七位表示负数)其余七位为阶码(二进制补码形式),第二字节为尾数的高为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节字节,第三字节为尾数的低字节,尾数用双字节BCDBCD码纯小数(原码)来表示。当十进制数的绝对值大码纯小数(原码)来表示。当十进制数的绝对值大于时,阶码就等于整数部分的位数。于时,阶码就等于整数部分的位数。例例如如:156.6 156.6 的的阶阶码码是是03H03H,156.6 156.6 的的阶阶码码是是 83H 83H;当当十十进进制制数数的的绝绝对对值值小小于于 1 1 时时,阶阶码码就就等等于于 80H 80H 减去小数点后面零的个

38、数。减去小数点后面零的个数。例例如如 :0.003620.00362的的阶阶码码是是 7EH 7EH,0.00362 0.00362 的的阶阶码码是是 0FEH 0FEH。例例如如:有有一一个个十十进进制制浮浮点点操操作作数数存存放放在在30H30H、31H31H、32H32H中中,数数值值是是0.073150.07315,即即0.7315 0.7315 乘乘以以10 10 的的1 1 次次方方,则则阶阶码码为为7FH7FH,若若加加上上数数符符(30H30H)=0FFH=0FFH,31H=73H31H=73H,(,(32H32H)=15H=15H。(3)运算精度)运算精度单次定点运算精度为结

39、果最低位的当量值;单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度之三;单次二进制浮点超越函数运算的精度优于万分之一;优于万分之一;BCD码浮点数本身的精度比码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。数增加,精度都会下降。2浮点数加减法子程序浮点数加减法子程序入入口口

40、条条件件:被被加加数数在在 R0 中中,加加数数在在 R1 中。被减数在中。被减数在 R0 中,减数在中,减数在 R1 中。中。当当F0=0时时,程程序序作作浮浮点点数数加加法法运运算算;当当F0=1时,程序作浮点数减法运算。时,程序作浮点数减法运算。出口:出口:OV=0 时,和(差)仍在时,和(差)仍在 R0 中,中,OV=1 时,溢出。时,溢出。ORG0100HFADD:CLRF0 ;设立加法标志设立加法标志 SJMPAS;计算代数和计算代数和FSUB:SETBF0;设立减法标志设立减法标志AS:LCALLMVR1;计算代数和。先将计算代数和。先将 R1 传送到第二工作区传送到第二工作区

41、MOV C,F0;用加减标志来校正第二操作数的有效符号用加减标志来校正第二操作数的有效符号 RRCA XRLA,R1 MOVC,ACC.7ASN:MOV 1EH,C ;将第二操作数的有效符号存入位将第二操作数的有效符号存入位 1EH 中中 XRLA,R0;与第一操作数的符号比较与第一操作数的符号比较 RLCAMOVF0,C ;保存比较结果保存比较结果 LCALLMVR0;将将 R0 传送到第一工作区中传送到第一工作区中 LCALLAS1 ;在工作寄存器中完成代数运算在工作寄存器中完成代数运算MOV0:INCR0 ;将结果传回到将结果传回到 R0 中的子程序入口中的子程序入口 INCR0 MOV

42、 A,R4 ;传回尾数的低字节传回尾数的低字节 MOV R0,A DECR0 MOV A,R3 ;传回尾数的高字节传回尾数的高字节 MOV R0,A DECR0 MOVA,R2;取结果的阶码取结果的阶码 MOVC,1FH ;取结果的数符取结果的数符 MOVACC.7,C ;拼入阶码中拼入阶码中 MOVR0,A CLRACC.7 ;不考虑数符不考虑数符 CLROV;清除溢出标志清除溢出标志 CJNE A,#3FH,MV01;阶码是否上溢?阶码是否上溢?SETB OV ;设立溢出标志设立溢出标志MV01:MOVA,R0 ;取出带数符的阶码取出带数符的阶码 RETMVR0:MOVA,R0 ;将将 R

43、0 传送到第一工作区中的子程序传送到第一工作区中的子程序 MOV C,ACC.7 ;将数符保存在位将数符保存在位 1FH 中中 MOV 1FH,C MOV C,ACC.6 ;将阶码扩充为补码将阶码扩充为补码 MOV ACC.7,C MOV R2,A ;存放在存放在 R2 中中 INC R0 MOV A,R0 ;将尾数高字节存放在将尾数高字节存放在 R3 中中 MOV R3,A INC R0 MOV A,R0 ;将尾数低字节存放在将尾数低字节存放在 R4 中中 MOV R4,A DEC R0 ;恢复数据指针恢复数据指针 DEC R0 RETMVR1:MOV A,R1 ;将将 R1 传送到第二工作

44、区中的子程序传送到第二工作区中的子程序 MOV C,ACC.7 ;将数符保存在位将数符保存在位 1EH 中中 MOV 1EH,C MOV C,ACC.6 ;将阶码扩充为补码将阶码扩充为补码 MOV ACC.7,C MOV R5,A ;存放在存放在 R5 中中 INC R1 MOV A,R1 ;将尾数高字节存放在将尾数高字节存放在 R6 中中MOV R6,A INC R1 MOV A,R1 ;将尾数低字节存放在将尾数低字节存放在 R7 中中 MOV R7,A DEC R1 ;恢复数据指针恢复数据指针 DEC R1 RETAS1:MOV A,R6 ;读取第二操作数尾数高字节读取第二操作数尾数高字节

45、 ORL A,R7 JZ AS2 ;第二操作数为零,不必运算第二操作数为零,不必运算 MOV A,R3 ;读取第一操作数尾数高字节读取第一操作数尾数高字节 ORL A,R4 JNZ EQ MOV A,R6 ;第一操作数为零,结果以第二第一操作数为零,结果以第二操操 作数为准作数为准 MOV R3,AMOV A,R7MOVR4,AMOV A,R5MOV R2,AMOV C,1EHMOV 1FH,C AS2:RETEQ:MOV A,R2 ;对对阶阶,比比较较两两个个操操作作数数的的阶阶码码 XRL A,R5JZ AS4 ;阶阶码码相相同同,对对阶阶结结束束 JB ACC.7,EQ3;阶阶 符符 互

46、互 异异 MOV A,R2 ;阶阶符符相相同同,比比较较大大小小 CLR C SUBB A,R5JC EQ4EQ2:CLRC ;第第二二操操作作数数右右规规一一次次 MOV A,R6 ;尾尾 数数 缩缩 小小 一一 半半 RRC AMOV R6,AMOV A,R7RRCA MOV R7,AINCR5 ;阶阶 码码 加加 一一 ORLA,R6 ;尾尾 数数 为为 零零 否否?JNZEQ ;尾尾数数不不为为零零,继继续续对对阶阶 MOV A,R2 ;尾尾数数为为零零,提提前前结结束束对对阶阶 MOV R5,ASJMP AS4EQ3:MOV A,R2 ;判断第一操作数阶符判断第一操作数阶符 JNBA

47、CC.7,EQ2;如为正,右规第二操作数;如为正,右规第二操作数EQ4:CLRC LCALLRR1 ;第一操作数右规一次第一操作数右规一次 ORL A,R3 ;尾数为零否?尾数为零否?JNZ EQ ;不为零,继续对阶不为零,继续对阶 MOV A,R5 ;尾数为零,提前结束对阶尾数为零,提前结束对阶 MOV R2,AAS4:JB F0,AS5 ;尾数加减判断尾数加减判断 MOV A,R4 ;尾数相加尾数相加 ADD A,R7 MOV R4,A MOV A,R3 ADDCA,R6 MOV R3,A JNCAS2 LJMP RR1 ;有进位,右规一次有进位,右规一次AS5:CLRC ;比较绝对值大小

48、比较绝对值大小 MOV A,R4 SUBB A,R7 MOV B,A MOV A,R3 SUBB A,R6 JCAS6 MOV R4,B ;第一尾数减第二尾数第一尾数减第二尾数 MOV R3,A LJMP RLN ;结果规格化结果规格化AS6:CPL1FH ;结果的符号与第一操作数相反结果的符号与第一操作数相反 CLRC ;结果的绝对值为第二尾数减第一尾结果的绝对值为第二尾数减第一尾数数 MOV A,R7 SUBB A,R4 MOV R4,A MOV A,R6 SUBB A,R3 MOV R3,ARLN:MOV A,R3 ;浮点数规格化浮点数规格化 ORLA,R4 ;尾数为零否?尾数为零否?J

49、NZRLN1 MOV R2,#0C1H;阶码取最小值阶码取最小值 RETRLN1:MOV A,R3 JB ACC.7,RLN2;尾数最高位为一否尾数最高位为一否?CLRC ;不为一,左规一次不为一,左规一次 LCALLRL1 SJMPRLN ;继续判断继续判断RLN2:CLROV ;规格化结束规格化结束 RETRL1:MOV A,R4 ;第一操作数左规一次第一操作数左规一次 RLCA ;尾数扩大一倍尾数扩大一倍 MOV R4,A MOV A,R3 RLCA MOV R3,A DECR2;阶码减一阶码减一 CJNE R2,#0C0H,RL1E;阶码下溢否?阶码下溢否?CLRA MOV R3,A ;阶码下溢,操作数以零计阶码下溢,操作数以零计 MOV R4,A MOV R2,#0C1HRL1E:CLROV RETRR1:MOV A,R3 ;第一操作数右规一次第一操作数右规一次RRCA ;尾数缩小一半尾数缩小一半 MOVR3,A MOVA,R4 RRC A MOVR4,A INC R2;阶码加一阶码加一 CLR OV;清溢出标志清溢出标志 CJNER2,#40H,RR1E;阶码上溢否?阶码上溢否?MOVR2,#3FH;阶码溢出阶码溢出 SETBOVRR1E:RET

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!