Was ist die Aufgabe von Push EDX in diesem Beispiel?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ergänzung zu oben:

PUSH speichert den Inhalt des angegebenen Reigsters auf dem Stack. Das Gegenstück POP am Ende holt es wieder vom Stack und speichert es ins EDX Register zurück.

Das das zum Sichern des Inhaltes von EDX dient, damit die Funktion den Wert nicht ändert, und warum das nötig ist steht oben.

Wenn man es weglässt (man muss dann auch das POP weglassen, sonst funktioniert das RET nicht, weil das dann den falschen Wert vom Stack liest) ändert die Funktion den Inhalt von EDX, d.h. das ist (wenn es keinen Überlauf gibt) immer 0.

Das braucht man normalerweise nur, wenn die Funktion den Wert von EDX verändert, um sicherzustellen, dass ein Aufruf der Funktion keine unerwünschten Konsequenzen hat.

Das scheint hier aber nicht der Fall zu sein. Es werden nur EAX und ECX verändert. Ich verstehe daher auch nicht, wieso das hier gemacht wird. Ich bin der Meinung man kann hier PUSH/POP EDX weglassen.

iQa1x  03.03.2023, 08:54

Nein, kann man nicht weglassen. MUL speichert sein Ergebnis als 64 bit Zahl in EAX und EDX. Offensichtlich geht man in dem Code davon aus, dass 32 bit als Ergebnis reichen und nimmt nur den EAX-Teil, dann wäre aber EDX immer 0 nach der Funktion, wenn es keinen Überlauf gibt. Daher sichert man das.

4
Spiderpig42  03.03.2023, 09:18
@iQa1x

Stimmt. Ich hatte ganz vergessen, dass MUL auch EDX verwendet.

1