通常,不一定特定于该处理器,它与符号扩展和屏蔽有关,需要额外的指令来忠实地实现 C 源代码。16 位或 32 位或 64 位处理器中的有符号 8 位值可能涉及符号扩展的附加指令。32 位处理器上的 8 位添加可能涉及到 0xFF 和使用 0xFF 等的额外指令等。
你应该做一些简单的实验,它需要几次迭代,但我很快就发现了一些不同的东西。
unsigned int fun ( unsigned int a, unsigned int b )
{
return(a+b)<<3;
}
unsigned char bfun ( unsigned char a, unsigned char b )
{
return(a+b)<<3;
}
int sfun ( int a, int b )
{
return(a+b)<<3;
}
char sbfun ( char a, char b )
{
return(a+b)<<3;
}
生产
00000000 <fun>:
0: 0f 5e add r14, r15
2: 0f 5f rla r15
4: 0f 5f rla r15
6: 0f 5f rla r15
8: 30 41 ret
0000000a <bfun>:
a: 4f 5e add.b r14, r15
c: 4f 5f rla.b r15
e: 4f 5f rla.b r15
10: 4f 5f rla.b r15
12: 30 41 ret
00000014 <sfun>:
14: 0f 5e add r14, r15
16: 0f 5f rla r15
18: 0f 5f rla r15
1a: 0f 5f rla r15
1c: 30 41 ret
0000001e <sbfun>:
1e: 8f 11 sxt r15
20: 8e 11 sxt r14
22: 0f 5e add r14, r15
24: 0f 5f rla r15
26: 0f 5f rla r15
28: 0f 5f rla r15
2a: 4f 4f mov.b r15, r15
2c: 30 41 ret
msp430 具有指令的字和字节版本,因此简单的加法或减法不必执行您在使用小于寄存器大小的变量时所期望的剪裁或符号扩展。作为一名程序员,我们可能知道我们只会提供给 sbfun 一些非常小的数字,但编译器不会并且必须忠实地按照编写的代码实现我们的代码,从而在 sfun 和 sbfun 之间生成更多代码。用不同的编译器和处理器做这些实验并不难看到这一点,唯一的诀窍是创建处理器没有简单指令来解决的代码。
另一个例子
unsigned int fun ( unsigned int a, unsigned int b )
{
return(a+b)>>1;
}
unsigned char bfun ( unsigned char a, unsigned char b )
{
return(a+b)>>1;
}
生产
00000000 <fun>:
0: 0f 5e add r14, r15
2: 12 c3 clrc
4: 0f 10 rrc r15
6: 30 41 ret
00000008 <bfun>:
8: 4f 4f mov.b r15, r15
a: 4e 4e mov.b r14, r14
c: 0f 5e add r14, r15
e: 0f 11 rra r15
10: 4f 4f mov.b r15, r15
12: 30 41 ret