is Assembler dead?

0

Mam pytanie: czy jest sens uczyć się assemblera? Umiem już język C# i podstawy C++ (o pascalu nie wspominając ;-) ), i chciałbym wiedzieć czy jest jakikolwiek sens dokładania do tego assemblera -> słyszałem że daje on ogromną kontrolę nad maszyną, ale z drugiej strony wiem że jest wybitnie nieprzenośny. A konkretnie chodzi mi o to czy mogę go użyć w innym projekcie (w jakimś języku wyższego poziomu) do zaprogramowania czegoś nieosiągalnego zwykłymi drogami? :-)

(da się w ogóle napisać coś poważnego w samym asm? Czysty się do czegoś przydaje?)

No to proszę i dziękuje za odpowiedzi [browar]

0

To jest tak, że jeśli chcesz się zajmować programowanie na niskim poziome abstrakcji to asm tu rządzi niepodzielnie.
W asmie są pisane bootloadery (przynajmniej ich Stage 1). Jest też parę OS'ów napisanych stricte w asmie, a nawet kiedyś słyszałem o grze napisanej w asmie (całkowicie), ale to było chyba tylko jako benchmark bo grafika generowana w locie musiała robić z komputera kaloryfer.

0
MSM napisał(a)

Mam pytanie: czy jest sens uczyć się assemblera? Umiem już język C# i podstawy C++ (o pascalu nie wspominając ;-) ), i chciałbym wiedzieć czy jest jakikolwiek sens dokładania do tego assemblera

Ogólnie jeżeli wiesz, że będzie ci potrzebny asembler to jest sens się go uczyć. W więkości wypadków wystarczy ci jednak znajomość jednego języka wysokiego poziomu. Na pewno nie ma sensu się go uczyć tylko po to żeby się uczyć.
Znajmomość samego asemblera to nie wszystko. Samo programowanie w asemblerze wymaga więcej wysiłku niż języki, które znasz. Więc przeszukaj internet i posprawdzaj gdzie się go stosuje i oceń czy chcesz lub będziesz musiał się tym zajmować. Jeżeli nie to nie radze się uczyć. Chyba że potraktujesz to jako wyzwanie ;-) .

0

Warto się nauczyć asemblera chociażby po to, żeby wiedzieć jak wyglądają konstrukcje wyższego poziomu przetłumaczone na kod maszynowy. Pozwoli to potem pisać wydajniejszy kod wysokiego poziomu, gdyż wiesz jak to mniej więcej będzie wyglądało po przetłumaczeniu.

Np: warto się nauczyć jak używać instrukcji SIMD: MMX, SSE. Da to nam jakiś pogląd jakich struktur używać. Dzięki autowektoryzacji (czyli właśnie wykorzystaniu MMX i SSE) możemy tą wiedzę wykorzystać w językach wysokiego poziomu. W ogóle warto przejrzeć różnice w zestawach instrukcji różnych procesorów, żeby wiedzieć jakie operacje można zrobić stricte sprzętowo.

Kiedyś pisano bardzo dużo rzeczy w całości w asemblerze. Np Impulse Tracker, bardzo fajny program do tworzenia muzyki pod DOS, gdzieś czytałem, że ma 3 megabajty kodu źródłowego w czystym asmie. Linux na początku był napisany chyba właśnie w całości w asmie. Obecnie w asmie jest tworzony np: MenuetOS. Był nawet projekt Fresh (IDE), czyli IDE do asemblera, ale upadł. Było tam nawet graficzne tworzenie okienek (tzn można było wyklikać okno myszką).

Asembler jest oczywiście nieprzenośny na inne platformy z tego prostego powodu, że używa się zestawu instrukcji jakiegoś konkretnego procesora, nie ma żadnej abstrakcji w tym polu, więc kodu napisanego na x86 nie odpalimy na PPC. Z kolei przenośność na inne systemy operacyjne jest podobna jak w językach wysokiego poziomu, gdyż może być tak samo zrealizowana. Po prostu wywołania systemowe wyodrębnia się do jakiegoś modułu i sam ten moduł pisze się w innych wersjach na każdy system operacyjny (tak to jest zrobione w każdym języku programowania, nie ma innego sposobu). Asemblerowym przykładem jest sam FASM który jest napisany w asemblerze (jest samokompilowalny) i którego źródła w wersji konsolowej stosują ten schemat: rdzeń programu jest jeden i dołączone są małe moduliki na kilka systemów do obsługi alokacji pamięci, obsługi plików i konsoli.

