c语言乘法表程序怎么写

c语言乘法表程序怎么写,第1张

本文所用思想是在9行9列方形乘法表的基础上“切割”得到左上、右上、左下、右下四种形态的九九乘法表。

最后使用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 0000h

jmp 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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12398557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存