我有一個問題,其中2個不同的編譯器(GCC和IAR)從不同大小的變量中刪除我的掩碼。爲什麼C編譯器會丟棄我的&0xFF掩碼?
我有以下代碼:
uint8_t Value2;
uint16_t WriteOffset;
bool Fail;
void test(void)
{
uint8_t buff[100];
uint16_t r;
for(r=0;r<Value2+1;r++)
{
if(buff[r]!=(WriteOffset+r)&0xFF)
{
Fail=true;
}
}
}
的如果失敗(進入{}塊)時buff[r]
== 0和WriteOffset+r
== 0x100的。
GCC輸出以下組件:
movzwl -0xc(%ebp),%eax ; Load 'r'->EAX
mov -0x70(%ebp,%eax,1),%al ; Load 'buff[r]'->AL
movzbl %al,%edx ; Move AL to (unsigned int)EDX
mov 0x4b19e0,%ax ; Load 'WriteOffset'->AX
movzwl %ax,%ecx ; Move AX to (unsigned int)ECX
movzwl -0xc(%ebp),%eax ; Load 'r'->EAX
lea (%ecx,%eax,1),%eax ; 'WriteOffset' + 'r'->EAX
cmp %eax,%edx ; (unsigned int)'WriteOffset+r' == (unsigned int)'buff[r]'
je 0x445e28 <Test+1254> ; If == skip {} block
我的問題是爲什麼編譯下降我&0xFF
從IF(我已經固定鑄造的問題,但我還是不明白爲什麼它下跌它在第一個地方)?
你在編譯什麼優化級別?總是重要的,特別是在添加裝配時。 – Joe 2012-02-16 22:09:39
繼續學習C :) :) – 2012-02-16 22:23:42