3 Stimmen

Das Deklarieren eines festen Längenpolsterstrings im GNU-Assembler

Ich versuche, einige Daten in einer strukturierten Größe im Assembler zu definieren. Ich möchte Zeichendaten mit einer festen Anzahl von Bytes deklarieren, die mit einem String initialisiert sind. In C wäre es:

char my_string[32] = "hello";

Das sind 32 Bytes und werden mit so vielen Nullen am Ende aufgefüllt, wie nötig sind.

Was wäre das Äquivalent im Assembler? Ich weiß, dass ich die Länge meines Strings manuell zählen und die erforderliche Anzahl von Nullbytes deklarieren kann, um auf 32 zu polstern, z. B.:

my_string:
  .asciz "hello"
  .zero 26

Aber wie kann ich das machen, wenn der String dynamisch definiert wird, z. B. aus einer externen Definition oder einem Include?

6voto

Matthew Slattery Punkte 43123

Ich denke, ich würde hierfür ein Makro mit lokalen Bezeichnungen verwenden. Zum Beispiel:

    .macro padded_string string, max
1:
    .ascii "\string"
2:
    .iflt \max - (2b - 1b)
    .error "String ist zu lang"
    .endif

    .ifgt \max - (2b - 1b)
    .zero \max - (2b - 1b)
    .endif

    .endm

...verwendet wie folgt:

my_string:
    padded_string "Hallo Welt!", 16

(Dieses Verhalten ähnelt dem von C und fügt das abschließende 0 nicht hinzu, wenn der String genau max Zeichen lang ist. Um sicherzustellen, dass der String terminiert ist, ändern Sie einfach .ascii zu .asciz.)

3voto

Jens Björnhager Punkte 5524

Was du beschreibst, ist immer noch eine statische Zeichenfolge, wenn auch unbekannter Größe. Du kannst die Größe der Zeichenfolge erhalten, indem du die Adresse der Zeichenfolge vom aktuellen Datenzeiger ($) subtrahierst. Subtrahiere die Größe der Zeichenfolge von der maximalen Größe und du weißt, wie viele Nullen hinzugefügt werden müssen:

my_string:
    .ascii "Geheimnisvolle Zeichenfolge"
    .zero (maxsize-($-my_string)) ;maxsize-actualsize

was vereinfacht werden kann zu:

my_string:
    .ascii "Geheimnisvolle Zeichenfolge"
    .zero (maxsize+my_string-$)

0voto

Craig McQueen Punkte 39286

Ich hätte Jens' Antwort bevorzugt, in der z.B. .zero (32+my_string-$) verwendet wird, jedoch erhielt ich die Fehlermeldung Fehler: .space gibt keinen absoluten Wert an.

Dies scheint eine machbare Alternative zu sein:

my_string:
  .asciz "Geheimnisvolle Zeichenkette"
  .org my_string + 32
andere_sachen:
  ...

Ich weiß nicht, ob garantiert ist, dass alle 32 Bytes auf bestimmte Werte gesetzt werden (d.h. dass nachfolgende Bytes mit Nullen gefüllt sind), aber die Verwendung von .asciz stellt sicher, dass die Zeichenkette mit Nullen terminiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X