[ASM] Perspektywy...

0

Mam pytanie do osób programujących w Assemblerze, o zastosowanie praktyczne tego języka.
Uściślijmy;
Nie potrafię w nim programować, chociaż zawsze chciałem.
Nie rozpoczynam tego wątku dla udowodnienia wyższości ktoregoś języka.
Zastanawiam się tylko nad szybkoscią tworzenia aplikacji w tymże, i gdzie on jest wykorzystywany komercyjnie, poza pisaniem sterowników.
Nie chce też aby ktos mi udowadniał, że mam calkowitę kontrole nad tym co robie.
Chodzi mi o wymiar praktyczny, oderwany od samego kodowania,czy po prostu jest zapotrzebowanie natego typu programistów.

P.S. Nie szukam języka którego mam sie nauczyć aby zarabiać kase, pytam bo tak mnie ostatnio naszło

0

hmm z asmem daleko nie zajedziesz, w chwili obecnej to tylko dodatek, ale potezny dodatek...

0

Chociaż Polska to kraj Wielkich Programistów Delphi (przejrzyj oferty pracy... no może teraz to J2EE i .NET hehe :D ), to na pewno znajomość programowania w assemblerze może być pomocna (nawet nie tyle pod konkretny procesor ale samo podejście od strony niskopoziomowego kodu). Jednak nie łudź się, że uda ci się ewentualnie pisać duże programy tylko w asm. Z drugiej strony zawsze jakiś sterownik/procesor może się trafić do oprogramowania :) i to niżej niż w Javie :>

0

No nie zamierzam pisać projektów w ASM, ale tak ciekawość mnie dopadła, bo patrze ile ludzi szuka pomocy dotyczącej Assemblera, czyli mozna wnioskować, że są to kolejne roczniki informatyki które muszą zaliczyć przedmiot na studiach.
U mnie język programowania determinuje szef w firmie także nie planuje przerzucania się na razie... No chyba że z VB.NET na C#.NET, ale to bez znaczenia.
Z drugiej strony, wierze, że ma on jakieś wykorzystanie poza nauką...

0

Jeśli chodzi o asemblera to jest tak:

Jeśli programujesz sprzętowo (np.: mikrokomputery weźmy na to rodziny 80x51), to robisz to przede wszystkim w asm51, bo asembler to tak na prawdę opis działania sprzętu. Warto uczyć się asemblera, bo można zrozumieć istotę działania procesora i zakres jego zadań - to tak na prawde czyni kogoś programistą lub elektronikiem. Asm jest tez przydatny do pisania systemów operacyjnych.

Jeśli jednak chcesz pisać programy użytkowe (lub nawet sterowniki), to można to równie dobrze napisać w języku wyższego poziomu i czasem nawet, przy dobrym kompilatorze, otrzymasz kod bardziej uproszczony, niż zrobiłbyś to samemu. Jak potrzebujesz stworzyć software, w którym zależy ci na kontroli każdej z funkcji sprzętowych, to ma to jeszcze sens, ale jak ważna jest dla ciebie istota problemu + ewentualnie interfejs użytkownika, to o asemblerze możesz zapomnieć.

Pisanie użytkowych aplikacji w asemblerze jest bezsensownym nadmiarem pracy.

0

Należy dodać jeszcze, że znajomość Assemblera może znacząco wpłynąć na optymalność kodu pisanego w języku wyższego poziomu.

Bo wiedząc np. że dzielenie jest jedną z najwolniejszych instrukcji a operacje bitowe realizowane są w 1 takcie procka (jak parowalne, to uznać można, że czas = 1/2 taktu ;)) to sprawdzając parzystość liczby w wielkiej pętli zamiast zrobic tak (bardzo popularne)

if (a%2) {}

zrobisz tak

if (a&1) {}
0

