J'ai récemment tombé sur un code de compilateur intéressant que je ne comprends pas. Prenez le code suivant:curieux code de compilateur gcc pour x | = 128 quand x est uint8
unsigned char x;
...
x |= 127;
x |= 128;
Pour la première instruction, le compilateur génère:
or eax, 0x7f.
Cependant, pour la deuxième déclaration, il devient:
or eax, 0xffffff80
Il semble que pour valeurs inférieures à 127, des valeurs d'un octet sont utilisées alors qu'après 128 dword sont préférées.
Quelqu'un a-t-il une idée de ce qui se passe? J'ai reproduit ce gcc 6.2 (plus tard je pense).
J'ai essayé de poster sur les listes de diffusion gcc ([email protected] ou [email protected]) mais j'ai seulement eu des échecs de livraison.
Je suppose que c'est juste un artefact de la façon dont votre désassembleur formate les nombres ('0x80' est négatif s'il est interprété comme un nombre signé). –
J'utilise gdb. Voici comment il imprime les valeurs dans la console https://pastebin.com/0A2SXUNU –
J'ai également compilé le code avec -S et j'ai obtenu ceci: https://pastebin.com/g8aSn9iy –