Wie benutze ich einen buffer in einem Montage-Verfahren?
So, ich verstehe die Allgemeine abstrakte Konzept eines Puffers: Es ist eine Zuordnung im Speicher hält Daten, bevor es verarbeitet wird. Ich bin versucht, um ein Hausaufgaben problem, die verlangt von mir, das schreiben einer ASCII-Zeichenkette in einen Puffer innerhalb einer Prozedur. Also, ich verstehe, dass ich soll, um eine Adresse von einem array an die Prozedur beim Aufruf, zum Beispiel...
main PROC
mov EAX, packed ; pass a packed decimal to EAX
mov ESI, OFFSET ascArray ; pass the offset of an empty array to ESI
call PackedToAsc ; call the function
Also die Funktion soll return 'ein Zeiger auf einen Puffer mit den ASCII-dezimal-string.' Ich bin wahrscheinlich dumm, aber ich bin mir nicht ganz klar, was genau ein Puffer ist in diesem Fall. Ist es ein array? Muss ich es erklären, die als solche in der .data-Abschnitt? Wie erkläre ich den Zeiger auf den ASCII-string innerhalb der Prozedur? Was gemeint ist, durch einen Puffer in diesem Zusammenhang? Mehr praktisch, ich brauche Zugriff auf den Puffer, der die Daten gelegt wird, wenn die Prozedur beendet, und ich bin mir nicht sicher, wie das zu tun. Sorry, wenn ich mich nicht deutlich genug hier... lassen Sie mich wissen, wie kann ich klären, die Frage stellen.
BEARBEITEN
-- ich bin in x86, und ich bin mit MASM.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt, x86, dies hängt davon ab, ob Sie den Puffer beginnt mit Daten oder nicht. Es hängt auch davon ab, wenn Ihr Puffer variabler Größe.
Nehmen den Fall, und Sie wissen, dass Sie Ihren Puffer nie über, sagen wir, 20 bytes, Sie kann es erklären, die im data-Abschnitt (NASM-syntax):
In der data-Abschnitt deklariert 20
0
bytes, können Sie jetzt verwenden. Wenn Sie nicht brauchen, zu initialisieren mit den Daten, die Sie verwenden .bss-Abschnitt (NASM-syntax):Sagt, NASM zu reservieren 20 bytes.
Wenn die Größe des Puffers ist variabel, jedoch, Dinge sind nicht so einfach. Sie haben, um dynamisch Speicher von Ihrem Betriebssystem, und das ist sehr OS-abhängig. Sie haben grundsätzlich 2 Möglichkeiten:
malloc
: Das kann leichter oder schwerer, je nach Plattform Aufrufkonventionen. Es ist eine vernünftige Referenz hiermalloc
. Sie beinhalten normalerweise das hinzufügen von eine andere Seite des Speichers, um Ihre Prozess-und Vermietung, verwalten Sie es selber. Dies ist, was malloc funktioniert intern und ist die einzige option, wenn Sie nicht verwenden können, die C-Bibliothek.sub esp, ecx
/and esp, -16
. Es ist die beste option für scratch-Puffer für die lokale Anwendung, oder für die Weitergabe an andere Funktionen.Ich verwende diese Methode für get char Puffer und Vergleichen Sie mit anderen string
Ich hoffe, dass Ihnen helfen,
Ja, ein Puffer ist einfach ein array, welches in der Montage ist eine Abfolge von bytes.
Haben Sie 3 wichtigsten Optionen für die Zuordnung der es, genau wie in C:
statischen Speicher: wie C
static char buf[100];
Indem ein
:
zwischen der Bezeichnung und derdb
macht es nur ein schlichtes label, wie NASM, nicht eine MASM - "variable" mit einer impliziten Operanden-Größe.dynamic storage:
call malloc
, oder rufen Sie eine OS-Funktion direkt wiemmap
oderVirtualAlloc
. Können Sie die Rückgabe ein pointer aus der Funktion, die ihm zugeteilt.automatische Speicherung (auf dem stack): wie ein C lokale variable.
Freigegeben ist automatisch, wenn die Zuordnung-Funktion gibt. Sehr Billig und einfach, verwenden Sie diese für den scratch-Puffer, es sei denn, Sie wissen, die Sie benötigen, um mehrere Megabyte.
Die einfachste Art, um mit viel Puffer ist zu akzeptieren, einen Zeiger auf einen bereits zugewiesenen Puffer übergeben wird, und geben Sie Ihrem Anrufer die Wahl, was Sie Puffer zu übergeben.
Beispielsweise eine Funktion, die uppercases ASCII-Buchstaben konnte nur einen src-und dst-Zeiger. Wenn Sie möchten, es zu betreiben, in-place, können Sie einfach die gleichen Zeiger für Eingabe und Ausgabe, wenn es geschrieben ist, das zu unterstützen. Es muss nicht darum kümmern, Speicher-management, es ist einfach verkehrt zwischen zwei Puffer.
Einer Funktion wie C
strdup
macht eine neue Kopie einer Zeichenfolge, und das macht nur Sinn, mit dynamischem Speicher. Kopieren Sie die Zeichenfolge in einen statischen Puffer und Rückkehr, die nicht gut funktionieren würde, denn es gibt nur eine Instanz, die statische Puffer. Der nächste Aufruf überschreibt den alten Inhalt.Zuweisung ein Puffer auf dem stack:
Variable-size-buffer auf dem stack ist kein problem; Sie müssen nur einen Weg, um aufzuräumen den Stapel anschließend. Macht ein stack-frame mit EBP /RBP ist eine einfache Möglichkeit, das zu tun. Betrachten Sie das folgende Beispiel-Funktion reserviert einen Puffer so groß wie benötigt, und verwendet Sie, um zu halten die Ausgabe von einem string-reverse Funktion, so dass es passieren kann es zu einer
print
Funktion. Sie können sehen,welche Compiler in diesem Fall zu tun.Dies ist, was Sie tun könnten, mit der hand, wenn
string_reverse
braucht keine 16-byte-stack-alignment und es nicht clobber seinen stack arg. (ABI /Aufruf-Konvention nicht garantieren, entweder von diesen Dingen, also nehmen wir die Vorteile der speziellen Kenntnisse der Funktion, die wir aufrufen zu vereinfachenprint_reversed
.)Dies ist, wie die meisten C-Compiler implementieren
alloca
oder C99, variable-length-arrays.