Permalänk
Medlem

Lära sig Assembly?

Sitter en del med C/C++ (ganska mycket funktionell stil/algoritmiskt, d.v.s. använder inte mycket av de nya häftiga features från C++14/C++17/o.s.v. utan mer: utför funktion1, därefter funktion2 o.s.v.) och skulle gärna fördjupa mig mer i hur saker och ting utförs och varför.
T.ex. när unrollas en for loop? Hur lagras saker i stacken och registret? Hur ser det ut mer exakt i assembly? Sådana frågor är det som jag vill veta mer om.

Någon som har bra litteratur/hemsida/material/etc om ämnet? Eller är det bättre att kika på kompilator-arkitektur?

Hoppas ni fattar vad jag är ute efter

Permalänk
Datavetare

Du är långt ifrån ensam om att vilja veta sådana saker. Alla vi som vill veta sådant ska tacka Matt Godbolt för denna webbsida:

Code Explorer

Här kan du se alla möjliga assemblervarianter och testa en rad olika C/C++ kompilatorer

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Lära sig asm är en hel del nötande i min åsikt, varav jag skulle rekommendera en bok på temat till att börja med. Gissar på att det är x86 du är intresserad av, isåfall -> modern x86 assembly.
Stort plus är att all kod i den boken är anropbar från C/C++.
Exemplena är lite långsamma med mycket repetition, men det handlar ofta om att se skillnad på operationer eller göra conditional jumps om olika flaggor sätts, t.ex zero flag, overflow etc.
Vill du ha praktisk användning av kunskaperna så är det fåtal mig vetligen aktiva områden, säkerhet, kernel utveckling, optimeringar i beräkningstunga miljöer.
Vill du bli inspirerad spana in cppcon talks på youtube, allt som handlar om optimeringar kommer visa asm på slidsen.
Inte att förkasta heller är en grundläggande högskolekurs på datorteknik, då bör asm, minnes- och cachelayout täckas.
Edit:mer förslag

Permalänk
Medlem

Har läst en kurs i datorarkitektur under min utbildning där vi fick lära oss en hel del assembly (MIPS). Kurslitteraturen bestod då av boken Computer Organization and Design: The Hardware/Software Interface som jag tyckte var ganska schysst, kan dock inte säga att jag använde den jättemycket. Men innehåller mycket bra referenser och förklaringar på alla instruktioner som finns i MIPS assembly, t.ex. hur loopar fungerar. Ganska säker att den går att hitta gratis som PDF online om det skulle vara av intresse

Visa signatur

Ryzen 7 1700X | Asus ROG Strix X370-F Gaming | Asus GTX 1070 Ti Strix | Kingston HyperX Fury 16 GB | Noctua NH-D15 | EVGA SuperNOVA G2 650W | Fractal Design Meshify C TG

Permalänk
Inaktiv

Typ alla högskoleprogram från mekatronik upp till datateknik läser minst 7.5hp, då ofta programmera mikrodatorer av olika slag då det är lättare att komma igång och göra små saker.
Jag ser det lite som att den första C++ kursen inte tar upp så mycket WinApi och liknande utan är mer fokuserad på att lära de studerande att koda.

Typ denna Atmel bok skulle jag rekommendera:
https://www.bokus.com/bok/9781305509993/programming-and-inter...

Sedan när du kan programmera mikrokontrollers så är steget lätt att ta x86.

Utvecklingen går dock att man ska kunna mer och mer man kör allt större saker. Och det blir att man tvingas ta till genvägar för att bli kostnadseffektiv. Man kan liksom ägna hel sitt liv åt att bara fördjupa sig i området databaser och enligt vissa borde typ alla göra detta för att kunna skriva effektiva program.

Så mitt råd är att självklart bör man lära sig assembler, frågan är hur mycket tid som gemene person ska lägga på området? Från 2000 till 2003 var assembler mitt favoritspråk och jag ville jobba med detta, läste många högskolepoäng inom detta gjorde världens enklaste men samtidigt buggigaste RTOS etc, men jag såg snabb vad utvecklingen går emot. Idag och troligtvis de kommande 50 åren så är webbteknik the shit och det blir genast mindre fokus på assembler.

Permalänk
Medlem

Det beror på vilket område man skall jobba med - webbteknik är inte the shit - om man skall få en microkontroller att styra någon grunka...

