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

单片机指令集的汇编语言编程方法介绍汇编语言是一种低级语言,它直接与计算机硬件进行交互,被广泛应用于单片机编程中。
本文将介绍单片机指令集的汇编语言编程方法。
一、简介单片机指令集是特定型号单片机支持的操作指令的集合。
每个指令都对应着特定的功能,通过组合和调用这些指令,可以实现复杂的计算和控制任务。
二、基本指令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引脚的输入电压。
第4章 单片机汇编语言程序设计

RO 20HBCMDH BCDL
SWAP A ORL A, #30H MOV 21H, A SJMP $
;BCDH数送A的低4位 21 0011
;完成转换 @R0 ;存数
H22HB0C001D0HBCD 01000L
END
回目录 上页 下页
方法1小结:
以上程序用了8条指令,15个内存字节,执行时间为9个 机器周期。
21 0011BCDH H22H0011BCDL
回目录 上页 下页
程序:
ORG 1000H
MOV R0, #22H ;R0 22H MOV @R0,#0 ; 22H 0 MOV A, 20H ;两个BCD数送A
A
B00C01D01H0BB0CC0D0DHL
XCHD A, @R0 ;BCDL数送22H ORL 22H, #30H ;完成转换
例4-7:设30H单元存放的是一元二次方程ax2+bx+c = 0
根的判别式△= b2 – 4ac的值。
试根据30H单元的值,编写程序,
判断方程根的三种情况。
在31H中存放“0”代表无实根,
存放“1”代表有相同的实根,
存放“2”代表两个不同的实根。
解:△为有符号数,有三种情况,这是一多重分支程序
即小于零,等于零、大于零。
R3
R2
回目录 上页 下页
程序:
ORG 1000H CLR C CLR A SUBB A, R0 MOV R2, A CLR A
SUBB A, R1 MOV R3 , A SJMP $ END
;CY 0
;A 0
;低字节求补
;送R2
;A清零 R3 0000
;高字节求补 0000
单片机子程序(汇编)