Do niedawna nie zauwazalem Asma! Ale na szczescie opamietalem sie. Asm jest na prawde przydatny. Wiadomo, ze nikt nie pisze w nim wielkich programow ale bez niego niektore operacje to masakra. Warto nauczyc sie go choc troszeczke by zrozumiec lepiej istote dzialania komputera - nigdy nie wiadomo czy nie zainteresujesz sie bezpieczenstwem, virusami, overcodingiem itp. Wiekszosc ludzi Asma kojazy z monotonnym wklepywaniem w notatniku: mov ax, 01h itd. lecz sa calkiem mile i funkcjonalne srodowiska graficzne jak: Radasm. Gotowe makra.

0

Fajnie temat trochę się rozruszał, ja sam znam podstawy ASM-a takie jak uczą na studiach Informatycznych - których coprawda nie przeszedłem, ale egzamin z ASM-a zdałem...
Daje on oczywiście podstawy jak to wszystko działa w komputerze itd. tylko ja programując nigdy nie zastanawiałem się nad tym by mieć pełną kontrolę nad sprzętem,po prostu nie było mi to potrzebne, wpływa to pewnie na to, że ważniejsze dla odbiorcy mojego oprogramowania jest interface i możliwość realizowania logiki biznesowej.
Natomiast moim takim niespełnionym <ort>mażeniem </ort>jest bardzo dobre poznanie ASM-a, ale tym to chyba na emeryturze się zajmę...
Dlatego chciałem oderwać Was od kodów i kodowania i spytać jak patrzycie na przydatność ASM-a w aspekcie praktycznym, może ktoś ma np. jakiś przykład, że użył ASM-a bo pasował do tego idealnie a innym języką czegoś brakowało...

0
Marooned napisał(a)

Należy dodać jeszcze, że znajomość Assemblera może znacząco wpłynąć na optymalność kodu pisanego w języku wyższego poziomu.

Oj może, może... :/

Marooned napisał(a)

[...] to sprawdzając parzystość liczby w wielkiej pętli zamiast zrobic tak (bardzo popularne)

if (a%2) {}

zrobisz tak

if (a&1) {}

Widzisz Panczo, to jest argument dla którego NIE należy uczyć się assemblera albo inaczej - nie należy przenosić wiedzy z assemblera do języka wyższego poziomu. Dlaczego? Ano to nie ma żadnego znaczenia dla kompilatora czy zapisze a%2, czy a&1, to w ogóle mnie nie interesuje co on wygeneruje, a wygeneruje identyczny kod, a jeśli nawet nie - to co z tego??? Kompilator optymalizuje(!) kod i to bardziej globalnie niż człowiek. Nie uważajcie mnie za konserwatystę kompilatorowego, ja naprawdę programowałem w asm+rev.eng :>
Z drugiej strony asm przydaję się ale proszę nie uogólniajcie... I nie wymyślajcie własnych teorii dlaczego coś tak działa.
Rozumiem, że działania modulo vs. and miało dać efekt: dzielenie vs operacja bitowa... No niestety, tak nie musi być :P
Kod cpp:

#include <stdio.h>
int main()
{
    int a;
    scanf( "%d", &a );

    if ( a % 2 ) printf("a");
    if ( a & 1 ) printf("a");        
        
    unsigned int b = a;
    if ( a % 2 ) printf("b");
    if ( a & 1 ) printf("b");

    int tab[1000];
    for (int i=0; i<1000; i++)
        if (tab[i]%2) printf("t");

    for (int i=0; i<1000; i++)
        if (tab[i]&1) printf("t");
}

GCC 3.4.2 (x86, flaga -O1), fragmenty dla testów:

; [...]
;
; test w ifach
; zauważcie optymalizację kompilatora printf("a") do putchar() !!
;
	call	_scanf
	testb	$1, -4012(%ebp)
	je	L2
	movl	$97, (%esp)
	call	_putchar
L2:
	testb	$1, -4012(%ebp)
	je	L3
	movl	$97, (%esp)
	call	_putchar
