本程序,需要三个地址指针,但是一般只有两个(R0和R1)可以用;如果换用工作区,就比较麻烦了。下面使用B充当“和”的地址指针,RESULT + 4单元,充当加数2的地址指针。
程序如下:
RESULT equ 30H 和数的地址
ORG 0000H
实验数据如下:
MOV 20H, #22H 加数1
MOV 21H, #33H
MOV 22H, #44H
MOV 23H, #0F3H
MOV 24H, #12H 加数2
MOV 25H, #34H
MOV 26H, #56H
MOV 27H, #78H
MOV R0, #20H 给定地址
MOV R1, #24H
LCALL _4_JIA_4 调用加法子程序
NOP
SJMP$
_4_JIA_4:
MOV RESULT + 4, R1 保存加数2地址
MOV B, #RESULT 保存和的地址
CLR C
MOV R2, #4
LOOP:
MOV A,@R0
INC R0
MOV R1, RESULT + 4
ADDC A,@R1 加上加数2
INC R1
MOV RESULT + 4, R1
MOV R1, B
MOV @R1, A 保存和数
INC R1
MOV B, R1
DJNZ R2, LOOP
CLR A
ADDC A,#0
MOV RESULT + 4, A 保存第五字节
RET
减法子程序,与上面的加法子程序雷同,只要把ADDC换成SUBB即可改为减法子程序。请楼主自行改写。
BHADD:MOV A,31H
MOV B,#10
MUL AB
ADD A,30H
MOV R2,A
MOV A,32H
MOV B,#100
MUL AB
ADD A,R2
MOV R2,A
XCH A,B
ADDC A,#0
MOV R3,A
MOV A,33H
MOV B,#10
MUL AB
MOV B,#100
MUL AB
ADD A,R2
MOV R2,A
XCH A,B
ADDC A,R3
XCH A,R3
以上将30H~33H十进制转换为十六进制
MOV A,R2
ADD A,40H
MOV 40H,A
XCH A,R3
ADDC A,41H
MOV 41H,A
XCH A,42H
ADDC A,#0
MOV 42H,A
MOV A,43H
ADDC A,#0
MOV 43H,A
RET
不仅仅51单片机,所有计算机都是一样的实现机理。都是通过硬件实现的,通过硬件的逻辑门实现,具体逻辑门很多,常见的有大家熟知的“与”,“或”,“异或”等等,这些逻辑门进行组合,实现了更加强大的功能,比如加法器,累加器,等等,你去百度一下“逻辑门”“门电路”“加法器”就知道咯大概了。
在逻辑门中,1,和0就是高电平和低电平。比如是1+0,它则是这样实现的:将某个逻辑门的引脚(你可以想象为某跟电线)设置为高电平,将另一个引脚设置为低电平,然后通过一些电路(这就是逻辑门了),他会得到高电平(即1)。同理如果是2+3(都会先转换成二进制数)呢?多几个引脚,多几次处理不就ok了么!你上面的12A4H和0FE7H是16进制数,硬件计算时会利用逻辑门先将他们转换成二进制数。如果你想了解是怎么转换成二进制数则可以百度一下AD转换。好了,就这样啦!
顺便说句,没事得给点分,要不一般是没人愿意为你做详细解答的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)