Non, c'est une valeur immédiate. pushq
pousse une valeur sur la pile, qui peut être un registre, mais vous trouverez qu'ils sont désignés par des opérandes comme %rbx
.
Le $0x1a
est une valeur immédiate - vous pouvez le dire aussi par la longueur de cette instruction (cinq octets, de x+6
à x+10
). L'instruction pushq
est capable de pousser un registre, un contenu de mémoire (64 bits) ou une valeur immédiate de 32 bits (signe étendu à 64 bits).
Dans ce cas, les cinq octets sont l'opcode 0x68
avec la valeur de 32 bits à pousser. Si vous deviez examiner la mémoire, cela ressemblerait probablement à 0x68 0x1a 0x00 0x00 0x00
.
Et ne vous laissez pas berner par ce code, ce n'est pas le "vrai" appel read
du tout. Il s'agit d'un stub utilisé pour corriger les références au moment de l'exécution où les sections de code peuvent être partagées entre les processeurs, même à différentes adresses de base. Le PLT est un stub par processus à faible encombrement qui saute au code partagé réel la première fois, en se corrigeant dans le processus, de manière à y sauter directement dans le futur. Voir here pour une explication de ce processus.
Donc '$ 0x1a' est en effet un registre,'% rbx' est spécifique? – cpuer
Non, '$ 0x1a' n'est pas un registre, c'est une valeur immédiate de' la' hexadécimal (décimal 26) l'indicateur de fin de fichier pour Windows et ses prédécesseurs. – paxdiablo
Donc je peux imaginer qu'il y a d'autres appels similaires, que ce soit finalement le même appel système, mais avec un paramètre différent comme '$ 0x1a'? – cpuer