Wie funktioniert len = . - msg?



  • Hallo,

    ich hätte nach meinen vorherigen banalen Fragen noch eine weitere. Und zwar habe ich in einigen Beispiel-Assemblerprogrammen die folgenden Zeilen gesehen:

    .data
    msg:
        .ascii "Hello World\n"
        len = . - msg
    

    Scheinbar erzeugt der Compiler hier die entsprechende Länge des Strings welchen ich dann direkt mit $len verwenden kann. Aber meine Frage ist: wie funktioniert das?

    Ich habe leider keine Informationen gefunden, was Punkt und das Minus machen. Oder ist das einfach eine spezielle Form von strlen() die man sich einfach nur merken muss?

    Vielen Dank!

    (ggf. eine Dokumentation wo das Beschrieben wird, wäre auch nicht schlecht; ich habe auch in der Referenz von AMD nichts dazu gefunden; ich bin mir allerdings unsicher, ob das nicht zu GNU as gehört.)



  • Der Punkt steht für den Abstand in Byte vom Segmentanfang aus. Unter anderen Assemblern wie zum Beispiel TASM benutzt man dafür das $-Zeichen. Die aktuelle Position minus einer Offsetadresse ergibt den Abstand in Byte.



  • Ach so. Also ziehe ich vom Segmentanfang (vermutlich eine Adresse) den String ab und bekomme damit die Differenz, oder?

    Und das Segment fängt bei .data an, oder? Würde das len denn dann funktionieren, wenn ich mehrere habe?

    Das ist alles sehr abstrakt, aber sehr interessant! 😃

    Danke



  • Na ja, du ziehst die Adresse der Variablen msg, die in dem Fall der des Segmentanfangs entspricht, von der aktuellen Position ab, sodass das, was dazwischen liegt, übrigbleibt. Dies entspricht der Länge des Strings. Was meinst du mit mehrere?



  • OK, dann habe ich das doch richtig verstanden. Danke für die Erklärung!

    Nun ja, so etwas:

    .data
    foo:
        .ascii "Hello"
        len1 = . - foo
    bar:
        .ascii "World"
        len2 = . - bar
    

    Eigentlich müsste das funktionieren, da foo und bar ja verschiedene Adressen haben. Hmmm



  • Ja, das dürfte meines Erachtens auch funktionieren! 🙂


Anmelden zum Antworten