1.T0/T1产生方波:知识点:中断,定时/计数器TCON寄存器:TMOD寄存器:①用计时器T0使P1.0口输出1Hz (%50占空比) 的方波;②通过P1.0口使发光二级管闪烁(0.5s)。
ORG 0000HLJMP STARTORG 000BH ;T0LJMP SJDL ;伪指令ORG 0030HSTART: MOV TMOD,#11H ;把T0、T1都置成16位定时器MOV TL0,#176 ;65536-15536=50000μsMOV TH0,#60 ;设置计数器,定时50msSETB TR0 ;启动定时器T0SETB EA ;打开总开关SETB ET0 ; 打开分开关MOV R7,#10 ; 设置延时(10*50ms=0.5秒)MOV B,#0FFH;XX1: NOPNOP ;死循环/ 主程序NOPLJMP XX1SJDL: MOV TL0,#176 ;MOV TH0,#60 ;重置计数器DJNZ R7,SS1CPL P1.0 ; 取反MOV R7,#10SS1: RETI ;返回主程序③用计时器T1使P1.6口输出1Hz (%30占空比) 的方波ORG 0000HLJMP STARTORG 001BH ;(T1)LJMP SJDLORG 0030START: MOV TMOD,#11H ;00010001,T1、T0都为方式一,定时器模式MOV TH1,#60 ;或者(#3CH)MOV TL1,#176 ;0B0H 定时50msSETB TR1 ;启动定时器T1SETB EA ;SETB ET1 ;MOV R7,#6 ;LOOP: NOPNOPLJMP LOOPSJDL: MOV TL1,#176 ;重置计数器MOV TH1,#60 ;DJNZ R7,XX1 ;减一不为0则转移CPL P1.6 ;取反MOV R7,#6 ;设置延时(6*50ms=0.3秒)JB P1.6,XX1 ;若P1.6为高(1)则跳MOV R7,#14 ;设置延时(14*50ms=0.7秒)XX1: RETI④用计时器T0使P1.0口输出10Hz (%50占空比) 的方波;ORG 0000HLJMP STARTORG 000BH ;T0LJMP SJDLORG 0030HSTART: MOV TMOD,#11HMOV TL0,#176 ;65536-15536=50000μsMOV TH0,#60 ;设置计数器,定时50msSETB TR0SETB EASETB ET0XX1:LJMP XX1SJDL: MOV TL0,#176 ;MOV TH0,#60 ;CPL P1.0ERTI⑤波特率的计算方法:假若现在单片机外接的晶振为11.0592MHz时,以T/C2作波特率发生器,根据波特率公式:波特率=Fosc/2x16x(65536-t)9600=11.0592MHz/2x16x(65536-t)t=65500=0xFFD2.内存,置数‘’a)将20H ~ 7FH 置01HMOV R0,#20H ;MOV R7,#96 ;次数XX1: MOV @R0,#01HINC R0 ;DJNZ R7,XX1② ;区域指数,30H到39H置为1到10ORG 0000HLJMP STARTSTART: MOV R1,#30HMOV A,#01HMOV R2,#10XX1: MOV @R1,AINC R1INC ADJNZ R2,XX1END3.排序a)排序0,1,2,3...9 ---> 9,8,7,6 0ORG 0000HLJMP STARTORG 0030HSTART: MOV R1,#90HMOV A,#01HMOV R2,#10SETNUM: MOV @R1,A ;置数INC R1INC ADJNZ R2,SETNUMSHORT: MOV R0,#90H ;首地址MOV R2,#9 ;字节数MOV A,R0MOV R1,A ;R1存放首地址,为了保存原始数据MOV A,R2MOV R4,A ;R4中存放字节数,为了保存原始数据CLR F0 ;判断是否交换MOV A,@R1 ;取出第一个数,给A,A作为中间量,此时A=1 LOOP: MOV R5,A ;将第一个数赋值给R5 ,此时R5=1 INC R1CLR C ;清零进位位MOV A,@R1 ;将第二个数也赋值给A,A还是作为中间量,此时A=2SUBB A,R5 ;A=A-R5,R5值不变,此时A=1,C=0,R5=1JC LOOP1 ;A<R5SETB F0 ;设置交换位MOV A,R5 ; 此时A=1,R5=1XCH A,@R1 ; 此时A=2,@R1=1DEC R1 ; 此时@R1=1XCH A,@R1 ; 此时A=1,@R1=2INC R1 ; 此时@R1=1LOOP1: MOV A,@R1 ;将第二位数给中间位A,准备跳转到LOOP进行下一次排序DJNZ R4,LOOP ;最高交换9次JB F0,SHORT ;如果还有交换发生,就从头开始,如果没有交换发生,则说明排序完成RET4.累加(一)寻址方式;(详细见教材P.44)①寄存器间接寻址:MOV A,@Ri ;i=0 / 1如果Ri中的内容为40H,即从Ri中找到源操作数所在的单元的地址40H,然后把内部RAM40H地址单元中的内容传送给A。
51单片机汇编指令总结

