2010-06-24 13 views
4

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!

Répondre

1

Vous devez utiliser movq pour les mouvements de 64 bits.

Voici un extrait de faire l'ensemble des travaux SSE d'un de mes projets (partie d'un simulateur de train), Les lignes commentées sont asm intel 32 bits, décommentée est 64bit AT & T.

asm(
     //mykda calculation 
     //mov eax, dword ptr [train_traction_ptr] 
     //movaps xmm0, xmmword ptr [eax] //train_traction[i] + forceFront 
     "movq %0, %%rax\n\t" 
     "movaps (%%rax), %%xmm0\n\t" 

     //mov eax, dword ptr [local_fgrr_ptr] 
     //movaps xmm1, xmmword ptr [rax] 
     //addps xmm0, xmm1 
     "movq %1, %%rax\n\t" 
     "movaps (%%rax), %%xmm1\n\t" 
     "addps %%xmm1, %%xmm0\n\t" 

     ...); 

Après Commentaire J'ai regardé plus loin et j'ai trouvé que tout le code OSX 64 bits devait être indépendant de la position.

n'avez pas un Mac à tester, mais

asm ("movq temp(%rip),%rsp"); 

devrait fonctionner. Si ce n'est pas le cas, vous devez utiliser l'adressage PIC approprié pour la température de votre assembleur.

+0

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

+0

@Jarsen - voir edit – Hayman

+1

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

2

La ligne que vous avez montrée ne copie pas la valeur de %esp dans temp - elle fait le contraire (comme l'implique le SET_STACK). AT & La syntaxe T est src, dest. Un simple asm("mov temp, %rsp"); doit compiler.

+0

Euh, bon de savoir que je l'avais à l'envers. Merci. J'ai effectivement essayé mov, et juste essayé à nouveau, mais il me donne encore ceci: /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//ccBKG90T.s:523:32 l'adressage absolu-bit n'est pas supporté pour x86-64 /var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//ccBKG90T.s:523:cannot ne permet pas la relocalisation 4 octets signée Cela signifie-t-il que ne pense pas que temp est la bonne taille pour passer à% rsp? – Jarsen

+0

@Jarsen: Ça sonne comme ça. Cela fonctionne bien pour moi cependant. – caf

+0

... délocalisation signée de 4 octets ... faites-moi quelque chose à propos de l'alignement ... possible? peut-être annuler * temp devrait par quad-aligné (quad je veux dire, 64bit)? ... mais "l'adressage absolu de 32 bits n'est pas supporté pour x86-64" me fait penser que pour une raison quelconque, il considère "temp" comme une adresse absolue de 32 bits (pourquoi devrait-il être ainsi? il ne devrait pas ...) ; intéressant, hélas pas 64b machine à faire des tests – ShinTakezou