OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2510|回复: 5

汇编请教。。8位机汇编32位乘法算法。。。

[复制链接]

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2018-9-1 22:58:37 | 显示全部楼层 |阅读模式
50金钱
用到一低端8位MCU ,有一个8位乘法器,能一个周期计算8位*8位,结果存放在RH,RL两个8位寄存器中。有于MCU资源有限,想请教有没有比较节省RAM和ROM的算法。计算32位*32位  DATA1:4  *   DATA2:4   -> RESULT:8   

最佳答案

查看完整内容[请看2#楼]

以51为例, Z = X * Y , 这是UNSIGNED, 不检测OVERFLOW MOV A,X_0 MOV B,Y_0 MUL AB MOV Z_0,A ; Z_01 = X_0 * Y_0 MOV Z_1,B ; MOV A,X_0 MOV B,Y_1 MUL AB ADD A,Z_1 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-9-1 22:58:38 | 显示全部楼层
本帖最后由 edmund1234 于 2018-9-2 14:17 编辑

以51为例, Z = X * Y , 这是UNSIGNED, 不检测OVERFLOW

        MOV                A,X_0
        MOV                B,Y_0
        MUL                AB
        MOV                Z_0,A                ; Z_01 = X_0 * Y_0
        MOV                Z_1,B
        ;
        MOV                A,X_0
        MOV                B,Y_1
        MUL                AB
        ADD         A,Z_1
        MOV                Z_1,A
        MOV                A,B
        ADC                A,#0
        MOV                Z_2,A                ; Z_12 += X_0 * Y_1
        ;
        MOV                A,X_1
        MOV                B,Y_0
        MUL                AB
        ADD         A,Z_1
        MOV                Z_1,A
        MOV                A,B
        ADC                A,Z_2
        MOV                Z_2,A                ; Z_12 += X_1 * Y_0
        ;
        MOV                A,X_1
        MOV                B,Y_1
        MUL                AB
        ADD         A,Z_2
        MOV                Z_2,A
        MOV                A,B
        ADC                A,#0
        MOV                Z_3,A                ; Z_23 += X_1 * Y_1
        ;
        " " " "                                ; Z_34 += X_1 * Y_2
        " " " "                                ; Z_34 += X_2 * Y_1
        " " " "                                ; Z_45 += X_2 * Y_2
        " " " "                                ; Z_56 += X_2 * Y_3
        " " " "                                ; Z_56 += X_3 * Y_2
        " " " "                                ; Z_67 += X_3 * Y_3
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-2 01:14:55 | 显示全部楼层
帮顶
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8028
金钱
8028
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-9-2 09:10:52 | 显示全部楼层
我怎么记得8位单片机计算32*32这样的运算是交给编译器解决的?
直接定义long dwNum1 = 2000000, dwNum2 =23874872, dwResult;
dwResult = dwNum1 * dwNum2;就可以了。
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
 楼主| 发表于 2018-9-2 11:34:23 | 显示全部楼层
mack13013 发表于 2018-9-2 09:10
我怎么记得8位单片机计算32*32这样的运算是交给编译器解决的?
直接定义long dwNum1 = 2000000, dwNum2 =2 ...

垃圾MCU没有C编译器。不然就不用汇编了。。。而且只有128Byte RAM指令也就只能写1000行左右。
回复

使用道具 举报

33

主题

984

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8028
金钱
8028
注册时间
2014-8-13
在线时间
1595 小时
发表于 2018-9-2 13:58:53 | 显示全部楼层
pdwdzz 发表于 2018-9-2 11:34
垃圾MCU没有C编译器。不然就不用汇编了。。。而且只有128Byte RAM指令也就只能写1000行左右。

用Keil C51写一个32*32,然后用IDA逆向一下,看下8位机汇编怎么处理32*32的,然后仿写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 06:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表