单片机汇编子程序
单片机指令集的汇编语言编程方法介绍

单片机指令集的汇编语言编程方法介绍汇编语言是一种低级语言,它直接与计算机硬件进行交互,被广泛应用于单片机编程中。
本文将介绍单片机指令集的汇编语言编程方法。
一、简介单片机指令集是特定型号单片机支持的操作指令的集合。
每个指令都对应着特定的功能,通过组合和调用这些指令,可以实现复杂的计算和控制任务。
二、基本指令1. 数据传送指令数据传送指令用于将数据从一个位置传送到另一个位置。
常见的指令有MOV(将源操作数传送到目的操作数)、LDR(将存储器位置的数据传送到寄存器)和STR(将寄存器中的数据传送到存储器位置)等。
2. 算术指令算术指令用于进行数学运算,包括加法、减法、乘法和除法等。
常见的指令有ADD(将两个操作数相加并将结果存储到目的操作数中)、SUB(将目的操作数减去源操作数并将结果存储到目的操作数中)等。
3. 逻辑指令逻辑指令用于进行逻辑运算,包括与、或、非和异或等。
常见的指令有AND(将两个操作数进行按位与运算并将结果存储到目的操作数中)、ORR(将两个操作数进行按位或运算并将结果存储到目的操作数中)等。
4. 控制指令控制指令用于控制程序的执行流程,包括无条件跳转、条件跳转和中断等。
常见的指令有B(无条件跳转到指定的地址执行)、BEQ (当条件满足时跳转到指定的地址执行)等。
三、编程方法1. 熟悉指令集编程前需要详细了解所使用的单片机的指令集,包括指令的功能、操作数的类型和寻址方式等。
只有深入了解指令集,才能灵活运用指令编写程序。
2. 设计算法在开始编程之前,需要分析问题,设计出解决问题的算法。
算法应考虑输入、处理和输出等方面,合理利用指令集中的指令实现算法的逻辑。
3. 编写汇编程序根据算法,以汇编语言的格式编写程序。
程序的编写过程需要遵循指令的语法规则和寻址方式,并注意程序的可读性和效率。
4. 调试和优化程序编写完成后,需要进行程序的调试和优化。
通过单步执行程序,观察和检查程序执行过程中的中间结果,确保程序能够正确地执行。
51单片机子程序(汇编)

(1)按当前流行的以IBM PC为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
CPL F0;为负,结果符号取反
JCDM25
SUBBA,R7
JCDM26
DM25INC R5
MOV A,R5
JNZ DM26
INC R4
DM26CLR OV
RET;商在R4R5xx
(10)标号:
MULS功能:
双字节二进制有符号数乘法(补码)入口条件:
被乘数在R
2、R3xx,乘数在R
6、R7xx。
出口信息:
乘积在R
2、R
3、R
4、R5xx。
MOV B,R7
MUL AB
MOV R4,B;暂存部分积
MOV R5,A
MOV A,R3;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4;累加部分积
MOV R4,A
CLR A
ADDCA,B
MOV R3,A
MOV A,R2;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4;累加部分积
BCDBLCALLNEG1;减数[R1]十进制取补
LCALLBCDA;按多字节BCD码加法处理
CPL C;将补码加法的进位标志转换成借位标志
MOV F0,C;保护借位标志
LCALLNEG1;恢复减数[R1]的原始值
MOV C,F0;恢复借位标志
单片机汇编语言程序设计

单片机汇编语言程序设计在当今高科技时代,单片机有着广泛的应用领域,它是一种微型电脑系统,具有集成度高、功耗低等优点。
而单片机汇编语言程序设计则是单片机开发中最基础、最重要的一环。
本文将从基础概念、程序设计流程以及实例分析等方面,全面介绍单片机汇编语言程序设计。
一、基础概念1. 单片机单片机是一种集成度非常高的微型电脑系统,它由微处理器、内存、输入输出设备以及时钟电路等部分组成。
它的主要特点是片内集成度高,体积小,功耗低。
2. 汇编语言汇编语言是一种与机器语言一一对应的低级编程语言,它是用助记符、伪指令和机器指令等表示的,比机器语言更容易理解和编写。
3. 程序设计在单片机领域,程序设计是指利用汇编语言编写单片机程序的过程,目的是为了实现特定的功能。
程序设计需要包括程序编写、调试和优化等环节。
二、程序设计流程1. 确定需求在开始编写程序之前,首先需要明确需求。
根据需要实现的功能,确定程序设计的目标和要求。
2. 构思设计根据需求,进行程序的构思设计。
确定程序的结构,拟定算法和流程图,为后续的编码工作做好准备。
3. 编写代码在进行编写代码之前,需要先熟悉单片机的指令集和编程规范。
然后,根据构思设计的结果,使用汇编语言编写程序代码。
4. 调试测试编写完成代码后,需要进行调试测试。
通过单步执行、布点断点等方式,检查程序是否存在错误,是否能够正确运行。
5. 优化改进在经过测试后,根据实际情况进行优化改进。
可以通过优化算法、减少冗余代码等方式,提高程序的执行效率和稳定性。
6. 文档记录最后,需要对程序进行文档记录。
包括程序的说明、使用方法、注意事项等,方便后续的维护和升级。
三、实例分析以LED 点亮为例,演示单片机汇编语言程序设计的实际操作步骤。
1. 硬件连接将单片机与 LED 灯连接,以 STM32F103C8T6 开发板为例,连接方式如下:- 将 LED 的长脚连接至单片机的 GPIOA.0 引脚。
- 将 LED 的短脚连接至单片机的 GND 引脚。
51单片机实用子程序(汇编)

