2017-03-05 4 views
0

Angenommen, es eine Struktur isteines Zeigers in einer Struktur versetzt ist, und wie der Wert in der Montage bekommen

struct info{ 
    struct stat information; 
    char * filename 
} 

Dann habe ich den Offset von Dateinamen Zeiger

size_t fOffset = offsetof(struct info, filename); 

jetzt, was die foffset ist ?

Und in der SPARC-Assembly möchte ich die tatsächliche Zeichenfolge im Dateinamen abrufen. Das habe ich bisher geschrieben. Der Parameter ist ein Zeiger von Informationen struct

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

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

ldub [%l2], %o0 

Ich dachte, jetzt% o0 wird die Zeichenfolge speichern, aber es eindeutig nicht. Jemand hilft mir?

+1

Der Offset hängt von der Definition von 'struct stat' und der Implementierung und/oder Konfiguration des zu verwendenden Compilers ab. – MikeCAT

+0

Ich glaube nicht, dass diese Frage bezieht sich auf struct stat, es ist über den char Zeiger Mitglied in der Struktur info – faker

+1

Der Wert von 'fOffset' wird wahrscheinlich' sizeof (struct stat) '- möglicherweise plus einige Polsterung, aber wahrscheinlich nicht. Sie können diese Größe in Assembly nicht bestimmen; Sie müssen die richtige Größe wissen - oder verwenden Sie C und nicht die Montage. –

Antwort

0

Sie haben die fOffset-Deklaration richtig vorgenommen, so dass sie den Offset des Dateinamens in der Struktur enthält. Ich denke auch, dass Ihre Assembly korrekt ist, obwohl ich nicht sicher bin, was Sie mit "% o2 wird die Zeichenfolge speichern" meinen. Am Ende des Codes ist% l2 ein Zeiger auf die Zeichenfolge und% o2 enthält das erste Byte der Zeichenfolge. Dein Code sieht also richtig aus.

Einige Ideen, was schief gehen kann:

  • da Dateinamen ein Zeiger ist, müssen Sie es etwas initialisieren, wahrscheinlich mit malloc. Wenn Sie dies nicht tun, erhalten Sie wahrscheinlich einen Fehler in der ldub-Anweisung, da der Zeiger ungültig ist
  • Ich vermute, Sie verwenden ein 32-Bit-Benutzerland aus Ihrem Code, aber für den Fall, dass Sie ausgeführt werden ein 64-Bit-Userland, all diese "ld" Anweisungen benötigen "ldx"

auch sein beachten Sie, dass Sie die Reihenfolge vereinfachen kann:

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

eine Anweisung, um nur:

ld [%i0+%l1], %l2 
Verwandte Themen