51单片机汇编指令总结数据传输指令一.片内ram数据传输指令1.以累加器a为目的操作数的指令:mova,rnmova,directmova,@rimova,#data2.以寄存器rn为目的操作数的指令:movrn,amovrn,directmovrn,data3.以轻易地址为目的操作数的指令:movdirect,amovdirect,rnmovdirect1,derect2movdirect,@rimovdirect,#data4.间接地址为目的操作数的指令:mov@ri,amov@ri,directmov@ri,#data5.十六位数据传送指令:movdptr,#data16二.累加器a与片外ram数据传输指令:movxa,@rimovxa,@dptrmovx@ri,amovx@dptr,a三.换算串行:movca,@a+dptr(先pc←(pc)+1,后a←((a)+(dptr)))+movca,@a+pc(先pc←(pc)+1,后a←((a)+(pc)))四.互换指令:1.字节交换指令:xcha,rnxcha,directxcha,@ri2.半字节交换指令:xchda,@ri3.累加器半字节交换指令:swapa五.栈操作指令:1.push(入栈指令)pushdirect2.pop(出栈指令)popdirect算术运算指令:一.乘法加法指令:1.加法指令:adda,rnadda,directadda,@riadda,#data2.拎位次乘法指令:addca,rna←(a)+(rn)+cyaddca,directa←(a)+(direct)+cyaddca,@ria←(a)+((ri))+cyaddca,#dataa←(a)+(data)+cy3.带借位减法指令:subba,rna←(a)-cy-(rn)subba,directa←(a)-cy-(direct)subba,@ria←(a)-cy-((ri))subba,#dataa←(a)-cy-#data二.乘法乘法指令:1.乘法指令:mulabba←(a)×(b)高字节放到b中,低字节放到a中2.乘法指令:divaba←(a)÷(b)的商,(b)←(a)÷(b)的余数三.加1减1指令:1.提1指令:incaa←(a)+1incrnrn←(rn)+1incdirectdirect←(direct)+1inc@ri(ri)←((ri))+1incdptrdptr←(dptr)+12.减至1指令:decadecrndecdirectdec@ri四.十进制调制指令:daa调整累加器a的内容为bcd码逻辑操作方式指令:一.逻辑与、或、异或指令:1.逻辑与指令:anla,rnanla,directanla,@rianla,#data2.逻辑或这而令:orla,rnorla,directorla,@riorla,#dataorldirect,aorldirect,#data3.逻辑异或指令:xrla,rnxrla,directxrla,@rixrla,#dataxrldirect,axrldirect,#data二.清零、row指令:1.累加器a清零指令:crla2.累加器arow指令:cpla三.循环位移指令:1.累加器a循环左移指令:rla2.累加器a循环右移指令:rra3.累加器a连同进位位循环左移指令:rlca4.累加器a连同进位位循环右移指令:rrca控制转移指令:一.无条件迁移指令:1.绝对转移指令:ajmpaddr11(先pc+2,然后将addr11的高十位托付给pc,pc的高六位维持不变)2.长转移指令:ljmpaddr16(用addr16的值替代pc的值)3.相对迁移(长迁移)指令:sjmprel(带符号的偏移字节数)(pc+2,再加rel赋值给pc)4.间接转移指令:jmp@a+dptr(a)+(dptr)→(pc)二.条件转移指令:1.累加器判零迁移指令:jzrel先pc+2;后判断,a为0时转移,pc+rel赋值给pc;否则顺序继续执行jnzrel先pc+2,后判断,a不为0时转移,pc+rel赋值给pc;否则顺序执行2.比较转移指令:cjne目的操作数,源操作数,relcjnea,direct,rel先pc+3传回pc,再比较目的操作数和原操作数cjnea,#data,rel目>源时,程序转移,pc+rel传回pc且cy=0cjnern,#data,rel目=源时,程序顺序执行cjne@ri,#data,rel目djnzrn,rel先pc\\+2,rn-1,当rn为0时程序顺序继续执行,否则pc+rel传到pcdjnzdirect,rel先pc+3,direct-1,direct为0时程序顺序继续执行,否则pc+rel传到pc二.子程序调用、返回指令:1.绝对调用指令acall:acalladdr11先pc+2,sp+1将pc的低八位存入sp;sp+1,将pc的高八位取走sp。
单片机设计中C函数和汇编子程序的相互调用及实例

