1 0x080095B4 8928 LDRH r0,[r5,#0x08] //将r5+0x08结果对应地址的数据高半字清零,然后加载到r0,r5+0x08的结果
对应数组元素的地址
2 0x080095B6 1E40 SUBS r0,r0,#1 //r0减1,并保存
3 0x080095B8 17C3 ASRS r3,r0,#31 //将r0的值算术右移31位,然后传给r3
4 0x080095BA EB007393 ADD r3,r0,r3,LSR #30 //r3逻辑右移30位,然后和r0相加,然后结果传给r3
5 0x080095BE F0230303 BIC r3,r3,#0x03 //清除r3的低2位,并保存
6 0x080095C2 1AC0 SUBS r0,r0,r3 //r0减r3,并保存
7 0x080095C4 8128 STRH r0,[r5,#0x08] //将r0的值传给r5+0x08结果对应的地址
以上对应减量的汇编代码,//后面是我自己添加的注释,方便不熟悉的朋友看,最左边的数字是我加的,方便下面的说明;
实际程序中,变量是Parameters[Numb_Of_Gas_Unit] ,为了方便,还以A代替,对应的地址为 r5+ 0x08的结果,
详细过程看下面:
当A = 0时, A=0xffff时,
执行指令1后,r0 =0; r0=0x0000ffff;
执行指令2后,r0 =0xffffffff; r0 =0x0000fffe;
执行指令3后,r3 =0xffffffff; r3 =0;
执行指令4后,r3 =0x02; r3 =0x0000fffe;
执行指令5后,r3 = 0; r3 =0x0000fffc;
执行指令6后,r0 =0xffffffff; r3 =0x02;
执行指令7后,A=0xffff; A =0x02;
从以上分析,当r0 = 0,减一后r0 = 0xffffffff,然后算术右移31位结果还是0xffffffff,问题应该就出在这儿,估计真的是按有符号数计算了。在写这个之前,有坛友说按有符号数计算了,没明白,以为是把A当有符号数了,实际是把4当有符号数了,在ayb_ice的两次提醒下并进行测试,才明白。自认为基础还行,看来差得不少,把4写成4u后计算结果正确,汇编代码附上,其他人引以为戒。
0x080095B4 7A28 LDRB r0,[r5,#0x08]
0x080095B6 1E40 SUBS r0,r0,#1
0x080095B8 F0000003 AND r0,r0,#0x03
0x080095BC 8128 STRH r0,[r5,#0x08] |