W uproszczeniu:
połączeń adres
To będzie apelować zaktualizowany licznik programu (co wskazuje z instrukcją po call
) na stosie, a następnie przejść do adres wskazanym (mogą być stosowane tryby adresowania).
ret
Ta instrukcja wewnętrznie wyskakuje i adres ze stosu i skacze do niej. To jest ładnie dopasowany do call
, dzięki czemu może wrócić do instrukcji po poprzednim call
.
jmp adres
To po prostu przeskakuje do podanej adres (z pewnymi tryby adresowania). W ogóle nic nie robi ze stosem.
Tak, można też to zrobić:
push address
ret
Która pojawi się i skakać do adres że został zepchnięty na stosie w sposób opisany powyżej. Jest to sprytny sposób na pośredni skok w mikroprocesorze, który nie obsługuje pośrednich trybów adresowania w instrukcjach skoku.
Kolejność:
push address
jmp someplace
po prostu przeskoczyć do gdzieś i nie wpływa na stos lub użyj adres że został zepchnięty na stos. Jeśli adres jest instrukcją po jmp
, jest to mniej więcej odpowiednik call someplace
.
Dla zestawów instrukcji, które nie obsługują pośredni skok adresowania, widziałem to miły mały obejście:
push address
ret
jaki przeskoczy na cokolwiek address
jest.
Nietypowe odmiany tych znaków są często używane, gdy autor chce ukryć prawdziwą funkcjonalność kodu (np. Złośliwe oprogramowanie komercyjne "chronione przed kopiowaniem"). –
Czy 'ret' w zasadzie nie jest' pop i przeskocz pośrednio do wyskakującego adresu '? –
@JohnHascall tak, to jest ... "duh" z mojej strony. : p Myślałem "nie", "nie", "nie". :) – lurker