Det finns miljoner av PIC:ar och andra små MCU-chip i alla tänkbara tillämpningar där de inte ens kan stava till webb men ändå är en viktig del i hela infrastrukturen - särskilt när man har distribuerade nätverk inom en och samma apparat eller rack med en lokal liten MCU-logik på varje del

Du skulle bara veta hur mycket sådant det finns i en vanlig laptop - SMB-bussen där styr nästan allt när det gäller power-manager, batteriladdning, om lysdioder tänds eller släcks, bakgrundsbelysning släcks/tänds eller justerar styrkan både på skärm och tangentbord, hantera pekplatta/styrpinne, kamera (dvs. av eller på) , bestämmer om processorer skall köra på max klocka eller neddragen fart, temperatursensorer, fläktar - alla dessa styrs av små egna chip på PIC-nivå och många av dessa är skriven i assembler då det ofta är väldigt få saker de skall göra men göra det väldigt bra och med kanske enstaka kilo-ord i programminne och 32 byte i RAM och 16 IO-register totalt att leka med och kanske 128 Byte med EEPROM.
i princip alla APM-funktioner i en PC eller Laptop består av en rejält stor bunt av olika små MCU i ett eget nätverk sittande överallt - en miljö som väldigt få programmerare är medvetna om att de ens existerar...

Man kan inte trycka in högnivåspråk i dessa sammanhang - möjlige en väldigt strippad C som i princip skrivs och används som en macroassembler i tänket och ingen automatik alls utan all minnesallokeringar etc. etc. kanske redan är gjord i listor i assembler som länkas ihop tillsammans med C-programmet som mer är på applikationsnivå-huvudsnurran och funktioner ropar på assembelersnuttar (även inline-assembler).

Permalänk
Medlem
Skrivet av Yoshman:

Du är långt ifrån ensam om att vilja veta sådana saker. Alla vi som vill veta sådant ska tacka Matt Godbolt för denna webbsida:

Code Explorer

Här kan du se alla möjliga assemblervarianter och testa en rad olika C/C++ kompilatorer

Gillar starkt färgkodningen. Man kan enkelt se vad och hur det exekveras. Stort tack!

Skrivet av iamragge:

Lära sig asm är en hel del nötande i min åsikt, varav jag skulle rekommendera en bok på temat till att börja med. Gissar på att det är x86 du är intresserad av, isåfall -> modern x86 assembly.
Stort plus är att all kod i den boken är anropbar från C/C++.
Exemplena är lite långsamma med mycket repetition, men det handlar ofta om att se skillnad på operationer eller göra conditional jumps om olika flaggor sätts, t.ex zero flag, overflow etc.
Vill du ha praktisk användning av kunskaperna så är det fåtal mig vetligen aktiva områden, säkerhet, kernel utveckling, optimeringar i beräkningstunga miljöer.
Vill du bli inspirerad spana in cppcon talks på youtube, allt som handlar om optimeringar kommer visa asm på slidsen.
Inte att förkasta heller är en grundläggande högskolekurs på datorteknik, då bör asm, minnes- och cachelayout täckas.
Edit:mer förslag

Ja fokus kommer ligga på x86. Är mest intresserad av hur det ser ut "bakom kulisserna". Ska kika på om jag hittar en högskolekurs som täcker ämnet någorlunda bra. Tack för tipsen!

Skrivet av Daggemanz:

Har läst en kurs i datorarkitektur under min utbildning där vi fick lära oss en hel del assembly (MIPS). Kurslitteraturen bestod då av boken Computer Organization and Design: The Hardware/Software Interface som jag tyckte var ganska schysst, kan dock inte säga att jag använde den jättemycket. Men innehåller mycket bra referenser och förklaringar på alla instruktioner som finns i MIPS assembly, t.ex. hur loopar fungerar. Ganska säker att den går att hitta gratis som PDF online om det skulle vara av intresse

Hittade boken på biblioteket! Och som e-book dessutom! Ska bläddra lite i den och se om jag kan hitta några kapitel som är intressanta

Skrivet av anon159643:

Typ alla högskoleprogram från mekatronik upp till datateknik läser minst 7.5hp, då ofta programmera mikrodatorer av olika slag då det är lättare att komma igång och göra små saker.
Jag ser det lite som att den första C++ kursen inte tar upp så mycket WinApi och liknande utan är mer fokuserad på att lära de studerande att koda.

