最后使用switch-case语句对四种形态的九九乘法表进行整理以局渣陵完善程序。首先,我们嵌套两个for循环语句得到一个方形的九九乘法表。得到的九九乘法表方形桐戚块如下。下一步,我们对方形块进行“切割”,这里我们以左下乘法表为示例。
由图我们可以添加两条约束:1.左下乘法表打印斜边的边界条件为i等于j(本文打印顺序为i×j),即当梁和i>=j时,乘法式显示,当i2.换行条件为j==9;同理,我们可以得到右上乘法表。但是当我们想要切割左上和右下乘法表时,可以发现缺少了部分乘法公式。
#include<stdio.h>int i
int n
int aa[1000] /*最多1000个数相乘,可厅辩以自己修改*/
int sum=1
void main()
{
printf("请输入要求伍笑相乘数扮橘缺的个数:")
scanf("%d",&n)
printf("请输入要求相乘数的数字:")
printf("\n")
for(i=0i<ni++)
{
scanf("%d",&aa[i])
sum=sum*aa[i]
}
printf("计算结果为%d:",sum)
printf("\n")
}
org 0000hjmp start
start:
MOV SP,#60H
mov r2,#20h
mov r3,#34h
mov a,#99h
lcall bhd
lcall hbd
NOP
NOP
三字节除以单字节子程序
入口条件:被除数在R3、R4、R5中,除数在R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31:
CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV 商溢出
RET
DV30:
MOV R2,#10H求R3R4R5/R7-→搭迹R4R5
DM23:
CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24:
DJNZ R2,DM23
MOV A,R3 四舍五入
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25:
INC R5
MOV A,R5
JNZ DM26
INC R4
DM26:
CLR OV
RET 商在孙枝老R4R5中
两字节除以单字节子程序
入口条件:被则升除数在R4、R5中,除数在R7中。
出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
余数在r4中
影响资源:PSW、A、R3~R7 堆栈需求: 2字节
D457:
CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV商溢出
RET
DV50:
MOV R6,#8 求平均值(R4R5/R7-→R3)
DV51:
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52:
CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4 四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53:
INC R3
DV54:
CLR OV
RET
四字节除以单字节子程序
入口条件:被除数在R2、R3、R4、R5中,除数在R7中。
出口信息:a<ff 时三字节商在R3、r4、r5中,a=ff 时溢出。
余数在r2中
影响资源:PSW、A、R2~R7 堆栈需求:2字节
input dat1,dat2,dat3,r5 r0(h),:divisor dat2(h) dat3() r5(l):quotient
dat1(h)dat2(l):residue
F_DIV:
clrc
mova,r7
jz fd_over
fd_begin:
mova,r2
subb a,r7
jc no_overflow
mova,#0ffh
ret
no_overflow:
clra
movr6,#18h
fdiv0:
lcall rlc4
jc goushang
mova,r2
subb a,r7
jc fdnext
incr5
movr2,a
fdnext:
djnz r6,fdiv0
jmpfdone
goushang:
mova,r2
subb a,r7
inca
incr5
movr2,a
jmpfdnext
fdone:
clr a
clr ov
ret
fd_over:
mov a,#0ffh
ret
rlc4:
clrc
mova,r5
rlca
movr5,a
mova,r4
rlca
movr4,a
mova,r3
rlca
movr3,a
mova,r2
rlca
movr2,a
ret
DIVD功能:双字节二进制无符号数除法
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
余数在r2 r3中
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD:
CLR C 比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV 溢出
RET
DVD1:
MOV B,#10H 计算双字节商
DVD2:
CLR C 部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C 保存溢出位
CLR C
SUBB A,R7 计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 结果判断
JC DVD3
MOV R2,A 够减,存放新的余数
MOV A,R1
MOV R3,A
INC R5 商的低位置一
DVD3:
DJNZ B,DVD2计算完十六位商(R4R5)
MOV A,R4 商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV 设立成功标志
RET
双字节乘以双字节乘法
入口条件:被乘数在R2、R3中,乘数在R6、R7中。
出口信息:乘积在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MULD:
MOV A,R3 计算R3乘R7
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
ADDC A,B
MOV R3,A
MOV A,R2 计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 计算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 累加部分积
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
双字节乘以单字节乘法
入口条件:被乘数在R2、R3中,乘数在R7中。
出口信息:乘积在R2、R3、R4中。
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
mul21:
mov a,r3
mov b,r7
mul ab
mov r4,a
mov r5,b
mov a,r2
mov b,r7
mul ab
add a,r5
mov r3,a
mov a,b
addc a,#00h
mov r2,a
ret
功能:双字节十六进制整数转换成双字节BCD码整数
入口条件:待转换的双字节十六进制整数在R6、R7中。
出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节
HB2:
CLR A BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H 转换双字节十六进制整数
HB3:
MOV A,R7 从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A 十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A 双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 处理完16bit
RET
入口条件:待转换的单字节BCD码整数在累加器A中。
出口信息:转换后的单字节十六进制整数仍在累加器A中。
影响资源:PSW、A、B、R4 堆栈需求: 2字节
BCDH:
MOV B,#10H 分离十位和个位
DIV AB
MOV R4,B 暂存个位
MOV B,#10 将十位转换成十六进制
MUL AB
ADD A,R4 按十六进制加上个位
RET
双字节BCD码整数转换成双字节十六进制整数
入口条件:待转换的双字节BCD码整数在R2、R3中。
出口信息:转换后的双字节十六进制整数仍在R2、R3中。
影响资源:PSW、A、B、R2、R3、R4 堆栈需求:4字节
BH2:
MOV A,R3 将低字节转换成十六进制
LCALL BCDH
MOV R3,A
MOV A,R2 将高字节转换成十六进制
LCALL BCDH
MOV B,#100 扩大一百倍
MUL AB
ADD A,R3 和低字节按十六进制相加
MOV R3,A
CLR A
ADDC A,B
MOV R2,A
RET
标号: BHD功能:单字节BCD码小数转换成单字节十六进制小数
入口条件:待转换的单字节BCD码数在累加器A中。
出口信息:转换后的单字节十六进制小数仍在累加器A中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
BHD:
MOV R2,#8 准备计算一个字节小数
BHD0: ADD A,ACC 按十进制倍增
DA A
XCH A,R3
RLC A 将进位标志移入结果中
XCH A,R3
DJNZ R2,BHD0 共计算8bit小数
ADD A,#0B0H 剩余部分达到0.50否?
JNC BHD1 四舍
INC R3 五入
BHD1:
MOV A,R3 取结果
RET
标号: HBD功能:单字节十六进制小数转换成单字节BCD码小数
入口条件:待转换的单字节十六进制小数在累加器A中。
出口信息:CY=0时转换后的BCD码小数仍在A中。CY=1时原小数接近整数1。
影响资源:PSW、A、B 堆栈需求: 2字节
HBD:
MOV B,#100 原小数扩大一百倍
MUL AB
RLC A 余数部分四舍五入
CLR A
ADDC A,B
MOV B,#10 分离出十分位和百分位
DIV AB
SWAP A
ADD A,B 拼装成单字节BCD码小数
DA A 调整后若有进位,原小数接近整数1
RET
jmp $
end
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)