切换到宽版
  • 2161阅读
  • 23回复

[STM]Cortex-M3 的指令机制真实有毒 [复制链接]

上一主题 下一主题
离线la45088d1
 

发帖
957
M币
782
专家
8
粉丝
28
CPU的常用标志位:N,Z,C,V。
N:负数置位;
Z:零置位;
C:进位置位,借位复位;
V:溢出置位。

好,都不难理解,加减更新这四个标志位行为都可以接受。而某些逻辑指令就开始鬼畜了,比如说ORR,AND,EOR,BIC,好吧,手册说会更新NZC,但是你想,逻辑运算怎么也不会进位呀,结果是当格式为:OPCode   Rd,Rn,Rm 时,标志位更新正常,根据结果更新NZ,但C不更新。 但是,但是,当格式为
OPCode  Rd,Rn,#0x80000000时,开始鬼畜,NZ正常更新,C无论结果如何,强制C=1;但是立即数不等于0x80000000时,C无条件清零。


然后就是复合指令,一种特殊用法,比如ORRS   R0,R1,LSLR#0x01 ,这个标志位的更新更难以把握,你可能以为ORR加了{S}后缀就是ORR更新标志位,但其实不是的,是LSR先更新标志位,然后LSR再更新标志位。

[ 此帖被la45088d1在2018-07-08 21:10重新编辑 ]
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线la45088d1

发帖
957
M币
782
专家
8
粉丝
28
只看该作者 1楼 发表于: 07-08
附上PM0056文件内容:



本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线zhuls

发帖
1497
M币
3615
专家
3
粉丝
27
只看该作者 2楼 发表于: 07-08
习惯了就好
离线la45088d1

发帖
957
M币
782
专家
8
粉丝
28
只看该作者 3楼 发表于: 07-08
之前我一直认为是结果的31位为1才置C=1的,但是之后的测试表示不是这样的。
请仔细看一下这几幅图,反映了ORR的行为:(无论结果如何,只要立即数是0x80000000,标志位C=1,立即数不是[backcolor= transparent]0x80000000,标志位C=0
然后又发现,如果没有立即数,比如ORRS  R0,R1这样的形式,则C被忽略,无论结果如何,都不更新。这些图没有反映。







本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线la45088d1

发帖
957
M币
782
专家
8
粉丝
28
只看该作者 4楼 发表于: 07-08


然后就是复合指令ORRS   R3,R1,LSR#0x0n的行为:
(首先分析,对于LSR,是LSRS  R1,#0x0n的形式,根据移出的最后一位更新C。而对于ORR,是ORRS   R3,R1形式,这种纯寄存器的操作C被忽略。
然后你看见的是C根据LSR更新,而N,Z则被这两条指令更新为相同结果所以看不出什么,相当于操作覆盖了。但是你执行这样的指令就看出来了:
ADDS   R3,R1,R0,LSL#0x1F,条件是R0=0x01,R1=0x80000000.仔细分析发现首先左移31位,最后移出的是0,所以C=0.然后R1=0x80000000,与R0相加,然后发生进位,ADD将标志位更新为C=1,覆盖之前的操作。而Z,N,若只有LSLS   R0,#0x1F的话是Z=0,N=1的,但是整条指令下来是Z=1,N=0。因为执行了ADD后,R3实际为0.再次证实了,符合指令先根据移位更新标志位,再根前面的指令结果再次更新标志位。)






本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线la45088d1

发帖
957
M币
782
专家
8
粉丝
28
只看该作者 5楼 发表于: 07-08
补充对ADDS   R3,R1,R0,LSL#0x1F 的测试与楼上进行参照以证明两条指令先后更新标志位的猜想:







本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线la45088d1

发帖
957
M币
782
专家
8
粉丝
28
只看该作者 6楼 发表于: 07-08
全文完,对于使用高级语言开发的人来说毫无用处。但是你想摸摸ASM,可能有点用。反正这些结论ARM官方数据手册未必那么详细,手上没有不知道,ST的编程手册甚至没有说明。 只有试过才知道。
时光荏苒 轮回不止 不变的是您的容颜
图森图破 按目安轨 难忘的是您的黑框
游历八方 谈笑风生 羡慕的是您的自信
福祸如一 生死相随 坚守的是您的信念

苟利国家生死以 岂因祸福避趋之 垂死病中惊坐起 谈笑风生又一年--- The real fans
离线小茅

发帖
2262
M币
1579
专家
6
粉丝
35
只看该作者 7楼 发表于: 07-08
玩汇编还是51比较好,例程比较多,msp430ware里面也有一些msp430的汇编例程
数码之家终于回归正常的论坛模式了
离线apple1999

发帖
141
M币
82
专家
1
粉丝
7
只看该作者 8楼 发表于: 07-09
我没看太懂,有下面几个链接你看一下,有可能有帮助吧。
http://www.keil.com/support/man/docs/armasm/armasm_dom1361289884183.htm
这个是Keil的文档,里面有说
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
离线南天音乐

发帖
170
M币
313
专家
5
粉丝
5
只看该作者 9楼 发表于: 07-09
佩服楼主钻研的精神,赞一个。不过楼主既然那么热衷于芯片架构和底层汇编系统,应该以开发一套自主RTOS为目标吧