打印
[其他ST产品]

st7系列的乘法指令

[复制链接]
3070|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
windark|  楼主 | 2007-10-29 15:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
st7mc有8位无符号乘法指令,在汇编下使用情况就不说了。
但是在用c语言编程时如果c(16bit)=a(8bit)*b(8bit),cosmic编译后的汇编代码是怎么样的?
cosmic会直接用那个乘法指令么,还是像我们以前的那种移位加法运算耗去几十条指令?
另外那种16位乘16位的情况又是如何?如果cosmic能聪明到直接运用那个乘法指令的话,估计10几个指令周期就搞定一次16位乘了吧。

手头虽然有编译器,但是不知道在哪儿看汇编代码,以前都是进debug阶段才看到汇编代码的,不知道怎么样才能编译后直接看汇编语句。知道的话就不麻烦大家了哈。
沙发
computer00| | 2007-10-29 15:49 | 只看该作者

那就debug一下啊

使用特权

评论回复
板凳
浪淘沙| | 2007-10-29 17:50 | 只看该作者

编译时用一个大概是-s的选项可以生成汇编代码列表

关于具体的选项使用,请LZ查一下cosmic的用户手册。如果你装了cosmic的套件,手册就在cosmic的系统目录下;如果是盗版的,我就不清楚了。

使用特权

评论回复
地板
浪淘沙| | 2007-10-30 10:04 | 只看该作者

16K的免费版本也有手册

安装后,手册在这个目录下:....COSMICCXST7_16KDocs

建议是用STVD7,选择Project/Setting,再"Project Settings"的窗口中选"C Compiler"子菜单,在Listings中选中"C and Assembly"即可。程序编译完后记生成汇编列表。


我试了一下,你说的情况,编译器使用了乘法指令!如你的例子c=a*b,产生了这样的5条指令:
LD  A, _a  ; 取a到寄存器A
LD  X, _b  ; 取b到寄存器X
MUL X, A
LD  _c+1, A ; 存结果低8位
LD  _c, X   ; 存结果高8位 (ST7使用大端存储方式)

使用特权

评论回复
5
windark|  楼主 | 2007-10-30 14:54 | 只看该作者

再帮我测试一下16位相乘吧

我按老大说的选了,但编译后没有输出任何结果阿,也没跳出什么窗口显示汇编代码。汗

不过这个暂时搁置,到时仔细研究。我现在只要看下16位相乘的结果是怎么样的,粗略估计是要20多个指令。老大帮我测试下看看,谢谢!

使用特权

评论回复
6
浪淘沙| | 2007-10-30 15:27 | 只看该作者

编译完后要到目标文件所在的目录下找.ls结尾的文件

.ls结尾的文件里面包含了C语句与对应汇编代码的列表。

使用特权

评论回复
7
浪淘沙| | 2007-10-30 15:50 | 只看该作者

它是通过一个隐含的库函数完成的16位乘16位的运算

总共用了不到30条指令,包括函数参数的传递,库函数中3次使用了MUL乘法指令。

因为使用了库函数,增加了函数的进入退出和参数的传递,所以指令数目不是最优;如果确实要求运算速度,你可以根据库函数自己写一段汇编嵌到C程序中。

使用特权

评论回复
8
windark|  楼主 | 2007-10-30 16:27 | 只看该作者

谢谢老大,可以结贴了

估计也就是那些需要压榨单片机一切资源的才会去关心这个事了。
虽然和dsp几十ns一次乘法运算有不少差距,不过和大多数单片机比很不错了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

49

帖子

0

粉丝