731Fermer733
GodzilLe 28/12/2016 à 11:16
Je suis peut etre fatigué mais

C0ucFz8WEAAnB-r.jpg

E2E - di est initialisé a la valeur de l'argument "fd" ( [bp+fp] )
E38 - On test si di est negatif, si oui c'est invalide -> on quite (EE9)
E3A - On compare di a 16

E3D - Si inferieur on va au code de la fonction (E45)
E3F - On met 0xFFFF (la valeur de E_FS_INVALID) dans ax
E42 - on saute a exit (EE9)

E45 - [Code pas utile pour le probleme courant]
E49 - On compare di a 16

E4C - Si inferieur le file descriptor est valide et on va au reste du code de la fonction (E51)
E4E - on saute a la sortie qui met ax a la valeur de "out of bounds" (EDF)
E51 - [Corps de la fonction]
ED8 - On saute proche de la fin (EE2)
EDF - On met E_FS_OUTOFBOUNDS dans si
EE2 - [Un peu de code inutile pour le probleme courant]
EE7 - On copie si dans ax
EE9 - On nettoie la pile
[...]
EEF - Bye bye!


Maintenant considère le trajet ou fd est supérieur a 16, on va recevoir (dans ax) la valeur 0xFFFF, alors qu'on attends la valeur pour Out of Bounds. Le code supprimé n'a pas d'impact sur le registre DI ou SI

A vrai dire si le code d'origine est bien en C il doit etre un peu alambiqué et masquer le fait que si fd est supérieur a 16, on ne retourne pas la bonne valeur, c'est meme peut etre une "optimisation" du code fait par notre amis le compilateur qui "ha tiens ce code pour retourner invalide la valeur ne peux pas dépasser 16, donc je teste contre 16"

(en gras le code executé reelement pour di > 16, en italique celui quon voudrais qui soit executé)