名规 则 建立 一 个 dt a a和 b 段 ,它 们 代 表 所 要 传 递 参 数 的 起 始 位 置 ,其 偏 移 值 为 零 。 这 些 段 是 公 开 的 . 因 而 它 们 的 地 i t 址 可 被 其 它 模 块 访 问 。 另 外 ,这 些 段 被 编 译 器 赋 予 “ V R At B E 标 志 , 故 可 被 I l连 接 / 位 器 作 覆 盖 分 析 。 依 O E L  ̄ L” A J 5 定
2 Fa ki C 1和 A 1混 合 编 程 所 涉 及 的几 个 主 要 问题 rn l 5 n 5
2 1 C 1 数 名 的 转 换 及 其 命 名 规 则 . 5 函
C 1 序 模 块 编 译 成 目标 文 件 后 , 其 中 的 函 数 名 依 据 其 定 义 的 性 质 不 同会 转 换 为 不 同 的 函 数 名 , 因 此 , 在 C和 汇 5 程 编 程 序 的 相 互 调 用 中 ,要 求 汇 编 程 序 必 须 服 从 这 种 函 数 名 的 转 换 规 则 , 否 则 ,将 无 法 调 用 到 所 需 的 函 数 或 出 现 错 误 。
维普资讯
第 十 七 卷 第 三 期
2 0 0 2 年 6 月
楚 雄 师 范 学 院 学 报
J RNAL OF CHUX1 OU 0NG N 0RMAL U VERS TY NI I
VO . 7 No. 1 1 3
.
vi fnl(hr o c c a) du
v i u e ( od) od rn 2 v i
一F N l U C
?F N 2 U C
一
带 有经 寄 存 器 传 递 参 数 的 函 数 在 其 名 字 前 加 上 前 辍 “ ” 字 符 以示 区 别 , 一 它 表 明这 类 函数 包 含寄 存器 内的参 数传 递
PIC单片机汇编运算子程序

;清进位位 ;ACCD 右移 ;判断是否需要相加 ;加乘数至 ACCB,见加法程序 ;清进位位 ;右移部分乘积
;乘法完成否? ;否,继续求乘积 ;是,确定乘积的符号 ;为正,乘法结束 ;为负,乘积取补
NEG_B
DECF COMF BTFSC DECF COMF
;
OVER SETUP
RETURN MOVLW MOVWF MOVF MOVWF MOVF MOVWF CLRF CLRF RETURN .15 TEMP ACCBHI,0 ACCDHI ACCBLO,0 ACCDLO ACCBHI ACCBLO
GOTO CALL CHEK_A BTFSC CALL RETURN
LIST INCLUDE ACCALO ACCAHI ACCBLO ACCBHI ACCCLO ACCCHI ACCDLO ACCDHI TEMP SIGN ORG START GOTO ORG D_mpy CALL CALL INCF CLRF CLRF p=16f877 p16f877.inc EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU 0X0000 MAIN 0X0100 S_SIGN SETUP TEMP ACCCHI ACCCLO ;清 ACCC ;求取乘积的符号,并对负数取补 ;调用子程序,将 ACCB 的值送 ACCD 20 21 23 24 26 27 28 29 2A 2B ;存放乘数低 8 位 ;存放乘数高 8 位 ;存放被乘数低 8 位和乘积第 16~23 位 ;存放被乘数高 8 位和乘积第 24~31 位 ;存放乘积低 8 位 ;存放乘积高 8 位 ;临时寄存器 ;临时寄存器 ;临时寄存器 ;存放乘积的符号
; * * *1 6 × 1 6 位 乘 法 子 程 序 , 入 口 地 址 A C C B × A C C A , 出 口 地 址 A C C B 和 A C C C * * *
51单片机汇编程序