《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理程序的工作变得更简单直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺点是程序太长,大量无关子程序也包含在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
8051单片机汇编语言程序设计

8051单片机汇编语言程序设计一、顺序结构1.有两个4位压缩BCD码,分别存放在30H,31H,40H,41H单元,要求求和,结果送至51H,52H中(高位在前,地位在后),给出程序流程图ORG 0000HCLR CMOV A,31HADD A,41HDA AMOV 52H,AMOV A,30HADDC A,40HDA AMOV 51H,AEND若需要求和的数为5271和6489,请分析每条指令后A和PSW的对应的数据二、分支结构2.求双字节有符号数的补码(双字节数为16位二进制数,其最高位D15为符号位),给出程序流程图和程序代码(单分支结构)CPT16:MOV A,R7JNB ACC.7,EXTMOV C,ACC.7MOV F0,CCPL AMOV R7,AMOV A,R6CPL AADD A,#01MOV R6,ACLR AADDC A,R7MOV C,F0MOV ACC.7,CMOV R7,AEXT: RET验证以上程序对-12597和6831两数的结果是否正确。
3.求分段函数的值,X是自变量存放在30H单元,Y是因变量存放在31H单元,给出程序流程图和程序代码(多分支结构A:逐次比较法)100010X X Y X X +>⎧⎪==⎨⎪-<⎩ FUNC1:MOV A,30HCJNE A,#00H,NZEROAJMP NEGTNZERO: JB ACC.7,POSITADD A,#1AJMP NEGTPOSIT: MOV A,#81HNEGT: MOV 31H,ARET4. 根据31H (高字节)、30H (低字节)的内容(分支转移参数)转向不同的处理程序(PRGX(X=0~n ,n>256)),给出程序流程图和程序代码(多分支结构B :转移表)JUMP1:MOV DPTR,#TAB1MOV A,30HMOV B,#3MUL ABMOV R3,AMOV A,BADD A,DPHMOV DPH,AMOV A,31HMOV B,#3MUL ABADD A,DPHMOV DPH,AMOV A,R3JMP @A+DPTRTAB1: LJMP PRG0LJMP PRG1LJMP PRGn若(31H30H )=364,则分析每条指令后A ,B ,DPTR 对应的数值。
51单片机汇编中断程序调用子程序

文章标题:深度解析:51单片机汇编中断程序调用子程序一、介绍在51单片机的汇编编程中,中断程序和子程序的调用是非常重要的内容。
本文将深入讨论51单片机汇编中断程序如何调用子程序的相关知识,帮助读者更加深入地理解这一主题。
二、51单片机汇编中断程序调用子程序的基本原理在51单片机中,中断是指在程序运行过程中,由硬件或者软件主动触发的一种事件,当中断发生时,CPU会立即暂停正在执行的程序,转而去执行与该中断相关的处理程序,当处理完毕后再返回原程序继续执行。
子程序则是一段独立的代码,可以被主程序或其他子程序调用执行。
中断程序调用子程序的基本原理是,当中断发生时,CPU会跳转到中断服务程序进行处理,在中断服务程序中可以调用需要的子程序进行处理,处理完毕后再返回中断服务程序,最终返回到原来的程序中继续执行。
三、中断程序调用子程序的具体实现方法1. 中断程序的编写首先需要编写中断程序,并向51单片机的中断向量表中注册相应的中断号。
在中断程序中,可以调用需要的子程序进行处理。
2. 子程序的编写编写需要被调用的子程序,并保证其能够正确地处理需要的任务。
子程序的调用和返回是通过特定的指令来实现的。
3. 调用和返回在中断程序中,通过特定的指令调用需要的子程序,等待子程序执行完成后再进行返回。
这里需要特别注意子程序调用的参数传递和返回值的处理。
四、中断程序调用子程序的实际应用中断程序调用子程序在实际应用中有着广泛的用途,比如在实时系统中,可以利用中断程序调用子程序来实现即时响应;在通信系统中,可以利用中断程序调用子程序来实现数据处理和通信协议的处理等。
五、个人观点和总结中断程序调用子程序是51单片机汇编编程中的重要内容,掌握了这一技术可以让我们更加灵活地进行程序设计和开发。
通过本文的深度解析,希望读者能够更加深入地理解和掌握这一知识,并在实际应用中发挥其作用。
完整的文章已经写好并按照知识的文章格式进行了排版,总字数超过3000字。
单片机c51汇编语言51单片机汇编语言

