C源代码编译后,对照汇编,发现问题,不知该如何解决
原码:
if(g_CtrlData.errTb >= 20)
{//200ms
g_CtrlData.errTb = 20;
gp_RamCtoM->errNum = DEF_ERR_TB;
}
对应汇编:
91 if(g_CtrlData.errTb >= 20)
102a9d: 761F0260 MOVW DP, #0x260
102a9f: 921F MOV AL, @0x1f
102aa0: 5214 CMPB AL, #0x14
93 g_CtrlData.errTb = 20;
102aa1: 56B7141F MOVB @0x1f, #0x14, HIS
94 gp_RamCtoM->errNum = DEF_ERR_TB;
102aa3: 761F0238 MOVW DP, #0x238
102aa5: 8A0E MOVL XAR4, @0xe
102aa6: 56B712A0 MOVB @AR0, #0x12, HIS
102aa8: 56B70194 MOVB *+XAR4[AR0], #0x01, HIS
问题在于CMPB比较指令之后,少了SB判断标志并跳转的指令,导致不管if的条件是否成立,都继续执行{}中的代码了,如果比较值大于256,编译后生成的是CMP指令,之后肯定会有SB跳转指令,程序则运行正常.
现在找不到解决方法,求助高手帮忙
Forrest:
虽然不管if是否成立都会运行这几句汇编,但并不会进行赋值操作,因为MOVB后面有一个HIS的条件意思是只有在Higher Or Same的情况下该指令才执行。
C源代码编译后,对照汇编,发现问题,不知该如何解决
原码:
if(g_CtrlData.errTb >= 20)
{//200ms
g_CtrlData.errTb = 20;
gp_RamCtoM->errNum = DEF_ERR_TB;
}
对应汇编:
91 if(g_CtrlData.errTb >= 20)
102a9d: 761F0260 MOVW DP, #0x260
102a9f: 921F MOV AL, @0x1f
102aa0: 5214 CMPB AL, #0x14
93 g_CtrlData.errTb = 20;
102aa1: 56B7141F MOVB @0x1f, #0x14, HIS
94 gp_RamCtoM->errNum = DEF_ERR_TB;
102aa3: 761F0238 MOVW DP, #0x238
102aa5: 8A0E MOVL XAR4, @0xe
102aa6: 56B712A0 MOVB @AR0, #0x12, HIS
102aa8: 56B70194 MOVB *+XAR4[AR0], #0x01, HIS
问题在于CMPB比较指令之后,少了SB判断标志并跳转的指令,导致不管if的条件是否成立,都继续执行{}中的代码了,如果比较值大于256,编译后生成的是CMP指令,之后肯定会有SB跳转指令,程序则运行正常.
现在找不到解决方法,求助高手帮忙
user718275:
回复 Forrest:
可能是没有赋值,但运行结果是不对的,按我那样修改之后,运行结果是对的.
好像是其它操作的执行了的了