Pourquoi ne pouvez-vous pas définir le pointeur d'instruction directement?
L'article de Wikipedia sur x86 assemblée dit que "le registre IP ne peut pas être consulté par le programmeur directement."
Directement les moyens avec des instructions comme mov et add.
Pourquoi pas? Quelle est la raison derrière cela? Quelles sont les restrictions techniques?
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas y accéder directement, car il n'y a pas légitime de cas d'utilisation. Avoir n'importe quelle instruction changement
eip
ferait direction de la prévision est très difficile, et probablement ouvrir toute une série de problèmes de sécurité.Vous pouvez modifier
eip
à l'aide dejmp
call
ouret
. Vous juste ne pouvez pas lire ou écrireeip
en utilisant les opérations normales deRéglage
eip
à un registre est aussi simple quejmp eax
. Vous pouvez également fairepush eax; ret
qui pousse la valeur deeax
de la pile et retourne ensuite (c'est à dire les pop et les sauts). La troisième option estcall eax
qui fait un appel à l'adresse indiquée dans eax.Lecture peut être faite comme ceci:
Qui aurait été une conception possible pour x86. BRAS exposer son compteur de programme pour lire/écrire comme R15. Qui est inhabituel, cependant.
Il permet une très compact, la fonction de prologue et de l'épilogue, avec la possibilité de pousser ou de la pop registres multiples avec une seule instruction:
push {r5, lr}
sur entrée, etpop {r5, pc}
de retour. (Popping de la valeur enregistrée de la le lien s'inscrire dans le compteur de programme).Cependant, il fait de la haute perf /out-of-order BRAS implémentations moins pratique, et a été abandonné pour AArch64.
Donc c'est possible, mais utilise l'un des registres. 32-bit ARM a 16 entier registres (y compris les PC), donc un numéro de registre de 4 bits pour coder dans les BRAS du code machine. Un autre registre est presque toujours ligoté que le pointeur de pile, de sorte que le BRAS est de 14 à usage général de type entier registres. (LR peut être sauvegardée sur la pile, de sorte qu'il peut être utilisé comme un usage général s'inscrire à l'intérieur de la fonction des organes).
Plus moderne x86 est hérité du 8086. Il a été conçu avec assez compacte, de longueur variable codage d'instruction, et à seulement 8 registres, ne nécessitant que 3 bits pour chaque src et dst inscrire dans le code machine.
À l'origine, 8086, ils n'étaient pas très polyvalent, et SP-adressage relatif, ce n'est pas possible en mode 16 bits, donc, essentiellement, 2 registres (SP et BP) sont liés pour la pile de trucs. Cela ne laisse que 6 un peu registres, et en avoir un d'eux soit le PC au lieu de serait une énorme réduction de registres disponibles, augmentant considérablement la quantité de déversement/de recharge typique code.
AMD64 ajouté r8-r15, et le RIP-relative mode d'adressage.
lea rsi, [rip+whatever]
et RIP-par rapport à des modes d'adressage pour l'accès direct à des données statiques et constantes, est tout ce dont vous avez besoin pour efficace, indépendant de la position du code. Indirect JMP instructions sont totalement suffisant pour l'écriture, RIP.Il n'y a pas vraiment quelque chose à gagner en permettant à l'arbitraire des instructions à être utilisé pour lire ou écrire le PC, puisque vous pouvez toujours faire la même chose avec un entier registre et indirecte sauter. Il serait presque pur à la baisse pour x86-64 R15 être la même chose que RIP, en particulier pour l'architecture de la performance comme un compilateur cible. (Écrite à la main asm truc bizarre était déjà très rare qu'une niche chose en 2000, lorsque AMD64 a été conçu.)
Donc AMD64 est vraiment la première fois que x86 pourrait, de manière plausible, ont acquis un exposé compteur de programme comme le BRAS, mais il y avait beaucoup de bonnes raisons de ne pas le faire.
Je pense qu'ils voulaient dire que le registre IP ne peut pas être directement accessibles de la même manière les autres registres sont accessibles. Les programmeurs peuvent certainement écrire à la propriété intellectuelle, par exemple par l'émission d'une instruction de saut.
jmp
va définir leEIP
registre.ce code permet de définir eip pour 00401000:
et pour l'obtention d'
EIP