单片机c51汇编语言51单片机汇编语言单片机C51汇编语言单片机(C51)是指一种集成电路上只包含一个集中式控制器的微处理器,具有完整的CPU指令集、RAM、ROM、I/O接口等功能。
汇编语言是一种低级语言,是用于编写单片机指令的一种语言。
汇编语言能够直接操作单片机的寄存器和输入/输出端口,因此在嵌入式系统的开发中非常重要。
本文将介绍单片机C51的汇编语言编程。
一、了解单片机C51单片机C51是目前应用最广泛的一种单片机系列,广泛用于各种电子设备和嵌入式系统的开发。
C51指的是Intel公司推出的一种基于MCS-51架构的单片机。
该系列单片机具有较高的性能和低功耗的特点,可用于各种控制和通信应用。
二、汇编语言的基本概念汇编语言是一种低级语言,与机器语言紧密相关。
它使用助记符来代替机器指令的二进制表示,使程序的编写更加易读。
在单片机C51汇编语言中,每一条汇编指令都对应着特定的机器指令,可以直接在单片机上执行。
三、汇编语言的基本指令在单片机C51汇编语言中,有一些基本的指令用于控制程序的执行和操作寄存器。
以下是一些常用的指令:1. MOV指令:用于将数据从一个寄存器或内存单元复制到另一个寄存器或内存单元。
2. ADD指令:用于将两个操作数相加,并将结果存储到目的寄存器中。
3. SUB指令:用于将第一个操作数减去第二个操作数,并将结果存储到目的寄存器中。
4. JMP指令:用于无条件跳转到指定的地址。
5. JZ指令:用于在条件为零时跳转到指定的地址。
6. DJNZ指令:用于将指定寄存器的值减一,并根据结果进行跳转。
四、编写单片机C51汇编程序的步骤编写单片机C51汇编程序需要按照以下步骤进行:1. 确定程序的功能和目标。
2. 分析程序的控制流程和数据流程。
3. 设计算法和数据结构。
4. 编写汇编指令,实现程序的功能。
5. 调试程序,并进行测试。
六、实例演示以下是一个简单的单片机C51汇编程序的示例,用于实现两个数的相加,并将结果输出到LED灯上:org 0H ; 程序的起始地址为0mov a, 05H ; 将05H赋值给累加器mov b, 07H ; 将07H赋值给B寄存器add a, b ; 将A寄存器和B寄存器的值相加mov P1, a ; 将相加结果输出到P1口end ; 程序结束在这个例子中,首先将05H赋值给累加器A,然后将07H赋值给B寄存器,接着使用ADD指令将A和B的值相加,将结果存储到累加器A中,最后将累加器A的值输出到P1口。
单片机C语言与汇编语言的混合编程

