我参与了安全关键型软件的开发、达到了 RTCA/DO - 178C A 级
编译器:
TI-CGT-ARM_18.14.LTS
选项:
-mv7R4
--code_state=32
-Ooff
--opt_for_speed=0
-c99
考虑以下 C 源代码:
#define true 1.
#define false 0
typedef unsigned char BOOL;
静态 BOOL Test_A (const BOOL 参数 A);
int main (void){
(空) Test_A (真);
返回(0);
}
静态 BOOL 测试_A (常量 BOOL 参数 A)
{
bool 结果=!ParamA;
返回(结果);
}
使用逻辑否定运算符的源代码行的反汇编如下:
21 BOOL 结果=!ParamA;
00002894: E5DD1000 ldrb R1、[R13]
00002898: E3A0C000 MOV R12、#0
0000289c: E3510000 CMP R1、#0
000028a0: E3A00000 mov r0、#0
000028a4: 0A000000 beq $C$L1
000028a8: E3A00001 mov r0、#1
$C$L1:
000028ac: E3500000 CMP r0、#0
000028b0: 1A000000 bne $C$L2
000028b4: E3A0C001 MOV R12、#1
$C$L2:
000028b8: E5CDC001 strb R12、[R13、#1]
即使优化已关闭(-Ooff)、上述实现似乎不必要地复杂、尤其是寄存器 r0的使用。
问题:
为什么实现使用"附加"寄存器(r0)和两个标签而不是下面示例中详述的单个标签实现、是否有合理的理由?
00002894: E5DD0000 ldrb r0、[R13]
00002898: E3A0C001 MOV R12、#1
0000289c: E3500000 CMP r0、#0
000028a0: 0A000000 beq $C$L1
000028a4: E3A0C000 MOV R12、#0
$C$L1:
000028a8: E5CDC001 strb R12、[R13、#1]