Oui, pusha
et popa
sont équivalents, si seulement parce qu'ils poussent/pop tous les registres. Cependant, est-il nécessaire de le faire pour un simple appel d'interruption DOS?
Transfert à un programme d'interruption
...
Comme pour toutes les opérations, faites autant que nécessaire et nothi ng plus. Un appel d'interruption doit préserver les registres - à part ceux qui sont documentés pour changer. Les appels d'état normaux renvoient leur résultat au AX
et peuvent changer les indicateurs, et ne rien changer d'autre. Si une interruption change quelque chose d'autre (ds:dx
, par exemple), cela devrait être indiqué dans sa documentation.
Dans votre code, en utilisant ah=09/int 21
, le seul changement est
Retour: AL = 24h
et ainsi tous les autres registres supposer sans risque "stockés".
Il existe une raison pour laquelle une interruption est conservée autant que possible. Globalement, une interruption (les «vrais», et non l'invocation par l'utilisateur) peut se produire à tout moment pendant que l'autre code est en cours d'exécution.
Il y a aussi une bonne raison pas pour utiliser pusha/popa
sans discrimination. Votre pile a une taille limitée - bien sûr, elle est grande, mais le nombre de routines pouvant être imbriquées le sera également. Et dans les codes 32 et 64 bits, les registres sont également plus grands.
Chaque routine ne doit conserver que les registres qui sont connus pour changer, et en miroir, vous devez seulement enregistrer ceux dont vous aurez besoin plus tard avant que vous appelez une telle routine. Dans l'exemple de code, il n'y en a pas, donc vous pouvez supprimer en toute sécurité tout en poussant et en éclatant.
Prenez garde que 'pusha' et' popa' sont des instructions 80286+. Si vous ciblez une machine 8086 ordinaire, cela ne fonctionnera pas. En fait, certains assembleurs peuvent avoir besoin de la directive '.286' pour les reconnaître comme des instructions valides. –
N'utilise pas le .286 (directive point) considéré comme une mauvaise pratique? –
Je ne peux pas imaginer pourquoi –