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 switchna 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, eaxmoż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ą