Dzieiejsze kompilatory są dosyć dobre. Z odrobiną wiedzy jak działa optymalizacja w kompilatorze, programowanie w niskim poziomie abstrakcji staje się mało atrakcyjne. Najlepiej poczytać manuale Agnera Foga: http://www.agner.org/optimize/

0

No to mam teraz "życiowy" problem - uczyć się czy nie ;)

To jest tak, że jeśli chcesz się zajmować programowanie na niskim poziome abstrakcji to asm tu rządzi niepodzielnie.
Raczej nie napiszę całego programu w asm'ie, raczej wstawki obsługujące coś czego twórcy języka wysokopoziomowego nie przewidzieli (jakieś sterowniki ~ coś takiego).

kiedyś słyszałem o grze napisanej w asmie (całkowicie), ale to było chyba tylko jako benchmark bo grafika generowana w locie musiała robić z komputera kaloryfer.
Właściwie to czemu? W końcu asm robi to samo co inne języki tylko bardziej "bezpośrednio", czyż nie?

Samo programowanie w asemblerze wymaga więcej wysiłku niż języki, które znasz.
Zauważyłem, przed dyskusją przygotowałem się podglądając parę programów w asm, i przyznam że te wszystkie MOVy mnie trochę przeraziły ;)

Warto się nauczyć asemblera chociażby po to, żeby wiedzieć jak wyglądają konstrukcje wyższego poziomu przetłumaczone na kod maszynowy. Pozwoli to potem pisać wydajniejszy kod wysokiego poziomu, gdyż wiesz jak to mniej więcej będzie wyglądało po przetłumaczeniu

Czyli znajomość asm pozwoli mi lepiej rozumieć co ten kompilator robi? Ciekawe... :-)

Więc przeszukaj internet i posprawdzaj gdzie się go stosuje

No cóż... dzięki za porady, zastanowie się nad tym :) To wygląda interesująco...

0
MSM napisał(a)
winerfresh napisał(a)

kiedyś słyszałem o grze napisanej w asmie (całkowicie), ale to było chyba tylko jako benchmark bo grafika generowana w locie musiała robić z komputera kaloryfer.

Właściwie to czemu? W końcu asm robi to samo co inne języki tylko bardziej "bezpośrednio", czyż nie?

Tak, ale generowanie grafiki 3D "w locie" nie zależnie w jakim języku będzie wyciskało z kompa siódme poty.

0
donkey7 napisał(a)

Linux na początku był napisany chyba właśnie w całości w asmie.

Zdecydowanie nie.
Linux od początku jest tworzony w C z tylko niewielkimi wstawkami w assemblerze. Możesz ściągnąć Linuksa 0.01 i się przekonasz.

Dąży się do całkowitej eliminacji assemblera nawet kosztem wydajności.
np. Przez długi czas każda z architektur miała własną implementację semaforów w assemblerze. Ostatnio z tego zrezygnowano i teraz kod semaforów jest wspólny (w C).

0

Assemblera można się nauczyć w 2 tygodnie.
Naucz się, zrozumiesz całkowite podstawy programowania niskopoziomowego (czyli również c++), będziesz miał podstawy do re (reverse engineering)... i tyle.
Pisać w tym absolutnie nie warto, a wręcz nie można, bo myślenie asmowo zrobi z ciebie gorszego programistę.
Najwyżej czasami jakaś mała wstawka asm (np. antydebugging).

0

Unix był na początku pisany w asmie i krokiem milowym dla tego systemu było przepisanie go na C :P.
Gry i systemy pisane w assemblerze to tylko sztuka dla sztuki (przynajmniej jeżeli chodzi o PC).
A z asmem warto się zapoznać nawet jeżeli nie napiszesz żadnej linijki w tym języku. Powody podali już poprzednicy.

