51单片机汇编语言。求两个数的平方和。
双字节二进制无符号数开平方(快速)
入口条件:被开方数在R2、R3中。
出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET ;被开方数为零,不必运算
SH20: MOV R7,#0 ;左规次数初始化
MOV A,R2
SH22: ANL A,#0C0H ;被开方数高字节小于40H否?
JNZ SQRH ;不小于40H,左规格化完成,转开方过程
CLR C ;每左规一次,被开方数左移两位
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7 ;左规次数加一
SJMP SH22 ;继续左规
SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H ;第一区间的斜率
MOV R4,#80H ;第一区间的平方根基数
SJMP SQR3
SQR1: MOV B,#0B2H ;第二区间的斜率
MOV R4,#0A0H;第二区间的平方根基数
SJMP SQR3
SQR2: MOV B,#8DH ;第三区间的斜率
MOV R4,#0D0H;第三区间的平方根基数
SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
MOV A,B
ADD A,R4 ;累加到平方根的基数上
MOV R4,A
MOV B,A
MUL AB ;求当前平方根的幂
XCH A,R3 ;求偏移量(存放在R2R3中)
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C ;用减奇数法校正一个字节的平方根
MOV A,R4 ;当前平方根的两倍加一存入R5R6中
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3 ;偏移量小于该奇数否?
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5 ;小于,校正结束,已达到一个字节的精度
INC R4 ;不小于,平方根加一
MOV R2,A ;保存新的偏移量
MOV R3,B
SJMP SQR4 ;继续校正
SQR5: MOV A,R4 ;将一个字节精度的根存入R2
XCH A,R2
RRC A
MOV F0,C ;保存最终偏移量的最高位
MOV A,R3
MOV R5,A ;将最终偏移量的低八位存入R5中
MOV R4,#8 ;通过(R5R6/R2)求根的低字节
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
MOV A,R7 ;取原被开方数的左规次数
JZ SQRE ;未左规,开方结束
SQR9: CLR C ;按左规次数右移平方根,得到实际根
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
PS:很长 我也是找的你就将就看看吧
楼上的程序,少了个@.
MOV R0, #40H
MOV R1, #60H
MOV R2, #0AH
CLR C
LOOP1:
MOV A, @R0
ADDC A, @R1
MOV @R1, A ;这里少了个@.
INC R0
INC R1
DJNZ R2, LOOP1
END
BBB EQU 31H
CCC EQU 40H
ORG 8000H
MAIN: MOV R3,#0 ;清零
MOV A,AAA
ACALL SQRT ;调用求平方子程序
MOV R3,A
MOV A,BBB
ACALL SQRT ;调用求平方子程序
ADD A,R3
MOV R3,A
MOV CCC,R3
SJMP $
SQRT: MOV DPTR,#TAB
MOVC A,@A+DPTR
RET
TAB: DB 0,1,4,9,16
DB 25,36,49,64,81
END
QH:
MOV A,30H
MOV B,A
MUL AB
MOV 40H,A
MOV 41H,B
MOV A,31H
MOV B,A
MUL AB
ADD A,40H
MOV 40H,A
XCH A,B
ADDC A,41H
MOV 41H,A
MOV 42H,#0
JNC QHE
MOV 42H,#1
QHE:
RET
PFH:
MOV A, 30H
MOV B, A
MUL AB
MOV 40H, A
MOV 41H, B
MOV A, 31H
MOV B, A
MUL AB
ADD A, 40H
MOV 40H, A
MOV A, B
ADDC A, 41H
MOV 41H, A
CLR A
ADDC A, #0
MOV 42H, A
RET
51单片机汇编语言。求两个数的平方和。
DB 25,36,49,64,81 END
【跪求】单片机编程:利用查表发求1~9的平方值
假设数据在R2中,求出平方后,仍然放在R2。程序如下:MOV A, R2 MOV DPTR, #TAB MOVC A, @A+DPTR MOV R2, A RET TAB: DB 0,1,4,9,16,25,36,49,61,81 END
单片机编程,汇编语言
A中数据进行开平方,如下即可:;MOV R2, #255 LP1:INC R2 SETB C SUBB A, R2 JC EXIT SUBB A, R2 JNC LP1 EXIT:MOV A, R2 RET ;应用《减奇数法》来开平方。
51单片机汇编语言查表法求16位整数平方根
直接用查表法,求16位整数的平方根,这个表规模可就太大了。平方根的整数部分,就要有64K字节;平方根的小数部分,也要有64K字节。在单片机上,难以承受这么大的数据量。如果,用 16位整数的高8位数,查表求平方根,平方根表有256字节,依次递推,...。
c语言如何计算平方?
1、C语言中计算一个数的N次方可以用库函数pow来实现,还可以直接使用2^3就可以算出结果。pow函数原型:double pow(double x,double y)。其中x值是底数,y值是幂。举例:double a=pow(3.14,2)计算3.14的平方。注意:使用pow函数时,需要将头文件#include<math.h>包含进源文件中。2、在C语言...
单片机10的平方怎么写
只学过汇编来编写单片机程序,汇编里只有乘法运算。没有10的n次方这样的库函数(不知道c语言里是否有)。要想得到10的n次方可以将10*10的命令循环n次啊,写成一个子程序,要用的时候调用就好。 mingyanghuagu4 | 发布于2013-01-23 举报| 评论 0 0 10^2,英文输入法下按shift+6.。或者10*10,shift+8 追...
汇编语言里面的查表法是什么意思啊。在单片机里面是怎么运行的啊~~~
51单片机汇编语言有一条查表指令是:MOVC A, @A+DPTR 它不是单独使用的,要和 DB 伪指令配套使用。例如:若累加器A中有一个0~9的数,请用查表法求出该数的平方值,设平方表表头地址为1000H。程序如下:;--- MOV DPTR,#1000H MOVC A,@A+DPTR ……ORG 1000H DB 0, 1, 4, 9, 16...
怎么用汇编中的MUL实现求N²呢?
·MUL 汇编语言无符号数乘法指令 格式:MUL SRC 执行的操作:字节操作数:(AX)←(AL)*(SRC)字操作数:(DX,AX)←(AX)*(SRC)双字操作数:(EDX,EAX)←(EAX)*(SRC)MUL:80C51单片机系统的乘法指令,只有一条指令:MUL AB 乘法指令的功能是将A和B中两个无符号8位二进制数相乘,所得的16位积的...
单片机汇编语言中比较指令
数(A中的)大,则CY=0,不然CY=1,因此在程序转移后再次利用CY就可判断出A中的数 比data大还是小了。例:MOV A,R0 CJNE A,#10H,L1 MOV R1,#0FFH AJMP L3 L1: JC L2 MOV R1,#0AAH AJMP L3 L2: MOV R1,#0FFH L3: SJMP L3 JC是判CY是0,还是1进行转移,如果CY=1,则转移到JC...
单片机的汇编语言 如何判断两个无符号数的大小
谁跟你说图上是判断有符号数大小的程序???这程序就是比较无符号数大小的,只不过加了数据搬运而已。查了一下PIC的SUBWF指令,的确是比较有符号数的。如果要比较无符号数,可先判定两个数的最高位是否同号:若异号,则最高位为1者大;若同号,再用SUBWF减法判定大小,参考书上这个例程。