Wyliczanie adresu skoku na podstawie opcodu

0

Dobry wieczór.
Chciałbym się dowiedzieć w jaki sposób można pozyskać adres skoku mając opcode instrukcji jmp i na odwrót.
Przykładowo mam taki opcode (jest to call, a nie jmp, ale to chyba nie ma różnicy):
E8 20 ED FF FF
Którego pierwszy bajt znajduje się na adresie:
0041284E
Jak wyliczyć adres tego skoku?

0

A jest jakiś powód czemu przeglądasz tą binarkę hexedytorem a nie jakimś deasemblerem? ;]

3

W przypadku calla e8 (relatywnego) bierzesz te ostatnie 4 bajty i dodajesz do IP. Tutaj mamy FFFFED20, czyli -4832. Dodajesz do IP i otrzymujesz adres. 41284E + 5 - 12E0 = 411573.

0

@Shalom
Zaciekawił mnie temat generowania kodu programu podczas jego działania. :)

@Rev
Dzięki! Adres się zgadza. Skąd ta piątka?

0

Trzeba też wziąć pod uwagę długość obecnej instrukcji.

0

5 dlatego , że instrukcja

CALL

ma 5B. jak nie wierzysz możesz sprawdzić w disasemblując kod

0

Zaciekawił mnie temat generowania kodu programu podczas jego działania.
Kiedyś to robiłem generując kod w asemblerze i odpalając zewnętrzny proces (użyłem bodajże Yasm-a, bo z Nasm-em był chyba jakiś problem).
Nie chciało mi się babrać z opcode'ami skoro ktoś już to zrobił.

Pełen opis opcode'ów znajdziesz na stronach Intela (Intel® 64 and IA-32 Architectures Software Developer Manual) oraz AMD (AMD64 Architecture Programmer’s Manual).

Wersja AMD mi lepiej podchodzi, chociaż jest napisana w bardziej „pompatycznym” stylu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1