2017-11-14 2 views
0

ich im folgenden Code suchen:Montag: Weiter nach Aufruf

cmp edx edx 
jle loc_40234 
call some_func 
add eax, eax 

Was ich versuche zu verstehen, wie kann ich sogar die vierte Zeile erreichen, da es kein loc (kann nicht sein, gesprungen) und es folgt sofort ein Funktionsaufruf. Ich meine, der Anruf verhält sich wie ein Sprung, oder?

Edit: ok Ich verstehe die Grundidee. Ich hätte spezifizieren sollen: Dieser Code ist Teil von some_func (es ist eine Schleife, die ich sammle).

+0

Wenn Code in 'some_func'' some_func' aufruft, dann bildet dies ein logisches Muster, das als "Rekursion" bekannt ist. Der CPU ist das egal, sie kennt keine func/procedure-Konzepte, sie springt einfach wie angewiesen um Anweisungen, und wenn die Rekursion zu tief ist, wird der Stack von den gespeicherten Rücksprungadressen überlaufen (eine weitere wird von jeder hinzugefügt) Ruf "). – Ped7g

+0

Ok, danke nochmal! –

Antwort

5

cmp edx,edx wird edx mit sich selbst vergleichen, so wird es immer "gleich" sein, und jle wird immer genommen.

Die call wird nicht von diesem Codepfad erreicht hat (wenn es überhaupt ausgeführt wird, würde ein anderer Code direkt an der call Anweisung oder am jle Anweisung mit Flags gesetzt bereits springen als „größer“ Zustand zu bewerten) .

Die call ist technisch wie jmp, mit kleinen zusätzlichen Twist. Es wird gedrückt, um die Adresse des nächsten Befehls zu stapeln (add), also wird der Code bei irgendwie diese Adresse vom Stapel verwenden, um dorthin zu springen (am häufigsten enden die Funktionen mit ret Befehl, der genau das tut, springt oben auf Stapelwert und springt Wenn der Stapelinhalt nicht beschädigt ist und der Stapelzeiger korrekt ist, wird die add erreicht.

Natürlich ist es unmöglich zu sagen, ohne some_func Code zu überprüfen, wenn es zu diesem add zurückkehren wird.