Für meine erste Frage, nehmen wir an, wir die folgende Zeile von Code unter .data haben:Was bedeutet die Syntax, um ein Array zu deklarieren und Funktionen aufzurufen?
"theSINTArray BYTE 256 dup(?)".
Ich weiß, dass dieser Code ein Array erstellt, in dem jedes Element ein BYTE sein muss, aber was sind die 256 und dup (?) dort für?
Ich weiß, dass der folgende Code den Typ, die Länge und den Offset/die Adresse des SINTArray auf den Stack verschiebt, aber was ich gerne wissen würde ist, ob es möglich ist, sie vom Stapel zu holen und innerhalb eines Unterprogramms zu verwenden . Diese
main PROC push TYPE theSINTArray push LENGTHOF theSINTArray push OFFSET theSINTArray call testParameters exit main ENDP
ist ein bisschen eine langweilige Frage, so dass ich im Voraus entschuldigen, aber ich einfach nicht verstehen, warum ein großer Teil der Leitungen in dem Codebeispiel unten erforderlich sind. Angenommen, ich habe die Zeile "prompt BYTE" Bitte geben Sie einen Wert ein: ", 0" in der .data-Abschnitt, was ist der Zweck jeder Zeile des Codes unten? Anmerkung: WriteString und ReadString sind Unterroutinen, die in Irvines Bibliothek definiert sind, die ich verwende.
testOutput PROC push edx push ecx mov edx,offset prompt call WriteString pop ecx pop edx call ReadString ret testOutput ENDP
-2
A
Antwort
4
was sind die 256 und dup (?) Da?
Lesen Sie die assembler's manual. TL; DR: behält sich 256 nicht initialisierten Bytes
wenn es möglich ist, sie aus dem Stapel abzurufen und nutzen sie in einem Unterprogramm
Natürlich ist es möglich, Argumentübergabe dumm wäre, wenn die callee konnte nicht auf die Argumente zugreifen;) Sie adressieren sie relativ zu esp
(dem Stapelzeiger) oder, nachdem Sie es als Rahmenzeiger eingerichtet haben, ebp
. Beispiele: [esp+4]
oder [ebp+8]
.
was ist der Zweck jeder Zeile des Codes unter
testOutput PROC ; begin testOutput procedure
push edx ; save edx on stack
push ecx ; save ecx on stack
mov edx,offset prompt ; load edx with address of prompt
; presumably argument to WriteString
call WriteString ; invoke WriteString procedure
pop ecx ; restore ecx saved above
; in case WriteString modified it
pop edx ; restore edx saved above (we have modified it)
call ReadString ; invoke ReadString procedure
ret ; return from subroutine
testOutput ENDP ; end of procedure
Hofnarr, Ihre Antwort verbessert definitiv mein Verständnis der Codebeispiele, aber ich habe zwei weitere Fragen haben. Für das erste Codebeispiel, wenn Sie "Reserve" sagen, meinen Sie die Anzahl der Indizes im Array festlegen? Also "256 dup (?)" Macht es so, dass das SINTArray 256 Indizes hat? Was passiert auch, wenn das Fragezeichen neben dup durch ein anderes Zeichen wie eine Zahl ersetzt wird? – Proto
Mit anderen Worten, es reserviert ein 256-Byte-Array, das nicht auf einen bestimmten Wert initialisiert wird, der Ihnen wichtig ist. Wenn Sie sich kümmern, können Sie diesen Wert natürlich anstelle des '?' Geben. – Jester
Oh, jetzt verstehe ich, dass der Wert innerhalb der Klammern verwendet wird, um den Wert zu initialisieren, der in jedem Byte gespeichert ist. Danke für deine Hilfe, Jester. – Proto