单片机C语言与汇编语言的混合编程(选自《单片机C语言编程应注意的若干问题》)在绝大多数场合采用C语言编程即可完成预期的目的,但是对实时时钟系统、要求执行效率高的的系统就不适合采用C语言编程,对这些特殊情况进行编程时要结合汇编语言。
汇编语言具有直接和硬件打道、执行代码的效率高等特点,可以做到C语言所不能做到的一些事情,例如对时钟要求很严格时,使用汇编语言成了唯一的选择。
这种混合编程[2]的方法将C语言和汇编语言的优点结合起来,已经成为目前单片机开发最流行的编程方法。
目前大多数据单片机系统,在C语言中使用汇编语言有两种情况:一种是汇编程序部分和C程序部分为不同的模块,或不同的文件,通常由C程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C语言程序中嵌入一段汇编语言程序。
当汇编程序和C程序为不同模块时程序一般可分为若于个C程序模块和汇编程序模块,C程序模块通常是程序的主体框架,而汇编程序模块通常由用C语言实现效率不高的函数组成,也可以是已经成熟的、没有必要再转化成C语言的汇编子程序。
在这种混合编程技术中,关键是参数的传递和函数的返回值。
它们必须有完整的约定,否则数据的交换就可能出错。
对于嵌入式汇编,可以在C程序中使用一些关键字嵌入下些汇编程序,这种方法主要用于实现数学运算或中断处理,以便生成精练的代码,减少运行时间。
当汇编函数不大,且内部没有复杂的跳转时,可以用嵌入式汇编实现。
下面就以AT89C2051单片机在模拟电压检测中的应用为例说明C语言程序与汇编语言程序的调用。
电路图如图1所示:AT89C2051单片机内置模拟比较器,13脚即P1.1是比较器的负输入端,12脚即P1.0是比较器的正输入端,比较器的输出端做在了CPU内部即P3.6未被引出,CPU可以直接读取P3.6状态来判定两输入端比较的结果其和一个外部电阻及一个外部电容器就可以设计成一个A/D转换器,采用RC模拟转换的原理,来检测外部P1.1引脚的输入电压。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
; 1, 以下的程序是一些关于数据转换与计算的子程序.但由于本人现在很忙,仅测试了; 其中的很少一部分.本人不保证所有的程序都是正确的,并且由于使用不同的编译器,; 即使是本人已测试过的程序,您也可能要修改一些指令.; 2. 一旦将其整理测试完毕,将会免费发送.; 3. 若有任何问题,与TongZhongZhi@联系;******************************************************************** 函数名说明BIN3toBCD4 三字节二进制整数--->>BCD码四字节转换SIBITD 单字节二进制整数-->>BCD码转换子程序ADDM1 三字节加法子程序并显示和值SUBM 多字节减法子程序SUBM4 四字节乘四字节乘法子程序CHU3 五字节除五字节除法子程序CHU4 双字节除单字节除法子程序CHU5 双字节除单字节商为双字节除法子程序CHU6 三字节除单字节商为三字节除法了程序CHU7 三字节除双字节商为三字节除法子程序CHU8 四字节除双字节商为二字节除法子程序CHU9 三字节或二字节的倒数结果为三字节除法子程序CHU10 带符号双字节除单字节除法子程序SQRT 双字节平方根子程序BCDAD1 单字节BCD码加法子程序BCDAD2 四字节BCD码加法子程序BCDSUB3 单字节BCD码减法子程序DSUB2 四字节BCD码减法子程序BCDSUB4 单字节BCD码乘法子程序DCHFA 十进制数8位乘8位(四字节BCD码乘四字节BCD码)乘法子程序DCHU1 单字节BCD码除法子程序DCHU2 四字节BCD码除法子程序DSQR1 单字节BCD码平方根子程序DSQR2 双字节BCD码平方根子程序DSQR3 三字节BCD码平方根子程序ASBIN1 ASCII码--->>二进制数转换子程序EXASC1 十六进制--->>ASCII码转换子程序BCDAS1 BCD码--->>ASCII码转换子程序BINBCD 双字节二进制-->>三字节BCD码转换子程序DTOB4 四位BCD码--->>十六位二进制数转换子程序BINASC 二进制数--->>ASCII码字符串转换子程序BCH 二进制数--->>十六进制数转换子程序ASCBCD ASCII码-->>BCD码转换子程序ASCHEX ASCII码-->>十六进制数转换子程序BCDBIN BCD码--->>二进制数转换子程序EXASC3 十六进制数-->>ASCII码转换子程序;******************************************************************** ;Name: BIN3toBCD4;Func: 三字节二进制整数--->>BCD码四字节转换(Comped BCD);Input: 二进制数人低字节到高字节存放在内部RAM50H,51H,52H单元中;Output: BCD码人低位到高位分别存放在内部RAM53H,54H,55H,56H单元中;USE: R7-R0, 56H-50H;******************************************************************** ;PASSEDBIN3toBCD4:LENG1 EQU 24LENG2 EQU 4LENG3 EQU 3NUMB1 EQU 50HNUMB2 EQU 53H;;;For testMOV 50H, HMOV 51H, FFHMOV 52H, FFH;;;;;;;;;;ACALL MUBTDRET;;LOOP: SJMP LOOPMUBTD: MOV R0, #NUMB2MOV R7, #LENG2CLR ALOOP1: MOV @R0, AINC R0DJNZ R7, LOOP1MOV R7, #LENG1LOOP4: MOV R1, #NUMB1MOV R6, #LENG3CLR CLOOP2: MOV A, @R1RLC AMOV @R1, AINC R1DJNZ R6, LOOP2MOV R5, #LENG2MOV R0, #NUMB2LOOP3: MOV A, @R0ADDC A, @R0DA AMOV @R0, AINC R0DJNZ R5, LOOP3DJNZ R7, LOOP4MOV R0, 53HMOV R1, 54HMOV R2, 55HMOV R3, 56HRET ; end of BIN3toBCD4;******************************************************************** ;____________________________________________________________________ _________; Name: SIBITD;Func: 单字节二进制整数-->>BCD码转换子程序;Input: 二进制数放在内部RAM20H单元;OutPut: 转换后的BCD码高位放在内部RAM22H;____________________________________________________________________ _________LENG1 EQU 8 ;二进制数位数LENG2 EQU 2 ;BCD码字节数NUMB1 EQU 20H ;二进制数地址NUMB2 EQU 21H ;BCD码首址ORG 2000HAJMP MAINMAIN: MOV R0, #NMB1MOV R1, #NUMB2MOV R7, #LENG1ACALL SIBTDSJMP $SIBTD: CLR AMOV 21H, AMOV 22H, ALOOP3: CLR CMOV A, @R0RLC AMOV @R0, AMOV R1, #NUMB2MOV R6, #LENG3LOOP2: MOV A, #R1ADDC A, #@R1DA AMOV @R1, AINC R1DJNZ R6, LOOP2DJNZ R7, LOOP3RET;____________________________________________________________________ _______; 二进制数BCD码; (20H) (22H 21H); FF 2 55; 7F 1 27; 80 1 28;____________________________________________________________________ ________;____________________________________________________________________ _________; Name: ADDM1;Func: 三字节加法子程序并显示和值;Input: 被加数数据区首址由R0指向内部RAM20H单元.加数数据区首地址由R1指向内部RAM23单元;OutPut: 和数放在被加数的数据区;____________________________________________________________________ _________ORG 20HDATA: DEFB 66H ;被加数低字节DEFB 77HEEFB 88H ;被加数高字节DATAB: DEFB 44H ;加数低字节DEFB 66HDEFB 77H; ;加数高字节COVNT: EQU 03H ;字节数ORG DAHDS: DEFS 06H; display BUFORG 2000HAJMP MAINMAIN: MOV R3, #COVNTMOV R0, #DATAMOV R1, #DATBACALL ADDM1ACALL DSVP0LOOP0: SJMP LOOP0 ADDM1: CLR A LOOP: MOV A, @R0 ADDC A, @R1MOV @R0, AINC R0INC R1DJNZ R3, LOOP1RETDSUP0: MOV R0, #DS+5 MOV A, DATAACALL PTDSMOV A, DATA+1 ACALL PTDSMOV A, DATA+2 ACALL PTDSMOV R0, #DSMOV R2, HMOV R3, HMOV DPTR, #SEGPT DSVP1: MOV A, FFH MOV R1, E3HMOVX @R1, AMOVX A, @R0MOVC A, @A+DPTR MOV R1, E1HMOVX @R, AMOV A, R2MOV R1, E3HMOVX @R1, ADSVP2: DJNZ R3, DSVP2 INC R0CLR CMOV A, R2RRC AMOV R2, AJNZ A, DSVP1LJMP DSVP0RETPTDS: MOV R1, A ACALL PTDS1MOV A, P1SWAPPTDS1: ANL A, FHMOV @R0, ADEC R0RETSEGPT: DEFB 0C0H, 0F9HDEFB 0A4H, 0B0HDEFB 99H, 92HDEFB 82H, 0F8HDEFB 80H, 90HDEFB 88H, 83HDEFB 0C6H, 0A1HDEFB 86H, 8EHEND;____________________________________________________________________ ______; 被加数加数和数; 22H21H20H 25H24H23H 22H21H20H; 88 77 66 77 66 44 FF DD AA; 78 65 44 77 65 98 F0 00 00;____________________________________________________________________ ______;____________________________________________________________________ _________;Name: SUBM;Func: 多字节减法子程序;Input: 被减数数据区首址由R0指向内部RAM20H单元.减数数据区首地址由R1指向内部RAM23单元;OutPut: 差数放在被减数的数据区;____________________________________________________________________ _________ORG 20HDATA: DEFB 0FFH ;被减数低字节DEFB 0FFHDEFB 0FFHDEFB 0FFH ;被减数高字节DATB: DEFB 55H ;减数低字节DEFB 55HDEFB 55HDEFB 55H ;减数高字节COVNT: EQU 04H ;字节数ORG 2000HAJMP MAINMAIN: MOV R3, #COVNTMOV R0, #DATAMOV R1, #DATBACALL SUBMLOOP: SJMP LOOPSUMB: CLR CCLR ALOOP1: MOV A, @R0SUBB A, @R1MOV @R0, AINC R0INC R1DJNZ R3, LOOP1RETEND;____________________________________________________________________ ______; 被减数减数差数; 23H22H21H20H 27H26H25H24H 23H22H21H20H; FF FF FF FF 55 55 55 55 AA AA AA AA; AA AA AA AA 55 55 55 55 55 55 55 55; 12 34 56 78 12 34 56 79 FF FF FF FF;____________________________________________________________________ ______;____________________________________________________________________ _________;Name: SUBM4;Func: 四字节乘四字节乘法子程序;Input:被乘数和乘数分别放在内部RAM20H--27H单元中,乘数位数放在2AH单元中;OutPut: 乘积放在内部RAM61H-68H单元中.;____________________________________________________________________ _________ORG 20HDATA1 DEFB 0FFH 被乘数低字节DATA2 DEFB 0FFHDATA3 DEFB 0FFHDATA4 DEFB 7FH 被乘数高字节DATB1 DEFB 0FFH 乘数低字节DATB2 DEFB 0FFHDATB3 DEFB 0FFHDATB4 DEFB 7FH 乘数高字节COVNT EQU 20HORG 2000HAJMP MAINMAIN: MOV R0, DATA1 MOV R1, DATA2MOV R2, DATA3MOV R3, DATA4MOV R4, DATB1MOV R5, DATB2MOV R6, DATB3MOV R7, DATB4MOV 2AH, #COVNTCLR AMOV 61H, AMOV 62H, AMOV 63H, AMOV 64H, AMOV 65H, AMOV 66H, AMOV 67H, AMOV 68H, AACALL CHENG6LOOP0: SJMP LOOP0ORG 2200HCHENG6: MOV A, 61HADD A, 61HMOV 61H, AMOV A, 62HADDC A, 62HMOV 62H, AMOV A, 63HADDC A, 63HMOV 63H, AMOV A, 64HADDC A, 64HMOV 64H, AMOV A, 65HADDC A, 65HMOV 65H, AMOV A, 66HADDC A, 66HMOV 66H, AMOV A, 67HADDC A, 67HMOV 67H, AMOV A, 68HADDC A, 68HMOV 68H, AMOV A, R4ADD A, R4MOV R4, AMOV A, R5ADD A, R5MOV R5, AMOV A, R6ADD A, R6MOV R6, AMOV A, R7ADD A, R7MOV R7, AJNC LOOP1MOV A, 61HADD A, R0MOV 61H, AMOV A, 62HADDC A, R1MOV A, 63HADDC A, R2MOV 63H, AMOV A, 64HADDC A, R3MOV 64H, AMOV A, 65HADDC A, HMOV 65H, AMOV A, 66HADDC A, HMOV 66H, AMOV A, 67HADDC A, HMOV 67H, AMOV A, 68HADDC A, HMOV 68H, ALOOP1: DJNZ 2AH, LOOP2 RETLOOP2: AJMP CHENG6END;____________________________________________________________________ ______; 被乘数乘数积数; 23H22H21H20H 27H26H25H24H 68H--61H; 7F FF FF FF 7F FF FF FF 3F FF FF FF 00 00 01 00; 00 FF FF FF 00 00 FF FF 00 00 00 FF FE FF 00 01;____________________________________________________________________ ______;____________________________________________________________________ _________;Name: CHU3;Func: 五字节除五字节除法子程序;Input: 被除数放在内部RAM20H-24H单元中,除数放在10H-14H单元中.;OutPut:商数放在25-29单元中,25H单元放最低字节,余数放在20H-24H单元中,20H单元放最低字节;Use: 用A,C,R0,R1,R2,R3,R6,R7寄存器,其中R0作移位减计数器,使用位地址60H单元作进位位,C作暂存器;____________________________________________________________________ _________ORG 20HDATA1: DEFB 21H 被除数最低字节DATA2: DEFB 43HDATA3: DEFB 65HDATA4: DEFB 87HDATA5: DEFB A9H 被除数最高字节ORG 10HDATB1: DEFB 9AH 除数最低字节DATB2: DEFB 78HDATB3: DEFB 56HDATB4: DEFB 34HDATB5: DEFB 12H 除数最高字节ORG 2000HAJMP MAINMAIN: ACALL CHU3LOOP: SJMP LOOPCHU3: MOV R0, #DATB1MOV R7, H ;检查除数为零停止运算LOOP1: MOV A, @R0JNC R0ORL A, @R0JNZ A, LOOP0DJNZ R7, LOOP1AJMP LOOP2LOOP0: CLR AMOV R0, HMOV R7, HLOOP3: MOV @R0, AINC R0DJNZ R7, LOOP6MOV R6, H ;移位计数器LOOP8: MOV R0, #DATA1 ;与商连在一起左移MOV R7, AHLOOP4: MOV A, @R0RLC AMOV @R0, AINC R0DJNZ R7, LOOPCLR CMOV R0, H; 被除数减除数(此被除数是扩充位) MOV R1, #DATB1MOV R7, HLOOP5: MOV A, @R0SUBB A, @R1MOV @R0, AINC R0INC R1DJNZ R7, LOOP5JNC C, LOOP6MOV 66H, C ;暂存进位位MOV R0, H ;不够减恢复余数MOV R1, #DATB1MOV R7, HCLR CLOOP7: MOV A, @R0ADDC A, @R1MOV @R0, AINC R0INC R1DJNZ R7, LOOP7MOV C, 60HLOOP6: CPL CDJNZ R6, LOOP8MOV R1, HMOV R1, HMOV 7, HLOOP9: MOV A, @R0RLC AMOV R3, AMOV A, @R1MOV @R0, AMOV A, R3MOV @R1, AINC R0INC R1DJNZ R7, LOOP9LOOP2: RET;____________________________________________________________________ _________;Name: CHU4;Func: 双字节除单字节除法子程序;Input: 被除数放在R0,R1 R0放被除数低字节,除数放在R4,R7为字节长度;OutPut: 商数庆在R0中,余数放在R1中;Use:;____________________________________________________________________ _________DATA1 EQU 6DH 被除数低字节DATA2 EQU 32H 被除数高字节DATB EQU 47H 除数ORG 2000HAJMP MAINMAIN: MOV R0, #DATA1MOV R1, #DATA2MOV R4, #DATBMOV R7, HACALL CHU4LOOP: SJMP LOOPCHU4: MOV A, R0ADD A, R0MOV R0, AADDC A, R1MOV R1, ASUBB A, R4JC C, LOOP1MOV R1, AINC R0LOOP1: DJNZ R7, CHU4RETEND;____________________________________________________________________ ______; 被除数除数商数余数; R1R0 R4 R0 R1; 326D 47 B5 3A; 00FF 10 0F 0F; 7FFF FG 80 7F; 0040 F8 00 40; FFC0 08 FF D2;____________________________________________________________________ ______;____________________________________________________________________ _________;Name: CHU5;Func: 双字节除单字节商为双字节除法子程序;Input: 被除数放在R0,R1中,除数放在R3中,R2为被除数扩充位;OutPut: 商数放在R4,R5中,R4放低位,余数放在R2中;____________________________________________________________________ _________DATA1 EQU 01H 被除数低字节DATA2 EQU 10H 被除数高字节DATB EQU 10H 除数ORG 2000HAJMP MAINMAIN: MOV R0, #DATA1MOV R1, #DATA2MOV R2, HMOV R3, #DATBMOV R4, HMOV R5, HMOV R7, 10HACALL CHU5LOOP: SJMP LOOPCHU5: MOV A, R0ADD A, R0MOV R0, AMOV A, R1ADDC A, R1MOV R1, AMOV A, R2ADDC A, R2MOV R2, AMOV A, R4 ;商数左移ADD A, R4MOV R4, AMOV A, R5ADDC A, R5MOV R5, ACJNE R2, #DATB, LOOP0LOOP0: JC C, LOOP1MOV A, R2; 建立新的余数SUBB A, R3MOV R2, AMOV A, R4ADD A, HMOV R4, AMOV A, R5ADDC A, HMOV R5, ,ALOOP1: DJNZ R7, CHU5RET;____________________________________________________________________ _________; 被乘数乘数商数余数; R1R0 R2 R5R4 R2; 1001 10 0100 01; 17FF 10 007F 0F;____________________________________________________________________ _________;____________________________________________________________________ _________;Name: CHU6;Func: 三字节除单字节商为三字节除法了程序;Input: 被除数放在R0R1R2中, 除数放在R4中,R3存放被除数扩充位,也是余数存放数;OutPut:商数放在内部RAM20H-22H单元中,其中20H单元放最低位;Use:;____________________________________________________________________ _________DATA1 EQU 08H ; 被除数最低位DATA2 EQU 00H ; 被除数最高位DATA3 EQU D0HDATB EQU 20H ; 除数ORG 2000HAJMP LOOP0LOOP0 MOV R0, #DATA1MOV R1, #DATA2MOV R2, #DATA3MOV R3, #DATABMOV R4, #DATA1MOV R3, HMOV 20H, HMOV 21H, HMOV 22H, HMOV R7, HACALL CHU6LOOP2: SJMP LOOP2CHU6: MOV A, R0ADD A, R0 ; 被除数左移,包括扩充位MOV R0, AMOV A, R1ADDC A, R1MOV R1, AMOV A, R2ADDC A, R2MOV R2, AMOV A, R3ADDC A, R3MOV R3, AMOV A, 20H; 商数左移RLC AMOV 20H, AMOV A, 21HRLC AMOV 21H, AMOV A, 22HRLC AMOV 22H, AMOV A, R3SUBB A, R4JC C, LOOP1MOV R3, AJNC 20HAJMP LOOP2LOOP1: ADD A, R4LOOP2: DJNZ R7, CHU6RET;____________________________________________________________________ _________;Name: CHU7;FUNC: 三字节除双字节商为三字节除法子程序:INPUT: 被除数放在内部RAM20H--22H单元中,除数放在R4,R5中;OUTPUT:商数放在内部RAM26H--28H单元中,余数放在23H,24H单元中.;____________________________________________________________________ _________20H EQU 00H ;被除数最低字节21H EQU 00H ;被除数低字节22H EQU F0H ;被除数最高字节DATB1 EQU 1DH ;除数低字节DATB2 EQU 23H ;除数高字节ORG 2000HAJMP LOOP0LOOP0: MOV R4, #DATB1MOV R5, #DATB1MOV R7, HMOV 20H, HMOV 21H, HMOV 22H, F0HMOV 23H, HMOV 24H, HACALL CHU7LOOP: SJMP LOOPCHU7: CLR CMOV A, 20H ;被除和扩充位左移RLC AMOV 20H, AMOV A, 21HRLC AMOV 21H, AMOV A, 22HRLC AMOV 22H, AMOV A, 23HRLC AMOV 23H, AMOV A, 24HRLC AMOV 24H, AMOV A, 26H ;商数左移RLC AMOV 26H, AMOV A, 27HRLC AMOV 27H, AMOV A, 28HRLC AMOV 28H, ACLR CMOV A, 23H ;判断SUBB A, R4MOV R1, AMOV A, 24HSUBB A, R5MOV R2, AINC 26HMOV A, R1 ;建立余数MOV 23H, AMOV A, R2MOV 24H, ALOOP1: DJNZ R7, CHU7RET;____________________________________________________________________ _________;Name: CHU8;Func: 四字节除双字节商为二字节除法子程序;Input: 被除数放在R3R2R1R0,除数放在R5R4,R7为被除数扩充位;OutPut:商数放在R1R0中,余数放在R3R2;____________________________________________________________________ _________DATA1 EQU 00H ;被除数最低字节DATA2 EQU 00H ;被除数低字节DATA3 EQU 00H ;被除数低字节DATA4 EQU 0FFH ;被除数最高字节DATB1 EQU 00H ;除数低字节DATB2 EQU 0FFH ;除数高字节ORG 2000HAJMP MAINMAIN: MOV R0, #DATA1MOV R1, #DATA2MOV R2, #DATA3MOV R3, #DATA4MOV R4, #DATB1MOV R5, #DATB2ACALL CHV8SJMP $CHV8: MOV R7, HLOOP3: CLR CMOV A, R0 ;被除数左移ADD A, R0MOV R0, AMOV A, R1ADDC A, R1MOV R1, AADDC A, R2MOV R2, AMOV A, R3ADDC A, R3MOV R3, AJC LOOP1MOV A, R2 ;高位被除数减除数SUBB A, R4MOV R2, AMOV A, R3SUBB A, R5MOV R3, AJNC C, LOOP2MOV A, R2 ;恢复被除数ADD A, R4MOV R2, AMOV A, R3ADDC A, R5MOV R3, ADJNZ R7, LOOP3RETLOOP1: CLR CMOV A, R2SUBB A, R4MOV R2, AMOV A, R3SUBB A, R5MOV R3, ALOOP2: INC R0DJNZ R7, LOOP3RET;____________________________________________________________________ _________;Name: CHU9;Func: 三字节或二字节的倒数结果为三字节除法子程序;Input: 待求倒数的数,即除数放在内部RAM26H-28H单元,被除数均为1放在20H 单元.;OutPut:结果即商的小数清确小数点后三字节,放在23H--25H单元;Use: 使用21H--24H,60H--62H单元为工作寄存器;____________________________________________________________________ _________ORG 2000HAJMP MAINMAIN: MOV 20H, HMOV 21H, HMOV 22H, HMOV 23H, HMOV 24H, HMOV 25H, HMOV 26H, HMOV 27H, HMOV 28H, HMOV 60H, HMOV 61H, HMOV 62H, HMOV R7, HACALL CHU9LOOP: SJMP LOOPCHU9: CLR CLOOP4: MOV A, 20H ;被除数及扩充位左移RLC AMOV 20H, AMOV A, 21HRLC AMOV 21H, AMOV A, 22HRLC AMOV 22H, AMOV A, 23HRLC AMOV 23H, AMOV A, 24HRLC AMOV 24H, AMOV A, 25HRLC AMOV 25H, AJNC LOOP1 ;判断扩充MOV A, 23HSUBB A, 26H ;位减MOV 23H, A ;除数MOV A, 24HMOV 24H, AMOV A, 25HSUBB A, 28HMOV 25H, AMOV A, 23H ;商加1ADD A, HMOV 23H, AMOV A, 24HADDC A, HMOV 24H, AMOV A, 25HADDC A, HMOV 25H, ASETB CSJMP LOOP2LOOP1: MOV A, 23H ;扩充位减除数SUBB A, 26HMOV 23H, AMOV A, 24HSUBB A, 27HMOV 24H, AMOV A, 25HSUBB A, 28HMOV 25H, AJNC LOOP3MOV A, 23H ;恢复除数MOV 23H, AMOV A, 24HADDC A, 27HMOV 24H, AMOV A, 25HADDC A, 28HMOV 25H, ALOOP3: CPL CLOOP2: DJNZ R7, LOOP4;MOV A, 20HXCH A, 23HMOV 20H, AMOV A, 21HSXCH A, 24HMOV 21H, AMOV A, 22HMOV 22H, AMOV A, 23HADDC A, 23HMOV 23H, AMOV A, 24HADDC A, 24HMOV 24H, AMOV A, 25HADDC A, 25MOV 25H, AMOV 60H, 23HMOV 61H, 24HMOV 62H, 25HMOV A, 20HXCH A, 23HMOV 20H, AMOV A, 21HXCH A, 24HMOV 21H, AMOV A, 22HXCH A, 25HMOV 22H, ACLR ACLR CMOV 20H, HMOV 21H, HMOV 22H, HMOV R7, H LOOP8: MOV A, 20H RLC AMOV 20H, AMOV A, 21HRLC AMOV 21H, AMOV A, 22HRLC AMOV 22H, AMOV A, 23HRLC AMOV 23H, AMOV A,24HRLC AMOV 24H, AMOV A, 25HRLC AMOV 25H, AJNC LOOP5MOV A, 23HSUBB A, 26HMOV 23H, AMOV A, 24HSUBB A, 27HMOV 24H, AMOV A, 25HSUBB A, 28HMOV 25H, AMOV A, 23HADD A, HMOV 23H, AMOV A, 24HADDC A, HMOV 24H, AMOV A, 25HADDC A, HMOV 25H, ASETB CSJMP LOOP6LOP5: MOV A, 23H SUBB A, 26HMOV 23H, AMOV A, 24HSUBB A, 27HMOV 24H, AMOV A, 25HSUBB A, 28HMOV 25H, AJNC LOOP7MOV A, 23HADD A, 26HMOV 23H, AMOV A, 24HADDC A, 27HMOV 24H, AMOV A, 25HADDC A, 28HMOV 25H, ALOOP7: CPL CLOOP6: DJNZ R7, LOOP8MOV A, 20HXCH A, 23HMOV 20H, AMOV A, 21HXCH A, 24HXCH A, 24HMOV 21H, AMOV A, 22HXCH A, 25HMOV 22H, AMOV A, 23HADDC A, 23HMOV 23H, AMOV A, 24HADDC A, 24HMOV 24H, AMOV A, 25HADDC A, 25HMOV 25H, AMOV 20H, 60HMOV 21H, 61HMOV 22H, 62HRET;____________________________________________________________________ _________;Name: CHU10;Func: 带符号双字节除单字节除法子程序;Input: 被除数放在R1R0中,除数放在R4中.移位计数器放在R7中;OutPut:商数放在R0,余数放在R1中;Use: 使用内部RAM60H--62H单元存放被除数,除数和商的符号位;____________________________________________________________________ _________DATA1 EQU 40H ; 被除数低字节DATA2 EQU 00H ; 被除数高字节DATB EQU 0F8H ; 除数ORG 2000HAJMP MAINMAIN: MOV R0, #DATA1MOV R1, #DATA2MOV R4, #DATBMOV R7, HACALL CHU10 LOOP: SJMP LOOP CHU10: MOV A, R4 JZ A, LOOP1MOV A, R1RLC AMOV 60H, CMOV A, R4RLC AMOV 61H, CANL C, 60HJC C, LOOP2MOV C, 60HORL C, 61HSJMP LOOP3LOOP2: CPL CLOOP3: MOV 62H, C MOV A, R4JB ACC.7, LOOP4 LOOP9: MOV A, R1 JB ACC.7 LOOP5 LOOP7: ACALL CHU4JB 62H, LOOP6 LOOP8: CLR ARETLOOP4: MOV A, R4 CPL AADD A, HMOV R4, ASJMP LOOP9LOOP5: MOV A, R0 CPL AADD A, HMOV R0, AMOV A, R1CPL AADDC A, HMOV R1, ASJMP LOOP7LOOP6: MOV A, R0CPL AADD A, HMOV R0, ASJMP LOOP8LOOP1: MOV A, FFHRET;____________________________________________________________________ _________;Name: SQRT;Func: 双字节平方根子程序;Input: 待开平方根放在R1R0中;OutPut:平方根放在R3R2中;Use:;____________________________________________________________________ _________ORG 2000HAJMP LOOP0LOOP0: SJMP LOOPSQRT: CLR AMOV R2, AMOV R3, ASETB CLOOP: MOV A, R0SUBB A, R2MOV R0, AMOV A, R1SUBB A, R3MOV R1, AJC C, LOOP2MOV A, R0SWUBB A, R2MOV R0, AMOV A, R1SUBB A, R3MOV R1, AJC C, LOOP2MOV A, R2ADD A, HMOV R2, AMOV A, R3ADDC A, HMOV R3, ASJMP LOOP1LOOP2: RET;____________________________________________________________________ _______;Name: BCDAD1;Func: 单字节BCD码加法子程序;Input: R0指向两个加数的首地址;OutPut: 和数为双字节,放在加数后的地址单元中;Use:;____________________________________________________________________ _________20H EQU 99H21H EQU 99H22H DEFB 02HORG 2000HAJMP MAINMAIN: MOV R0, HACALL BCDAD1LOOP: SJMP LOOPBCDAD1: CLR CMOV A, @R0INC R0ADD A, @R0DA AINC R0MOV @R0, ARLC AANL A, HINC R0MOV @R0, ARET;____________________________________________________________________ _______;Name: BCDAD2;Func: 四字节BCD码加法子程序;Input: 被加数首地址由R0指向内部RAM20H单元,加法首地址由R1指向内部RAM24H单元;OutPut: 和数放在内20H---24H单元中;Use:。