"Забавный" баг компилятора
От: nen777w  
Дата: 04.05.10 00:38
Оценка: 1 (1)
Студия 2005 — Debug.

#define GET_BYTE(a) ((vp_byte)(a))
#define OPERATOR_LENGHT 3

struct arch {
 .....
 vp_ulong ip;
};

//Здесь получаем правильное значение
vp_ubyte bbbb = GET_BYTE(bytecode[arch.ip+OPERATOR_LENGHT]);
0049A25F  mov         eax,dword ptr [arch] 
0049A262  mov         ecx,dword ptr [eax+0F8h] 
0049A268  mov         edx,dword ptr [bytecode] 
0049A26B  mov         al,byte ptr [edx+ecx+3] 
0049A26F  mov         byte ptr [bbbb],al 

//здесь то же самое - неправильное
arch.ip = GET_BYTE(bytecode[arch.ip+OPERATOR_LENGHT]); 
0049A275  mov         eax,dword ptr [arch] 
0049A278  mov         ecx,dword ptr [eax+0F8h] 
0049A27E  mov         edx,dword ptr [bytecode] 
0049A281  movsx       eax,byte ptr [edx+ecx+3] 
0049A286  mov         ecx,dword ptr [arch] 
0049A289  mov         dword ptr [ecx+0F8h],eax



Исправляет положение ХЗ полчему... но вот так работает правильно!
Как говориться найдите два отличия.


arch.ip = (vp_ubyte)GET_BYTE((bytecode[(arch.ip+OPERATOR_LENGHT)])); 
0049A275  mov         eax,dword ptr [arch] 
0049A278  mov         ecx,dword ptr [eax+0F8h] 
0049A27E  mov         edx,dword ptr [bytecode] 
0049A281  movzx       eax,byte ptr [edx+ecx+3] 
0049A286  mov         ecx,dword ptr [arch] 
0049A289  mov         dword ptr [ecx+0F8h],eax



Если по шагам:
1-й вариант который работает не правильно:

0049A25F  mov         eax,dword ptr [arch]      //eax = 4095928
0049A262  mov         ecx,dword ptr [eax+0F8h]  //ecx = 174
0049A268  mov         edx,dword ptr [bytecode]  //edx = 4078352
0049A26B  movsx       eax,byte ptr [edx+ecx+3]  //eax = 4294967186
0049A270  mov         ecx,dword ptr [arch]      //ecx = 4095928
0049A273  mov         dword ptr [ecx+0F8h],eax


2-й правильный

0049A25F  mov         eax,dword ptr [arch]      //eax = 4095928
0049A262  mov         ecx,dword ptr [eax+0F8h]  //ecx = 174
0049A268  mov         edx,dword ptr [bytecode]  //edx = 4078352
0049A26B  movzx       eax,byte ptr [edx+ecx+3]  //eax = 146
0049A270  mov         ecx,dword ptr [arch]      //ecx = 4095928
0049A273  mov         dword ptr [ecx+0F8h],eax




Кто не прав компилятор или Я?
Как ещё можно докопаться до истины? — почему ОНО работает во втором варианте если код один и тот же?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.