NASM to czysty montaż, ale MASM to Montaż na wysokim poziomie? [zamknięte]

Uczę się montażu, motywacji, potrafiąc Inżynieria wsteczna . Staram się znaleźć asemblera, od którego powinienem zacząć, aby potem znaleźć tutoriale i zacząć pisać jakiś Assembler.

Dowiedziałem się, że MASM ma wiele wbudowanych konstrukcji, więc będę ich używał głównie zamiast kodowania, co będę musiał zrobić, jeśli wybiorę NASM.

Moje pytanie brzmi:. to prawda? Jeśli tak, to Jaki asembler proponujesz do nauki asemblera z odwrotnej perspektywa inżyniera i kilka dobrych samouczków do tego.

Również, jeśli masz inne sugestie dotyczące cofania? Alternatywne podejście czy coś?

P. S: przeczytałem tu wiele artykułów i pytań, ale nadal jestem zdezorientowany.

Author: questions, 2012-03-30

1 answers

Moim zaleceniem czysto z "inżynierii odwrotnej" jest zrozumienie, w jaki sposób kompilator tłumaczy pojęcia wysokiego poziomu na instrukcje języka asemblacji. Zrozumienie, w jaki sposób alokacja rejestrów odbywa się w różnych kompilatorach i w jaki sposób różne optymalizacje zaciemniają reprezentację wysokiego poziomu zagnieżdżonych pętli (et.al.) jest ważniejsza niż możliwość napisania jednego konkretnego dialektu wejścia assembly.

Najlepiej zacząć od pliki pośrednie języka assembly z kodu źródłowego, który piszesz (zobacz to pytanie, aby uzyskać więcej informacji ). Następnie możesz zmienić źródło i zobaczyć, jak wpływa to na pliki pośrednie. Innym miejscem do rozpoczęcia jest użycie interaktywnego disassemblera , takiego jak IDA Pro .

W rzeczywistości pisanie programów języka asemblera i nauka składni NASM, MASM, gas, z as jest najłatwiejszą częścią i nie ma znaczenia, którego się nauczysz. Są bardzo podobnie, ponieważ składnia języka źródłowego jest bardzo podstawowa. Jeśli planujesz nauczyć się demontować i zrozumieć, co robi program, wtedy całkowicie zignorowałbym asemblery makr, ponieważ makra całkowicie znikają podczas tłumaczenia i nie zobaczysz ich, patrząc na wyjście disassemblera.

Diatribe on Learning Assembly

Nauka języka asemblera różni się od nauki języka programowania wyższego poziomu. Jest mniej konstrukcje składniowe jeśli ignorujesz asemblery makr. Problem polega na tym, że każdy łańcuch kompilatora ma nieco inną reprezentację, więc musisz skoncentrować się na takich pojęciach, jak Obsługiwane tryby adresów, ograniczenia rejestracji itp. Nie są one częścią języka jako takiego, ponieważ są dyktowane przez sprzęt.

PodejĹ "cie, ktĂłre przyjÄ ... Ĺ' em (czÄ ™ Ĺ "ciowo poniewaĺľ Uniwersytet mnie do tego zmusiĺ'), to zbadanie i zrozumienie samego sprzÄ ™ tu (np. # rejestrăłw, wielkoĹ " Ä ‡ rejestrăłw, rodzaj obsługiwanych instrukcji branżowych itp.) i nieco więcej pojęć akademickich, takich jak przerwania i używanie bitowej manipulacji do dopasowania liczb całkowitych przed rozpoczęciem pisania programów języka asemblacji. Jest to znacznie dłuższa trasa, ale skutkuje bogatym zrozumieniem montażu i pisania wysokowydajnych programów.

Interesujące jest to, że w czasie, który spędziłem na nauce montażu i budowy kompilatora (co jest ze sobą nierozerwalnie związane), napisałem bardzo niewiele programy montażowe. Częściej muszę pisać małe fragmenty wbudowanego montażu tu i ówdzie (np. ustawianie rejestrów indeksów, gdy runtime loader tego nie robił). Spędziłem ogromną ilość czasu na analizowaniu zrzutów awaryjnych z lokalizacji pamięci, pliku mapy Ładowarki i list wyjściowych asemblera. Mogę szczerze powiedzieć, że składnia każdego asemblera jest diametralnie inna, jak również to, co różne Kompilatory zrobią, aby zmylić intencję do szybkiego lub małego kodu.

Nauka jak pisać programy montażowe było najmniej wartościową częścią procesu edukacji. Konieczne było zrozumienie, w jaki sposób źródło jest tłumaczone na bity i bajty, które komputer wykonuje, ale tak naprawdę nie było to to, czego naprawdę potrzebowałem do inżynierii wstecznej z surowego pliku binarnego (disassembler -> assembly listing -> best guess of high level intent) lub zrzutu pamięci. Robię więcej z tych ostatnich, ale wymagania pracy są takie same.

  1. naprawdę musisz zrozumieć, co ograniczenia architektury są.
  2. musisz znać bardzo podstawową składnię asemblera - jak są wskazywane tryby adresowe, jak są wskazywane rejestry, jaka jest kolejność argumentów dla move
  3. jakie przekształcenia wykonuje kompilator, aby przejść z if (a > 0) do mov.b r0,d0 ... bnz $L

Zacznij od zapoznania się z architekturą komputera( np. przeczytaj coś z Andrew Tanenbaum), a następnie jak system operacyjny ładuje i uruchamia program (Levine ' s Linkers & Loaders), następnie skompiluj proste programy w C / C++ i spójrz na listę języków asemblowania.

 9
Author: D.Shawley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:07