2017-03-05 5 views
0

Supposons qu'il ya une structdécalage d'un pointeur dans un struct, et comment obtenir la valeur dans l'assemblage

struct info{ 
    struct stat information; 
    char * filename 
} 

Ensuite, je régler le décalage du pointeur de nom de fichier

size_t fOffset = offsetof(struct info, filename); 

maintenant ce qui est le fOffset ?

Et dans l'assembly SPARC, je veux obtenir la chaîne actuelle dans le nom de fichier. C'est ce que j'ai écrit jusqu'ici. Le paramètre est un pointeur de l'info struct

set fOffset, %l0 
ld [%l0], %l1 

add %i0, %l1, %l2 
ld [%l2], %l2 

ldub [%l2], %o0 

Je pensais que maintenant% o0 stockeront la chaîne, mais il est clair qu'il ne fonctionne pas. Quelqu'un m'aide?

+1

Le décalage dépendra de la définition de 'struct stat' et de l'implémentation et/ou de la configuration du compilateur à utiliser. – MikeCAT

+0

Je ne pense pas que cette question se rapporte à struct stat, il s'agit du membre char pointer dans la structure info – faker

+1

La valeur de fOffset sera probablement 'sizeof (struct stat)' - éventuellement plus un peu de remplissage, mais probablement pas. Vous ne pouvez pas déterminer cette taille dans l'assemblage; vous devez connaître la taille correcte - ou utiliser C et non l'assemblage. –

Répondre

0

Vous avez effectué la déclaration fOffset correctement, elle contiendra donc le décalage du nom de fichier dans la structure. Je pense aussi que votre assemblage est correct, même si je ne suis pas sûr de ce que vous entendez par "% o2 va stocker la chaîne". À la fin de votre code,% l2 est un pointeur sur la chaîne, et% o2 contiendra le premier octet de la chaîne. Donc votre code me semble correct.

Quelques idées de ce qui peut aller mal:

  • depuis le nom est un pointeur, vous devez l'initialiser à quelque chose, probablement avec malloc. Si vous ne le faites pas, alors vous aurez probablement une erreur sur l'instruction ldub car le pointeur sera invalide.
  • Je suppose que vous utilisez un userland 32 bits de votre code, mais au cas où vous courriez un 64 bits userland, toutes les instructions "ld" doivent être "ldx"

Notez également que vous pouvez simplifier la séquence:

add %i0, %l1, %l2 
ld [%l2], %l2 

à une seule instruction:

ld [%i0+%l1], %l2