本程序,需要三个地址指针,但是一般只有两个(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即可改为减法子程序。请楼主自行改写。
#include<stdio.h>#include<string.h>
int main(void)
{
char a[80],b[80],temp[80]
int i,j,carr,len_a,len_b,n_temp
printf("string a:\n")
scanf("%s",a)
printf("string b:\n")
scanf("%s",b)
len_a=strlen(a)
len_b=strlen(b)
if(len_a<len_b)
{
strcpy(temp,a)
strcpy(a,b)
strcpy(b,temp)
len_a=strlen(a)
len_b=strlen(b)
}
strcpy(temp,a)
for(j=0,i=len_a-1i>=0i--,j++)
a[j]=temp[i]
strcpy(temp,b)
for(j=0,i=len_b-1i>=0i--,j++)
b[j]=temp[i]
carr=0
for(i=0i<len_bi++)
{
n_temp=a[i]-'0'+b[i]-'0'
if(n_temp<10)
{
a[i]=n_temp+'0'+carr
}
else
{
a[i]=n_temp-10+'0'+carr
carr=1
}
}
strcpy(temp,a)
for(j=0,i=len_a-1i>=0i--,j++)
a[j]=temp[i]
printf("answer is:\n%s\n",a)
return 0
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)