tok jak w temacie chodzi mi oto czy asembler jest trudnym językiem i jaką moc posiada tzn. co można za pomącą niego zrobić?
Poczytaj tu:
z tego co wyczytałem to asembler jest trudny do nauki,trudno się w nim pisze ale za to programy mniej zajmują są szybsze, dobrze zrozumiałem a to prawda, że inne języki programowania były napisane w asemblerze? tak gdzieś przeczytałem
Asembler to jeden z łatwiejszych języków, opiera się na kilku banalnych regułach. Największą trudnością jest czas programisty. Bo trudno zebrać ochotę na pisanie poezji w asm, gdy ten sam problem możesz rozwiązać wielokrotnie szybciej opierając się na językach wysokiego poziomu. Asembler głównie przydaje się do niskopoziomowych zadań, takich jak np. inżynieria wsteczna.
Z punktu widzenia składni asembler jest dość trywialny. Ale z punktu widzenia "biznesowego" trudno w nim pisać duże aplikacje. Programy w asmie niekoniecznie są szybsze niz te w C (bo kompilatory tego jezyka są tak dopracowane że generują bardzo porządny kod asemblera), ale faktycznie mogą mniej zajmować.
Języki programowania nie były pisane w asemblerze. Język określa gramatyka. Kompilatory innych języków mogły być pisane w asmie i pewnie tak było kiedy innych języków po prostu nie było.
Asembler pod np Win32 jest wg mnie jednym z najprostszych języków. Wadą asemblera jest mała czytelność kodu (w przypadku skomplikowanych obliczeń: tragiczna) i brak natywnych (tzn napisanych w asemblerze) bibliotek. Dlatego ludzie uważają go za coś bardzo trudnego.
Asembler jest praktycznie 1:1 odzwierciedleniem kodu maszynowego (tzn tego kodu zjadanego przez CPU), więc tłumaczenie kodu maszynowego na asembler i w drugą stronę jest proste i prawie jednoznaczne (prawie, bo niektóre operacje można zakodować na kilka sposobów, ale to już jest nadmiarowość kodowania instrukcji procesora). Każdy statycznie skompilowany kod da się więc zapisać jako kod asemblerowy. Debuggery pokazują kod asemblerowy przy kodzie, do którego nie ma źródeł (wysokiego poziomu). Mając duże umiejętności możesz więc zmieniać działanie programów (w ograniczonym stopniu) lub wyłuskiwać z nich algorytmy (ale raczej krótkie).
Programy są z reguły mniejsze, bo masz zwykle 100 %ową kontrolę nad plikiem wynikowym i tym co on zawiera. Nie ma takich przypadków jak np w Delphi czy C/ C++, że władowywuje ci do pliku pół megabajta jakichś standardowych funkcji, których nawet nie używasz.
Szybkość zależy od talentu programisty. Języki wysokiego poziomu są optymalizowane przez kompilator, więc tutaj szybkość zależy od jakości optymalizacji wbudowanych w procesor. Asembler jest tłumaczony wprost, więc tutaj optymalizuje się ręcznie. Aby uzyskać max wydajność musisz więc poznać architekturę procesora, na który optymalizujesz, np tutaj są opisy: http://agner.org/optimize/ Wadą asemblera jest konieczność optymalizacji na każdy procesor z osobna ręcznie, podczas gdy przy kompilacji np C++ wystarczy zmienić flagi kompilacji. Przewagą asemblera jest słabe wsparcie kompilatorów dla instrukcji SIMD czy też innych mało używanych instrukcji (np prefetching danych). Możesz więc uzyskać kilkukrotny wzrost wydajności bez ogromnie zaawansowanej optymalizacji, ale tylko poprzez rozsądne korzystanie z rozszerzeń procesora.
Ostatnia sprawa to taka, że oczywiście można łączyć asemblera z jezykami wyższego poziomu. Na upartego nawet z Javą poprzez interfejsy JNI, ale bardziej powszechne jest łączenie z C++. Kod asemblerowy można kompilować do plików .o czy .obj (zależnie co tam kompilator wyrzuca), a potem łączyć linkerem z plikami powstałymi z kodu C++owego. W C++ można też używać wstawek asemblerowych.
Dzięki temu można np mieć 99 % programu w C++ i 1 % programu w asmie. Zwykle jest tak, że to właśnie mały ułamek kodu jest najczęściej wykonywany - np pętle o wielu iteracjach.
- Pewne rzeczy można napisać wyłącznie w ASM.
- Porównanie szybkości Asemblera do jakiegokolwiek innego języka jest kompletnie pozbawione sensu po prostu... Tak naprawdę przecież porównuje się szybkość
kompilatora
a nie języka - to jak kompilator sobie radzi z generowaniem niskopoziomowego kodu dla pewnych wysokopoziomowych konstrukcji. - Masz pełną kontrolę nad tym co program robi.
- "Asembler" to nie jest jeden język, każdy sprzęt zdolny do wykonywania obliczeń na swój asembler. O ile komputery zdominował obecnie Intel, takie komórki na przykład mają swoje własne asemblery.
Wadą asemblera jest konieczność optymalizacji na każdy procesor z osobna ręcznie
Nie konieczność
tylko możliwość
.
Kod asemblerowy można kompilować do plików .o czy .obj
NASM obsługuje: bin ith srec aout aoutb coff elf32 elf64 as86 obj win32 win64 rdf ieee macho32 macho64 dbg elf macho win
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.