发新帖我要提问
12
返回列表
打印

stm32指令的特大BUG

[复制链接]
楼主: IT工作者
手机看帖
扫描二维码
随时随地手机跟帖
21
这种简单的指令, 怎么可能有 BUG?
看看楼主的运算

ssat r0,#31,r0,lsl #1
int i = examfunc(0x7F221145);

这里, 首先指令里使用的是 LSL 操作. 0x7F221145 经过 lsl #1 后为 0xFE44228A. 接下来执行 SSAT 运算. 注意 SSAT 将 R0 的值当有符号数处理. 0xFE44228A 也就是 -0x1BBDD76. 其结果当然没有溢出, 所以结果还是这个值.
如果要看到楼主的结果, 应该使用 USAT 指令!

使用特权

评论回复
22
IT工作者|  楼主 | 2012-10-9 14:37 | 只看该作者

+

本帖最后由 IT工作者 于 2012-10-9 15:25 编辑

21楼,如果按你的解释,SSAT指令可以取消了。

直接MOV R0,R0, LSL #1,   你说SSAT指令意义在哪里。



简单的说一下,SSAT指令只有在做信号处理定点运算时比较常用,
开发OS,或者协议栈,或者驱动,永远也不需要这种指令,所以一般做嵌入式开发的对这个指令比较陌生。
都说我理解错了,我也没招。

在ARM9或者更高端的ARM核上试下这个指令,就用我给的例子,看看结果,就真相大白了

使用特权

评论回复
23
香水城| | 2012-10-9 15:31 | 只看该作者
网上找了张图,可以解LZ之惑吗?




SSAT是有符号数的饱和运算,USAT是无符号数的饱和运算,作为有符号数,变成负数怎么能算溢出呢?

使用特权

评论回复
24
IT工作者|  楼主 | 2012-10-9 16:48 | 只看该作者
ssat r0,#31,r0,lsl #1

这个就是乘2运算,正数变负数了,结果当然不对。

带符号移位指令,也不可能正数移成负数,这个好理解吧。

找个ARM9或者以上的CPU试一下吧,真相大白。

使用特权

评论回复
25
IT工作者|  楼主 | 2012-10-9 16:51 | 只看该作者
我现在郁闷的是,没一个人支持我,

真理永远掌握在少数人手中。 :D

使用特权

评论回复
26
john_lee| | 2012-10-9 16:53 | 只看该作者
只问楼主一个问题,0x7F221145 左移一位的结果 0xFE44228A,按(补码表示的) 32 位有符号数来看,是不是负数?

如果楼主回答不是负数,那我只有说,你的问题在地球上应该没法解决。

使用特权

评论回复
27
IT工作者|  楼主 | 2012-10-9 17:05 | 只看该作者
只问楼主一个问题,0x7F221145 左移一位的结果 0xFE44228A,按(补码表示的) 32 位有符号数来看,是不是负数?

如果楼主回答不是负数,那我只有说,你的问题在地球上应该没法解决。 ...
john_lee 发表于 2012-10-9 16:53


当然是负数啊,就因为是负数,所以不对啊,如果是正数,我也不用发帖,跟各位讨论了。

使用特权

评论回复
28
john_lee| | 2012-10-9 17:16 | 只看该作者
是负数不就结了,还有什么不明白的?难道你认为 0x7F221145 左移一位的结果不应该是负数?

使用特权

评论回复
29
IT工作者|  楼主 | 2012-10-9 17:34 | 只看该作者
是负数不就结了,还有什么不明白的?难道你认为 0x7F221145 左移一位的结果不应该是负数?
john_lee 发表于 2012-10-9 17:16



这个确实是左移,但是是带饱和左移,不是普通的左移。

没有你想象的那么简单。

使用特权

评论回复
30
IJK| | 2012-10-9 17:53 | 只看该作者
LZ的想法有其合理性,但是应该用其它变通的方法来实现。

使用特权

评论回复
31
香水城| | 2012-10-9 18:02 | 只看该作者
LZ 你要的是增强性DSP饱和指令

QADD/QSUB/QDAAA/QDSUB

这个CORTEX-M3没有,你可以试试M4

使用特权

评论回复
32
IT工作者|  楼主 | 2012-10-9 18:04 | 只看该作者
IJK 还是比较理性的,没有将我全盘否定。

感谢各位的回复,冷静下来再想想。

要说CPU出问题,这个确实难以接受,但是事实就是如此。

找个ARM9试下,就行了,不能再拍砖了。

使用特权

评论回复
33
IT工作者|  楼主 | 2012-10-9 18:05 | 只看该作者
IJK 还是比较理性的,没有将我全盘否定。

感谢各位的回复,冷静下来再想想。

要说CPU出问题,这个确实难以接受,但是事实就是如此。

找个ARM9试下,就行了,不能再拍砖了。

使用特权

评论回复
34
john_lee| | 2012-10-9 18:25 | 只看该作者

使用特权

评论回复
35
john_lee| | 2012-10-9 18:30 | 只看该作者
arm9没有ssat指令。

使用特权

评论回复
36
IT工作者|  楼主 | 2012-10-9 18:47 | 只看该作者
我的错,ARM9是没有SSAT指令,

ARM11肯定有,一试便知,赶快揭穿我所有的错误。

写再多文字已经没有意义了。

使用特权

评论回复
37
IT工作者|  楼主 | 2012-10-9 19:03 | 只看该作者
谢谢香版,我也知道CORTEX-M3没有QADD/QSUB/QDAAA/QDSUB

但是SSAT是确实有的,结果确实这样,震精了

使用特权

评论回复
38
Ryanhsiung| | 2012-10-9 20:21 | 只看该作者
学习

使用特权

评论回复
39
IT工作者|  楼主 | 2012-10-9 21:39 | 只看该作者
再次做了实验,结果令人吐血,确实是逻辑移位以后的值再做饱和。

我的想法是错误的,各位,多多得罪。

这个指令啃爹

使用特权

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

本版积分规则