2016-04-26 3 views
0

Ich habe zwei Zeilen Code.Schieben mov oder lea zu stack

leal 12(%ebp), %ecx 
pushl %ecx 
call func 

und

movl 12(%ebp), %edx 
leal (%edx), %ecx 
pushl %ecx 
call func 

Wo ich eine C-Funktion func(&argument) haben. Die erste Zeile funktioniert, die andere nicht. Kann mir jemand sagen warum?

+0

'Leal (% EDX) ist% ecx' entspricht' movl% edx,% ecx' und so Ihren zweiten Code entspricht 'Push 12 (% EBP)' das ist es, den Wert drückt. – Jester

Antwort

1

Da lea eine Shift-and-Add-Anweisung ist, aber mov (mit einem Speicherquelloperanden) ist eine Last, so der zweite Block tut func(argument). Offensichtlich funktioniert das nicht, wenn func(&argument) korrekt ist.

Das insn Referenzhandbuch (Links im Tag Wiki) dokumentiert, welche Anweisungen tun. nicht die Adresse

+0

Aber alles, was ich tue, ist, einen Wert an eine neue Adresse zu verschieben und die geladene effektive Adresse der neuen Adresse auf den Stapel zu schieben. Warum ist das nicht das Gleiche? In beiden Fällen verwende ich 'lea' für einen Wert in einer Adresse und drücke ihn zum Stack. – Andreas

+0

@Andreas: Einzelschritt in einem Debugger und betrachten Sie genau die Werte in den Registern. 'lea (% edx),% ecx' macht die Last nicht rückgängig, sie behandelt den Wert, den Sie als Zeiger geladen haben. –