L3:
	testb	$1, -4012(%ebp)
	je	L4
	movl	$98, (%esp)
	call	_putchar
L4:
	testb	$1, -4012(%ebp)
	je	L5
	movl	$98, (%esp)
	call	_putchar
L5: 
; [....]
;
; testy w pętlach
;
L10:
	testb	$1, -4008(%ebp,%ebx,4)
	je	L8
	movl	$116, (%esp)
	call	_putchar 
; [....]
	testb	$1, -4008(%ebp,%ebx,4)
	je	L13
	movl	$116, (%esp)
	call	_putchar
L13: 

Testy są identyczne

test $1, value

, a nie inaczej :D
Ta wiedza assemblerowa naprawdę jest w kompilatorze.

0

Ja nie przenosze tej wiedzy bo jej nie posiadam ;)
Pracuje zawodowo jako programista, teraz to juz bardziej kordynator programistów i mówiąc szczerze nigdy za bardzo nie rozpatrywałem programowania w kategoriach czy tak zadać warunek czy tak co będzie wydajniejsze... Wychodzę z zalożenia, że to ma robić za mnie kompilator i tyle, jakbym zastanawiał się nad każdym takim warunkiem to wtedy chyba bym zaczął pisać od razu w assemblerze.
Oczywiście optymalizuje swój kod i ulepszam, ale według zaleceń w moim wypadku Microsoftu, a te rozwarzania o których pisze w pierwszym akapicie dla mnie nie mają sensu, programista nie jest od tego by wykonywać prace za kompilator. Takie jest moje zdanie o tworzeniu aplikacji.
ASM natomiast mnie pasjonuje i ciekawi, więc rozwijam swoją teorie, że głownie uczą się go studenci informatyki + róznej maści crackerzy, hackerzy i wirusolodzy,
chociaż ci ostatni dla mnie się troszkę zdewaulowali, bo teraz byle łebek ściąga z netu generator wrusów itd. i uważa się za hacekera...

0

studenci informatyki + róznej maści crackerzy, hackerzy i wirusolodzy,

Do tej listy trzeba chyba dodac samych programistow kompilatorow i oczywiscie hobbystow ;)

0

Do marcinEc - fakt - nowe kompilatory to potrafią o czym (przyznam się szczerze) nie myślę programując. Assemblera znam od jakiś 11 lat i pisanie a&1 zamiast a%2 to po prostu dla mnie naturalne i uzasadnione nawykami ze starych kompilatorów języków wyższego poziomu, w których pisałem lata temu.

Więc ok - widać w dzisiejszych czasach mój przykład jest o kant tyłka rozbić.

Ale to był tylko przykład - wydaje mi się jednak, że znajomość asma jednak pomaga niż przeszkadza :)

No a sam asm... no cóż - reveng i takie tam - tu mus go znać. Chyba, że ktoś atakuje tylko progsy w Javie i .NET ;)
//do postu poniżej - pisząc "atakuje" miałem na myśli "ReverseEngineering" ;)

Pozdro

0

No tak lista oczywiście jest otwarta...

Ja rzeczywiście teraz jak to ładnie Marooned określił atakuje progsy w .NET. Ale w sume taka teraz specyfika rynku, ważne jest szybiek i dobre środowisko do tworzenia aplikacji z bogatym wahlarzem mozliwości...
Przy obecnym cyklu życia aplikacji przebudowa logiki biznesowej aplikacji musi odbywać się sprawnie i bezboleśnie, pewnie w assemblerowej aplikacji da się przebudowywac ale podejrzewam że będzie to bardziej praco- i czasochłonne niz w Javie czy .NET.

0

