51单片机,使用keil软件,4字节加法或减法子程序

编写4字节加法和减法子程序。
加数与被加数由指针R0,R1定位,结果放在固定的内部RAM地址RESULT。
是汇编语言,不是C语言

四个字节加上四个字节,和应该是4~5个字节。
本程序,需要三个地址指针,但是一般只有两个(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即可改为减法子程序。请楼主自行改写。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-11-30
按你要求试编,未经调试,不一定正确,仅供参考。

4ADD:CLR C;清零进位位
MOV R4,#4;字节计数初值
MOV 30H,#RESULT;结果地址计数初值
KKKK:MOV A,@R0;取被除数加数
ADDC A,@R1;带进位加一个字节
INC R0;被加数计数加1
INC R1;加数计数加1
MOV 31H,R0;暂时保存被加数计数值
MOV R0,30H;取结果地址计数值
MOV @R0,A;存放本次运算结果
INC R0;结果地址计数值加1
MOV 30H,R0;保存结果地址计数值
MOV R0,31H;恢复保存被加数计数值
DJNE R4,KKKK;四个字节运算未完成转KKKK算下一字节
MOV R0,30H;取结果地址计数值
MOV A,#0;清A
ADDC A,#0;将最后的进位值放入A
MOV @R0,A;保存结果的最高字节
RET;返回

4SUBB:CLR C;清零进位位
MOV R4,#4;字节计数初值
MOV 30H,#RESULT;结果地址计数初值
KKKK:MOV A,@R0;取被除数加数
SUBB A,@R1;带进位减一个字节
INC R0;被减数计数加1
INC R1;减数计数加1
MOV 31H,R0;暂时保存被减数计数值
MOV R0,30H;取结果地址计数值
MOV @R0,A;存放本次运算结果
INC R0;结果地址计数值加1
MOV 30H,R0;保存结果地址计数值
MOV R0,31H;恢复保存被减数计数值
DJNE R4,KKKK;四个字节运算未完成转KKKK算下一字节
RET;返回