51单片机汇编程序1. 简介51单片机是一种常用的8位单片机芯片,具有广泛的应用领域。
51单片机的编程语言主要有汇编语言、C语言和底层汇编语言。
本文主要介绍51单片机的汇编程序。
2. 汇编程序基础2.1 寄存器51单片机的CPU有4个8位寄存器(A、B、DPTR、PSW)和一个16位寄存器(PC)。
在汇编程序中,我们可以使用这些寄存器来进行各种操作。
•A寄存器(累加器):用于存储数据和进行算术运算。
•B寄存器:辅助寄存器,可用于存储数据和进行算术运算。
•DPTR寄存器:数据指针寄存器,用于存储数据存取的地址。
•PSW寄存器:程序状态字寄存器,用于存储程序运行状态信息。
•PC寄存器:程序计数器,用于存储当前执行指令的地址。
2.2 指令集51单片机的指令集包含了多种汇编指令,可以用来进行数据操作、算术运算、逻辑运算、控制流程等。
常用的汇编指令有:•MOV:数据传送指令。
•ADD、SUB:加法和减法运算指令。
•ANL、ORL、XRL:逻辑运算指令。
•MOVX:外部RAM的读写指令。
•CJNE、DJNZ:条件分支指令。
•LCALL、RET:函数调用和返回指令。
2.3 编写一个简单的汇编程序下面是一个简单的汇编程序示例,用于将A寄存器中的数据加1,并将结果存储到B寄存器中。
ORG 0x0000 ; 程序的起始地址MOV A, #0x01 ; 将A寄存器赋值为1ADD A, #0x01 ; 将A寄存器加1MOV B, A ; 将A寄存器的值传送到B寄存器END ; 程序结束在上面的示例中,ORG指令用于指定程序的起始地址,MOV 指令用于将A寄存器赋值为1,ADD指令用于将A寄存器加1,MOV指令用于将A寄存器的值传送到B寄存器,END指令用于标记程序结束。
3. 汇编语言的应用51单片机的汇编语言广泛应用于各种嵌入式系统中,包括智能家居、工业自动化、仪器仪表等领域。
汇编程序具有以下特点:•程序执行效率高:由于汇编语言直接操作硬件,可以精确控制程序的执行流程,提高程序的执行效率。
单片机4、汇编语言程序设计

4-7
算术运算程序
4-7-1 多字节加减运算程序 1.多字节加法子程序,Z=X+Y。 ADDS:CLR C LOOP:MOV A,@R0 ADDC A,@R1 ;加一字节 MOV @R0,A ;存和一字节 INC R0 ;修改指针 INC R1 DJNZ R2,LOOP ;全部字节加完? RET
例:ห้องสมุดไป่ตู้DW
例如:
1234H,5678H
ORG 2100H TAB2:DW 1067H, 1000H, 100 汇编后: (2100H)=10H,(2101H)=67H, (2102H)=10H,(2103H)=00H, (2104H)=00H,(2105H)=64H。
4. EQU —等值。为标号或标识符赋值。 X1 EQU 2000H X2 EQU 0FH … MAIN:MOV DPTR,#X1 ADD A,#X2
一. 汇编语言指令类型 1.机器指令 指令系统中的全部指令,每条指令有对应的机器代码。 2. 伪指令 汇编控制指令,仅提供汇编信息,没有指令代码。
3. 宏指令 宏汇编功能:将需要多次反复执行的程序段定义成 一个宏指令名(宏定义),编程时,可在程序中使用 宏指令名来替代一段程序(宏调用)。 宏定义过程: 宏指令名 MACRO 形式参数 … ENDM 宏调用过程: … 宏指令名 实际参数 … 宏指令名 实际参数
4-5-2
单重循环
简单循环结构:循环体中不套循环。 定时 例:试计算下列程序段执行时间。 程序 指令执行周期 MOV R7, #64H 1T LOOP:NOP 1T NOP 1T DJNZ R7, LOOP 2T
解:上述程序显然属于循环程序,其算法结构 如图所示。循环次数100次,根据每条指令的 执行周期可得每次循环消耗1+1+2=4(机器周 期),加上第一条指令,整个程序段共计消耗 时间为(4×100+1)T= 401T,当晶振频率为 6MHZ时,T=2μs,故上述程序实际消耗802μs 。
单片机汇编程序设计