Typ denna Atmel bok skulle jag rekommendera:
https://www.bokus.com/bok/9781305509993/programming-and-inter...

Sedan när du kan programmera mikrokontrollers så är steget lätt att ta x86.

Utvecklingen går dock att man ska kunna mer och mer man kör allt större saker. Och det blir att man tvingas ta till genvägar för att bli kostnadseffektiv. Man kan liksom ägna hel sitt liv åt att bara fördjupa sig i området databaser och enligt vissa borde typ alla göra detta för att kunna skriva effektiva program.

Så mitt råd är att självklart bör man lära sig assembler, frågan är hur mycket tid som gemene person ska lägga på området? Från 2000 till 2003 var assembler mitt favoritspråk och jag ville jobba med detta, läste många högskolepoäng inom detta gjorde världens enklaste men samtidigt buggigaste RTOS etc, men jag såg snabb vad utvecklingen går emot. Idag och troligtvis de kommande 50 åren så är webbteknik the shit och det blir genast mindre fokus på assembler.

Ja jag kommer bara titta på hur det funkar och så. Tack för boktipset!
Så du tror all programmering kommer att hamna på "molnet" till slut? Och alla beräkningar/rendering körs där? Det hade varit väldigt häftigt

Permalänk
Inaktiv
Skrivet av Alotiat:

Ja jag kommer bara titta på hur det funkar och så. Tack för boktipset!
Så du tror all programmering kommer att hamna på "molnet" till slut? Och alla beräkningar/rendering körs där? Det hade varit väldigt häftigt

Molnet är ett brett begrepp som jag mer tolkar som server som körs hos en leverantör.

Det jag syftar på är att det minskas med små lokala applikationer som man ska hålla på att uppdatera. Folk vill istället från vilken enhet de än har, windows, macos, linux, arm, x86 kunna använda tjänsten utan att behöva installera något alls.
Folk får bara fler enheter som ska ansluta sig till allt fler saker och det ska bara fungera. Då är det webbutvecklingen som är ett stort fokus även om backend som mer är vanlig applikationsutvecklingen finns.

Min poäng är att det är så otroligt mycket man ska kunna, ren webbutvecklingen är det stora.
Assembler är skitbra att kunna, t.o.m.. mekatronikingenjörerna när jag läste vanliga C funktioner på tentan som de skulle översätta till assembler precis som du nämnde, med att skapa en stack och spara undan register i processorn innan man anropade en funktion och sedan läsa tillbaka. (pop och push vill jag minnas)
Det är nyttigt att läsa in detta, på samma sätt 1år med ren matematik är bra, men sedan bör den stora skaran fokusera på annat då det är så otroligt mycket man ska kunna, För att ta ett annat exempel än databaser, så nätverksteknik kan man fokusera hela livet på, speciellt om man sätter sig in i olika protokoll. Just detta med att lära sig ett protokoll flytande (modbus, bacnet, mbus, profitbus och allt vad de heter) Kan innebära att man bara har jobb med detta.
Där modbus kom på 1979 och är än idag ett av de vanligaste protokollen som tekniker ofta håller på och analyserar datatrafik på.

Mitt påstående är att inom datateknik så blir det för varje år bara mer man får kunna och det gäller att prioritera rätt för exakt det man vill jobba med.

Permalänk
Medlem

Om man vill lära sig assembler tycker jag PGU är en bra resurs. Den lär dig programmera x86 assembly (NASM om jag minns rätt) utan förkunskaper. Det är dock bra att ha kodat innan kan jag tycka. Den är gratis och kan laddas ned som pdf: https://savannah.nongnu.org/projects/pgubook/

Vill man se hur ett högnivåspråk översätts till ASM är det faktiskt inte helt fel att testa att skriva en liten kompilator eller interpretator. Jack Crenshaw skrev för länge länge sen en grym tutorial där du bit för bit pusslar ihop en kompilator och där du vid varje steg har en körbar version. https://compilers.iecc.com/crenshaw/ . Den är skriven för pascal men exempel kan lätt implementeras i ex C, C++, C# eller Java. Har även sett nyare "portningar", typ, https://github.com/lotabout/Let-s-build-a-compiler , men kan inte kommentera på kvaliteten då jag inte provat dem.