Was ist die Aufgabe von Push EDX in diesem Beispiel?
Warum hat man hier "PUSH EDX" geschrieben ?
Was ist seine Aufgabe ?
Wenn wir darauf verzichten, was könnten es sein ? Wird der Programm ein Fehler zeigen ?
2 Antworten
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.
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.