单片机汇编程序设计第一点:单片机汇编程序设计的基本概念与原理单片机汇编程序设计是嵌入式系统开发的重要组成部分,它是通过直接操作单片机的硬件资源,实现对单片机的控制和功能扩展。
汇编语言是一种低级编程语言,它与机器语言非常接近,但比机器语言更易于理解和使用。
汇编语言通过助记符来表示机器指令,使得程序员可以更方便地编写程序。
在单片机汇编程序设计中,我们需要了解和掌握以下几个基本概念和原理:1.寄存器:寄存器是单片机中用于暂时存储数据和指令的小容量存储单元。
在汇编语言中,寄存器的使用非常频繁,如累加器(ACC)、数据指针(DPTR)、程序计数器(PC)等。
2.指令:指令是汇编语言中的基本操作单元,它告诉单片机要执行的操作和操作的数据。
指令通常由操作码和操作数组成,操作码表示指令的类型,操作数表示指令的操作对象。
3.程序:程序是由一系列指令组成的,它告诉单片机要完成的功能。
在汇编语言中,程序通常由代码段、数据段和堆栈段组成。
4.汇编过程:汇编过程是将汇编语言程序转换为机器语言程序的过程。
它包括词法分析、语法分析、代码生成和优化等步骤。
5.伪指令:伪指令是一种特殊的指令,它不直接对应于机器指令,而是用于告诉汇编器如何组织程序的结构。
如数据定义伪指令、符号定义伪指令等。
第二点:单片机汇编程序设计的步骤与方法单片机汇编程序设计的步骤和方法是实现单片机控制的关键,它包括以下几个主要步骤:1.确定需求:在开始编写汇编程序之前,首先要明确程序要实现的功能和性能要求,以便于后续设计和编写程序。
2.选择单片机和开发环境:根据需求选择合适的单片机型号和开发环境,如STC系列单片机、Keil开发环境等。
3.熟悉单片机硬件资源和指令集:了解所选单片机的硬件资源和指令集,包括寄存器、定时器、中断控制器等,以便于在编写程序时正确使用。
4.编写汇编程序:根据需求和单片机资源,编写汇编程序。
在编写过程中,要注意合理使用寄存器、指令和伪指令,提高程序的执行效率和可读性。
51单片机汇编中断程序调用子程序

51单片机汇编中断程序调用子程序(原创实用版)目录1.51 单片机汇编中断程序概述2.中断程序的调用方式3.子程序的定义与调用4.中断程序调用子程序的实例分析5.总结正文一、51 单片机汇编中断程序概述在 51 单片机汇编语言编程中,中断是一种常见的编程方式,可以实现在特定条件下程序的跳转和执行。
通过中断程序,可以实现对硬件设备的实时控制,提高程序的执行效率。
二、中断程序的调用方式中断程序的调用方式主要有两种:1.通过外部中断引脚(如 P1.0、P2.0 等)触发中断。
这种方式下,当外部中断引脚的状态发生改变时,单片机会立即跳转到中断程序的入口地址执行。
2.通过软件中断实现中断程序的调用。
这种方式下,程序员可以通过设置特定的寄存器值来触发中断,使程序跳转到中断程序的入口地址执行。
三、子程序的定义与调用子程序,也称为子例程,是程序中一段可独立执行的代码段。
子程序可以通过以下方式定义和调用:1.使用“SUB”伪指令定义子程序。
在需要调用子程序的地方,编写“CALL 子程序名”,即可实现子程序的调用。
2.使用“PROG”伪指令定义子程序。
在需要调用子程序的地方,直接编写子程序名,即可实现子程序的调用。
四、中断程序调用子程序的实例分析假设我们有一个 51 单片机汇编语言程序,当外部中断引脚 P1.0 触发时,需要执行一个子程序以完成特定功能。
程序如下:```ORG 00HMOV P1, #00HMOV R4, #0FFHSTART: NOPINT0: MOV R3, #0FFHCALL INT_SUBROUTINESJMP STARTINT_SUBROUTINE: MOV R5, R3// 子程序执行的内容MOV R3, R5SJMP RETURNRETURN: MOV R4, R3SJMP RETURN_SUBROUTINERETURN_SUBROUTINE: MOV R3, #00HSJMP START```在上述程序中,当 P1.0 引脚触发中断时,程序会跳转到“INT0”标签所在的位置,执行子程序“INT_SUBROUTINE”。
- 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:。