0

No to chyba się zdecydowałem, strasznie mi się spodobały pochwały jakimi autor artykułu o assemblerze (tak, na 4p) go obrzucał :P
Martwi mnie tylko to:

Pisać w tym absolutnie nie warto, a wręcz nie można, bo myślenie asmowo zrobi z ciebie gorszego programistę.

<- czemu ma to zrobić ze mnie gorszego programistę?

I jeszcze jedno - boje się trochę zniszczyć sobie procesor ;) :/ :-( [diabel]

0
programistavisualbasica napisał(a)

Assemblera można się nauczyć w 2 tygodnie
...
Pisać w tym absolutnie nie warto, a wręcz nie można, bo myślenie asmowo zrobi z ciebie gorszego programistę.

Tak jest jak się ktoś próbuje nauczyć asemblera w dwa tygodnie.
Myślenie asmowo jest trochę innym myśleniem, ale nie nie sądzę, że poznanie asemblera zrobi ci coś złego poza zabraniem odrobiny czasu.

Jednak nie wykluczam iż asembler w niektórych przypadkach może doprowadzić do choroby psychicznej. Wskazane są przerwy w programowaniu. [rotfl]

MSM napisał(a)

I jeszcze jedno - boje się trochę zniszczyć sobie procesor ;) :/ :-( [diabel]

Procesora nie zniszczysz. Nie słyszałem o takim przypadku. No chyba, że asembler doprowadzi cię do takiego stanu, że weźmiesz młotek w rękę. ;-)

0

Na temat assemblera krąży wiele mitów, że jest trudny, dla wybranych (to w sumie stara legenda, dziś mało spotykana), że daje olbrzymią kontrolę... wszystko to bzdury.

Pisanie dla trybu rzeczywistego (bootloadery czy DOS) generalnie nie ma sensu, zdecydowanie lepiej zająć się pisaniem pod tryb rzeczywisty ze stronnicowaniem (każdy sensowny OS), co w gruncie rzeczy do trudnych nie należy. Jest tylko kilka form kodowania instrukcji, co przekłada się na postać argumentów, instrukcji poza SIMD-owymi wcale nie jest tak dużo, głównie używa się i tak kilkunastu ogólnego przeznaczenia... Pisanie normalnego oprogramowania z użyciem zewnętrznych bibliotek naprawdę nie jest niczym trudnym, wiele trudniejsze niż C nie jest... ba, jeżeli o nieszczęsne wskaźniki chodzi to assembler w wielu wypadkach wygrywa. Inna sprawa, że łatwiej błąd popełnić, jego znalezienie do prostych należeć nie musi, przykład z życia: w skomplikowanym algorytmie 'literówka' - ebx zamiast edx, kompiluje się, prawie działa, tylko czasem wynik nie taki.

Assemblera zdecydowanie można się nauczyć w krótkim czasie - to kwestia zapamiętania kilku regułek i zestawu instrukcji. Manualem Intela podeprzeć się można zawsze, zaś klamotów związanych z programowaniem systemowym i tak nie pisze się z pamięci. Poznanie asma jest rzeczywiście korzystne aby zrozumieć jak to wszystko na niskim poziomie funkcjonuje, dać ew. podstawy do RE. To chyba jedyny sposób żeby przekonać się, że w tym co procesor czy oprogramowanie na najniższym poziomie nie ma żadnej magii.

