Je prends une classe de conception de systèmes d'exploitation dans laquelle ils nous ont donné un micro-noyau écrit en C sur lequel nous construisons. Le noyau semble avoir été conçu avec des machines 32 bits en tête et je cours le léopard des neiges. Donc, un ami dans la classe et j'ai essayé de le pirater en adressage 64 bits.Problèmes 64 bits: tentative de copie de la valeur de% rsp dans la variable temp à l'aide de l'assemblage en ligne
Le plus gros problème semble être une ligne de code, où l'assemblage en ligne est utilisé pour copier le pointeur de la pile actuelle dans une variable temporaire utilisé par le distributeur:
#define SET_STACK(s) asm("movl temp,%esp");
Naturellement, le compilateur recrache erreurs à moi parce que %esp
est un registre de 32 bits.
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:32-bit absolute addressing is not supported for x86-64
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:cannot do signed 4 byte relocation
donc je l'ai remplacé avec %rsp
parce qu'il est le registre de pointeur de pile 64 bits (et je pense seulement %sp
fonctionne aussi bien, je l'ai lu quelque part ailleurs ici que le gaz est assez intelligent pour mettre le préfixe à droite). Après avoir remplacé %esp
avec %rsp
, je reçois cette erreur:
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc8TLdjH.s:523:Incorrect register `%sp' used with `l' suffix
Maintenant, je suis un peu à perte parce que je ne suis pas vraiment expérimenté avec l'assembleur. J'ai essayé de remplacer movl
avec mov
, et movq
, mais rien ne semble fonctionner. Ce qui m'amène à croire que peut-être temp
est la mauvaise taille?
Temp est une variable globale, déclarée comme ceci:
void* temp; // temp pointer used in dispatcher
j'ai écrit un programme rapide d'imprimer les tailles des différents types de données, et il semble que void * en x86-64 sont 8 octets , qui devrait être la bonne taille, non?
Quoi qu'il en soit, évidemment, je ne m'attends pas à ce que quelqu'un résolve ce problème pour moi, mais tous les conseils qui pourraient me diriger dans la bonne direction seraient très appréciés!
Merci pour la réponse. J'ai effectivement essayé movq, mais je reçois toujours l'erreur suivante de gcc: /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc7VMqAZ.s:523:32-bit l'adressage absolu n'est pas supporté pour x86-64 /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU++TTI/-Tmp-//cc7VMqAZ.s:523:cannot pas de relocalisation 4 octets signé Pensez-vous que cela signifie que la température est de 4 octets? ne peut pas le déplacer dans% rsp? – Jarsen
@Jarsen - voir edit – Hayman
Je l'ai essayé et cela n'a pas fonctionné, mais m'a demandé s'il me demandait si je voulais dire _temp, donc j'ai supposé que je l'ai fait. Et cela a semblé résoudre le problème: asm ("movq _temp (% rip),% rsp"); Alors merci beaucoup! Ca marche pour l'instant, j'espère que je ne risquerai plus rien de mal par la suite. Juste pour mon propre bénéfice, si vous avez toujours l'URL ou quoi que ce soit où vous avez trouvé cette information, pourriez-vous me le donner? Merci beaucoup. – Jarsen