I tutaj moznaby sie dalej rozwodzić nad tym w jakim kierunku zmieżają wszystkie języki lub systemy programistyczne. Dąży to do jaknajnizszych systemów niestety, a to dlatego że wymagane jest szybkie tworzenie programów a nie tworzenie sprawnych. Kiedyś było zapotrzebowanie na programy oszczędzające pamięć i wszystkie mozliwości komputera, wtedy bardzo był potrzebny assembler. Teraz jak program chodzi na dobrym komputerze to juz jest OK i nie prowadzi sie jego optymalizacji bo po co. Wymagania sprawnościowe programów zostały przerzucone na firmy produkujące coraz lepsze, szybsze urządzenia. Minusem jest to że w takich jezykach wysokiego poziomu jest bardzo duzo błędów i nie ma sie co dziwić że znajdzie sie w programach stworzonych za ich pomocą nie jednej furtki do miejsca gdzie nas nie powinno być. Mam nadzieje że cały ten chaos który nakręca Microsoft i komercjia dąży do wielkiego upadku.

0

Nevar_ nie zgodzę się z Tobą w kilku punktach poza tym że teraz jest ważniejsze szybkie tworzenie aplikacji...
Na tym polega rozwój, ze użytkownik chce jak najwięcej wodotrysków na ekranie nawet kosztem szybkości.
Wydaje mi się jednak, że to wcale nie jest chaos,a pewna idea:
Producent platformy daje Ci pewne możliwości ty je wykorzystujesz, nie znam środowiska programistycznego JAVA, ale na przykładzie Microsoftu:
Dostajesz .NET Framework'a z potrzebnymi obiektami i komponentami które wymagają tylko od programisty zakodowania logiki biznesowej przy użyciu tychże, taki trend, odciążaja programistę od tworzenia kontrolek sprowadzając do ich oprogramowania.
Czyli chyba jak każdy programista który ma za sobą kilka projektów nie tworzy aplikacji nigdy od zera, bo używa swoich sprawdzonych funkcji, klas itd. tylko w tym przypadku jesteś w tym odciążony.
Ideę dobitnie widać jak ktoś się przesiadł z PHP na ASP.NET polecam ten zabieg choćby dla "sportu", nie jest to reklama że asp.net jest lepsze, ale warto wiedzieć jaka jest alternatywa.
A oprogramowanie zawsze będzie miało błędy i luki bo tworzą je ludzie.
Co do przerzucania problemów z wydajnością na producentów sprzętu, no taki rynek każdy chce zarobić, bo inaczej wszedlbyś do sklepu z komputerami i kupił Pentium II bo akurat chcesz mieć maszynę do pisania a tak się niestety nie da.
Może popatrzeć na to okiem maniaków gier, każda najnowsza gra ma coraz większe wymagania sprzetowe, a oni ze spokojem zbierają na nowy bo inaczej nie zagrają i nikt się nie łamie, bo wiadomo nowa czyli nowe cuda, trzeba większych mocy...
Obecnie na rynku zasady programowania dyktuje rynek jestem pewien że gdyby był inny nie mielibyśmy dzisiaj platformy .NET itd. Co z tego że masz dopracowaną wydajna aplikację, z ograniczonymi błędami do minium skoro inni juz w tym czasie sprzedali swoje niedorpacowane projekty. Nie sprzedajesz nie egzystujesz.
No wychodzi nam jakaś katastroficzna wizja, mysle że nie jest tak strasznie jak się wydaje. Tylko trzeba spojrzeć na to wszystko z tej dobrej strony, a upadek który przewidujesz IMHO nam nie grozi...

0

Tworzac roznego rodzaju pakery plikow wykonywalnych asember jest wskazany. Programujac kasy fiskalne rowniez.

0

Mnie bardziej chodzi o programowanie na PC...

0

a pakery plikow wykonywalnych to wlasnie na PC. Nie stworzysz kodu, ktory zaimplementujesz w plik wykonywalny, ktory bedzie spakowany i za jego pomoca sie rozpakuje i wykona, w innym jezyku niz asembler. W innym jezyku nie mozesz kodu przemieszczac po prostu w pamieci, wykorzystujac adresowanie tylko wzgledne.

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.