Co do mitu o kontroli nad maszyną i innych podobnych - niemal wszystko da się uzyskać bez użycia grama assemblera, a jeżeli już stosuje się asma to korzystając z podręcznikowych wstawek. Tak samo nie jest prawdą, że do napisania wirusa (tak, malware'u infekującego pliki wykonywalne) potrzebny jest asm...

Od dobrych kilkunastu lat programy użytkownika i tak nie mają bezpośredniego dostępu do maszyny, nie korzysta bezpośrednio z portów czy przerwań sprzętowych. Zresztą ze sterownikami sprawa wygląda w dużej mierze podobnie - nawet tu nie ma beztroskiego grzebania się w sprzęcie, niemal wszystko przez API systemu. Sterowników nie pisze się w asm, używa się C, ew. C++ (chociaż tutaj dochodzi kwestia alokatorów itd.).

Jeżeli można asm opisać w kilku słowach to są to prymitywne klocki lego.

Co do szkodliwości assemblera to jest to w sporym stopniu prawda. Programowanie w asm jest prymitywne i diametralnie różne od pisania w czymkolwiek wyższym, nawet C. Od tego specyficznego sposobu myślenia trudno się uwolnić, zaś jego użycie w wyższych językach jest zwyczajnie katastrofalne w skutkach. Wielokrotnie podawałem przykłady tego, co z kodem robią kompilatory, że kod maszynowy nie jest odzwierciedleniem kodu źródłowego w C/C++/wtf. Asm skłania do pisania pod niskopoziomową reprezentację, utrudnia posługiwanie się sensowną abstrakcją, bardzo silnie utrwala prymitywne do bólu programowanie imperatywne, zmusza do myślenia nad pojedynczymi krokami implementacji, nie nad całościowym rozwiązaniem problemu.

Poza tym asm jest jak BASIC albo Cobol, ryje psychikę, robi dziury w mózgu i zjada koty.

Mimo wszystko warto się tym chwilę pobawić. Proponowałbym potem posiedzieć np. nad Haskellem, może i potem nie napiszesz już ani linii w Haskellu, ale już nigdy nie będziesz w innych językach pisał tak samo jak wcześniej.

Gyn by mi nie wybaczył gdybym nie podlinkował jego videotutoriali - http://re.coldwind.pl/

0

Programista assemblera wylizuje kawałek drogi do czysta, widzi każdy pył.
Programista hlla swoim ferrari wjeżdza tą drogą na szczyt góry, której asmowiec nawet nie zauważył, dla niego to nieskończona ściana.

0

pod linuxa pisze sie w C, bo nie dosc ze ELF jest rozny na roznych wersjach, linux moze dzialac i na mikrofalowce, lodowce, telefonie i czym tam jeszcze chcesz. jak napiszesz program w asmie - nie bedzie dzialal. Natomiast w c, kompilator zainstalowany na takim osie bedzie przystosowany do architektury i skompiluje soft tak, z pojdzie.

Natomiast windows to tylko asm. windows dziala tylko na x86 a nawet ia32e ma wow czyli soft pojdzie.
wyjatkiem sa dllki, niestety.

asm jest potrzebny jak chcesz byc pro, chyba ze nie piszesz pod ponkretna platforme, to wtedy c.
Inaczej siedz w c# i ssij kase od jakiegos frajera, jak dobrze trafisz.

0
asmasmasm napisał(a)

Natomiast windows to tylko asm. windows dziala tylko na x86 a nawet ia32e ma wow czyli soft pojdzie.
wyjatkiem sa dllki, niestety.

Co to za bzdury :o
Windows był na alphę, mips, powerpc, jest na itanium, x86, x86-64.
Rekompilacja jest tak samo możliwa - system (oprócz sterowników sprzętowych, oczywiście) jest całkowicie przenośny.
Po prostu ms nie widzi rynku poza tymi trzema platformami.

A dllki można spokojnie pisać w czystym asmie. Nawet łatwiej niż w c/c++... (samo tworzenie tablicy funkcji).

0

Czyli znajomość asm pozwoli mi lepiej rozumieć co ten kompilator robi? Ciekawe...

Tzn chodziło mi o to, że możesz sobie zreversować różne wersje swojego kodu w HLL i zobaczyć jak to będzie wyglądało w asemblerze. Dzięki temu można iść na kompromis pod względem wydajności i czytelności kodu w HLL.

Moim zdaniem powinno się zrezygnować w ogóle z jako takiego asemblera i przechodzić w kierunku Javy i jej podobnych. Dzięki temu można by z łatwością zrywać z niewydajnymi zestawami i kodowaniami instrukcji, np, flagowy przykład, x86 i pochodne.

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