wie Prozeduraufrufe arbeiten in assembler?
Ich habe gerade angefangen zu basteln mit ASM und ich bin mir nicht sicher, ob mein Verständnis der Prozedur-Aufrufe ist korrekt.
sagen irgendwann in den code-es ist ein Prozedur-Aufruf
call dword ptr[123]
wird und das Verfahren nur aus einem Befehl,, ret:
ret 0004
was wäre die Wirkung dieser Prozedur-Aufruf, und wo wäre der Rückgabewert gespeichert werden? Ich habe irgendwo gelesen, dass ein return-Wert von 2 bytes gespeichert in AXT, aber wenn ich die ersetzen das Verfahren call-by -
mov AX, 0004
(zusammen mit den notwendigen NOPs für) stürzt das Programm ab.
Du musst angemeldet sein, um einen Kommentar abzugeben.
in x86-assembler die parameter der
ret
Anweisung bedeutet:RET immediate
(Zitat aus Die Intel® 64 und IA-32 Architectures Software Developer ' s Manuals Vol 2B)
So, wenn Sie Typ:
Du erzählst die CPU zurück zu der Anweisung unmittelbar nach der
call
und pop 4 bytes vom stack. Das ist großartig, wenn Sie geschoben 4 bytes auf den stack vor dem Aufruf.Beachten Sie, dass dies hat nichts zu tun mit der return-Wert. In der Tat, ein Verfahren, das in der Montage hat keine Möglichkeit festzulegen, dass ein Wert ist ein zurück Wert. Dies alles geschieht durch Konvention. Die meisten Compiler, die ich kenne, verwenden
EAX
zu halten ist der return-Wert, aber das ist nur wahr, weil die aufrufen Funktion wird erwarten, dass das Ergebnis da ist.Also Ihre Berufung-code wäre:
und Ihre Funktion liefert den Wert 4 wäre:
CALL
auf dem Stapel abgelegt.Es hängt alles von der Aufruf-Konvention verwendet wird. Ich werde nicht wiederholen, die Wikipedia-Artikel hier, Lesen Sie einfach die definition.
In der C-Aufrufkonvention, zum Beispiel, ist der Rückgabewert wäre in EAX/AX/AL. Ihre single instruction nicht: Es ist eine void-Funktion, die rund 4 bytes Parameter (möglicherweise eine einzige int), die nichts tut. Wie es der angerufene die Pflicht zu reinigen, bis der stack in diesem Aufruf-Konvention ignorieren zu tun, und ersetzen Sie den Anruf mit einem "mov ax' funktioniert nicht.
Auch ich vermute, Sie können basteln mit 32-bit-Versammlung beim Lesen eines 16-bit-Dokument. Es ist nicht ein großes problem, aber Sie sollten sich der Unterschiede bewusst sein.
wir zusätzlich Rückgang der ESP, wenn wir immer weiter getrieben hatte, Argumente im stack vor dem Aufruf der Prozedur.
Wenn es geschoben Argumente, die Ihr Programm abstürzt, weil Sie nicht pop Sie. Die Rückkehr offset für die aktuelle Prozedur wird falsch sein, da es einen Wert aus einem der geschoben Argumente als offset.
Ich glaube nicht, dass der return-Wert gespeichert ist, in das register AX