Czytam kod emulatora i odpowiedziałem na coś naprawdę dziwnego:
switch (reg){
case 'eax':
/* and so on*/
}
Jak to jest możliwe? Myślałem, że możesz tylko switch
na typach całkowitych. Czy ma miejsce jakieś sztuczki makro?
int
, więc jest to legalne. Jednak wartość stałej wieloznakowej jest zdefiniowana w ramach implementacji, więc kod może nie działać zgodnie z oczekiwaniami na innym kompilatorze. Na przykład, eax
może być 0x65
, 0x656178
, 0x65617800
, 0x786165
, 0x6165
, lub coś innego.
'eax' != 'ebx'
Oczywiście pod warunkiem , że zawodzi tylko jeden lub dwa z twoich przykładów. Chociaż może być gdzieś jakiś kod, który w efekcie zakłada *(int*)("eax") == 'eax'
, a zatem zawodzi większość twoich przykładów.
'eax'
może porównać równa się 'ebx'
lub do 'ax'
, a instrukcja switch nie zadziała zgodnie z zamierzeniami.
'eax'
i wylicza stałą wartość całkowitą