смотреть выделенное
for (char * cur = (char *)Buffer;cur < (char *)(Buffer+bufferSize); cur++)
{
if (instr){
...
}
} else {
0000000180004F93 jmp FindMemStringSize+16Ch (180004FBCh)
if ((*cur >= ' ') && (*cur <= '¦')){
0000000180004F95 mov rax,qword ptr [cur]
0000000180004F9A movsx eax,byte ptr [rax]
0000000180004F9D cmp eax,20h
0000000180004FA0 jl FindMemStringSize+16Ch (180004FBCh)
0000000180004FA2 mov rax,qword ptr [cur]
0000000180004FA7 movsx eax,byte ptr [rax]
0000000180004FAA cmp eax,0FFFFFFA6h
0000000180004FAD jg FindMemStringSize+16Ch (180004FBCh)
size = 1;
0000000180004FAF mov dword ptr [size],1
instr = true;
0000000180004FB7 mov byte ptr [rsp+20h],1
}
}
}
откуда он взял 0FFFFFFA6h???
C>>откуда он взял 0FFFFFFA6h???
K13>знаковое 8-битное значение развернуто до int.
просто дополнение:
http://www.intel.com/Assets/PDF/manual/325383.pdf
MOVSX, стр 802. Move word to doubleword, with sign-extension.
P.S. часто новичок считает что скорее компилятор ошибётся чем он сам (не конечно иногда компилятор ошибается, я например видел такой баг в VS2010 + SSE — но это очень очень редко). Например часто в надежде исправить bug-case, пересобирают проект по десять раз и т.п.
Здравствуйте, Caracrist, Вы писали:
...
C>откуда он взял 0FFFFFFA6h???
Это ещё не баг.
Компилятор может уточнить, то одно и тоже число никогда не может быть
одновременно больше 32 и меньше -90
и при оптимизации выкинет и проверку и последующие присваивания size = 1; instr = true;
И ищи потом, почему это произошло.