Exceptions mappées - PC (Program Counter)

De Appmethod Topics
Aller à : navigation, rechercher

Remonter à Développement d'applications Mac OS X


Les systèmes Mac et Linux utilisent des exceptions mappées - PC (Program Counter), tandis que Windows (Win32) utilise des enregistrements de registre liés sur la pile.

Déroulement des routines assembleur

Les routines assembleur ne peuvent pas intercepter des exceptions. En outre, vous devez faire attention lors de l'appel des routines assembleur, en raison des spécificités du déroulement. Cet aspect est important dans le cas où du code non assembleur appelle du code assembleur, qui à son tour appelle du code non assembleur. Quand une exception est déclenchée, le dérouleur de pile supprime les cadres de pile que l'exception passe. Le processus de déroulement doit rétablir divers registres critiques au fur et à mesure de son exécution. Cela inclut le pointeur de pile et le pointeur de cadre. Certaines choses dans le code assembleur rendent ce processus de déroulement impossible, et vous devez éviter de faire ces choses. Un élément clé est que, si vous modifiez le pointeur de pile par une quantité de variable, le dérouleur n'est pas capable de dérouler le cadre sans aide. Par exemple :

 sub esp, eax

ou

 sub esp, 0xF
 and esp, 0xFFFFFFF0

Les constructions en code assembleur ci-dessus rendent le dérouleur incapable de dérouler la procédure donnée. Afin que le dérouleur soit capable de dérouler une procédure qui inclut des instructions similaires, vous devez inclure un cadre de pile dans votre code :

 push ebp
 mov ebp, esp

La création du cadre de pile doit être les deux premières instructions de votre code. Quand le code assembleur est compilé, cette séquence d'instructions est reconnue par le compilateur, qui génère des informations de déroulement spécialisées pour la routine. Si le cadre n'est pas présent, le compilateur inspecte la routine assembleur entière essayant d'analyser comment le code modifie la pile afin de dérouler les modifications dans le cas où une exception est déclenchée.