Студия 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
Кто не прав компилятор или Я?
Как ещё можно докопаться до истины? — почему ОНО работает во втором варианте если код один и тот же?