Permalänk
Medlem

Lära sig assembler

Hej !

Jag funderar på att lära mig assembler (x86), men är högst oinsatt i hur man bäst går tillväga.
Någon som har tips på böcker eller tutorials ?
Och hur är det med kompilatorer, har ingen aning om sådant vad gäller assembler.

Jag har erfarenhet av högnivå-programmering sedan tidigare, så jag är ingen nybörjare på programmering. Jobbar hela dagarna på jobbet med ett stort mjukvaruprojekt i c++.
Dock har jag ingen erfarenhet av lågnivåprogrammering sedan tidigare.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem

Har tyvärr inte bra koll på vilka alternativ som finns.
Dock känns c assembler som nåt du kan kolla upp, borde bara vara att googla på det för tutorials.
Aldrig skrivit något med det själv kan jag tillägga.

Permalänk
Medlem

Lekte faktiskt runt med lite assembly för ett tag sedan, bra om du är intresserad.
http://www.malmo.stadsbibliotek.org/search~S7*swe?/Xassembly&...
Problemet var dock att jag behövde konvertera all x86 kod till x64, vilket var lite jobbigt när man gjorde det för första gången. Kan nog finnas bättre guider på internet.

Angående kompilator så kan du använda gcc eller något.

Visa signatur

| Antec P183 | AMD Phenom 2 940 | Corsair XMS2 DDR2 8192 MB | XFX HD4870 | Gigabyte MA-790X-UD3P | Corsair VX 450W | Primärt OS: Arch Linux | Windows 7 x64 |

Permalänk
Vila i frid

http://en.wikipedia.org/wiki/Comparison_of_assemblers

MASM och TASM används väl mest och sen finns det hopers GPL-versioner man kan testa.

Ditt lokala bibliotek bör kunna skapa fram litteratur att läsa. http://www.bibliotek.se/session/performsearch?search=assemble...

Permalänk
Medlem

"Art of Assembly"
http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/index.ht...

Undvik GCC när det kommer till assembler då de använder den värdelösa AT&T syntaxen. All dokumentation använder intel syntaxen. Den bästa assemblatorn för x86 är nog NASM (Netwide assembler), men ifall du vill blanda C/C++ kod med assembler så har Visual C++ bra stöd för inline assembler.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Medlem
Skrivet av MagnusL:

"Art of Assembly"
http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/index.ht...

Undvik GCC när det kommer till assembler då de använder den värdelösa AT&T syntaxen. All dokumentation använder intel syntaxen. Den bästa assemblatorn för x86 är nog NASM (Netwide assembler), men ifall du vill blanda C/C++ kod med assembler så har Visual C++ bra stöd för inline assembler.

Tack för tipsen allihopa !
Den där sidan verkar innehålla en hel del matnyttigt.
Jag skriver mest i Visual studio 2010 så då blir det väl lämpligast att ta reda på inline asemblern där fungerar.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem
Skrivet av JesperT:

Tack för tipsen allihopa !
Den där sidan verkar innehålla en hel del matnyttigt.
Jag skriver mest i Visual studio 2010 så då blir det väl lämpligast att ta reda på inline asemblern där fungerar.

Var medveten om att inline assembler inte stödjs av Visual Studio för 64-bitars-plattformar bara.

Visa signatur

Alla män är dödliga. Sokrates var dödlig. Alltså är alla män Sokrates.

Permalänk
Skrivet av JesperT:

Jag funderar på att lära mig assembler (x86), ...

Får jag fråga först varför du vill lära dig assembler? Är det nått specifikt du ska skriva eller vill du lära dig någonting nytt?

Permalänk
Medlem
Skrivet av VirtualIntent:

Får jag fråga först varför du vill lära dig assembler? Är det nått specifikt du ska skriva eller vill du lära dig någonting nytt?

Både och egentligen.
Framför allt är det snabbheten jag vill åt så att man kan porta beräkningsintensiva delar av ens program till assembler. Det är dock inte något jag absolut behöver göra för tillfället, men det kan komma att behövas senare och då vore det bra att vara lite bekant med det hela.
Jag jobbar med väldigt beräkningsintensiva saker och att få ner beräkningstiden är ofta av stort värde.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Medlem
Skrivet av JesperT:

Både och egentligen.
Framför allt är det snabbheten jag vill åt så att man kan porta beräkningsintensiva delar av ens program till assembler. Det är dock inte något jag absolut behöver göra för tillfället, men det kan komma att behövas senare och då vore det bra att vara lite bekant med det hela.
Jag jobbar med väldigt beräkningsintensiva saker och att få ner beräkningstiden är ofta av stort värde.

Möjligt att det skulle vara en bättre ide att lära sig CUDA eller liknande. Det dröjjer nog en stund innan du kan peta ur dig mer optimerad kod än en bra kompilator i dagsläget.

Vad för slags beräkningar är det du gör/ska göra?

Permalänk
Medlem
Skrivet av iXam:

Möjligt att det skulle vara en bättre ide att lära sig CUDA eller liknande. Det dröjjer nog en stund innan du kan peta ur dig mer optimerad kod än en bra kompilator i dagsläget.

Vad för slags beräkningar är det du gör/ska göra?

Jodå, det har du helt rätt i. CUDA är också något vi(jag och min polare) har planer på att arbeta med i framtiden.

Jag jobbar med ett program som ska beräkna kreditrisk för banker med alla deras positioner och investeringar. Det blir väldigt mycket simulering av riskfaktorer och beräkningar av risk för olika positioner och portföljer.
Vi har gjort det hela på ett effektivt sätt i c++ så här långt, men allt kan ju bli bättre, så för framtida optimeringar så är det bra att se lite framåt vad som finns att tillgå.
Då är väl egentligen, som du säger, CUDA det mest naturliga valet av språk att börja lära sig och därefter assembler.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Skrivet av JesperT:

Både och egentligen.
Framför allt är det snabbheten jag vill åt så att man kan porta beräkningsintensiva delar av ens program till assembler. Det är dock inte något jag absolut behöver göra för tillfället, men det kan komma att behövas senare och då vore det bra att vara lite bekant med det hela.
Jag jobbar med väldigt beräkningsintensiva saker och att få ner beräkningstiden är ofta av stort värde.

Som iXam är inne på så var det ganska många år sedan en människa kunde skriva lika snabb kod i assembler som en modern kompilator kan, så av den anledningen skulle jag inte föreslå att använda assembler.

Det man får göra för att snabba upp en beräkning är att använda någon form av parallellt system och sen skriva programmet så att det skalar på det systemet. Exempel på parallella system är GPUer, PC-datorer med CPUer som har så många kärnor som möjligt, eller kluster av PCar. Fördelen med GPUer är man får väldigt många parallella kärnor (ett nytt kort kan ha 512 kärnor eller mer) , men nackdelen är att de ställer stora krav på strukturen av algoritmerna för att kärnorna ska kunna jobba parallellt utan fördröjningar. Det är alltså inte självklart att man kan ta sin beräkning och lägga ut den på ett grafikkort, men ifall det går att anpassa den så kan man få bra prestanda. Jag tycker dock att många ofta missar att moderna CPUer kan ha 4 kärnor med HyperThreading (2 trådar/kärna => 8 parallella trådar) så redan där kan man få en rejäl uppsnabbning.

Angående assembler igen så är det såklart kul att kunna även om det knappt finns några praktiska användningsområden för det längre. Ett ställe där det fortfarande används en del är för programmering av små mikrokontrollrar (t.ex. från http://www.microchip.com/) som har många speciella instruktioner. Men ofta har C/C++-kompilatorerna stöd för de instruktionerna (s.k. intrinsics, http://msdn.microsoft.com/en-us/library/26td21ds%28v=VS.100%2...) så även där är det antagligen mer rationellt att använda någonting annat än assembler.

Permalänk
Medlem
Skrivet av VirtualIntent:

Som iXam är inne på så var det ganska många år sedan en människa kunde skriva lika snabb kod i assembler som en modern kompilator kan, så av den anledningen skulle jag inte föreslå att använda assembler.

Det man får göra för att snabba upp en beräkning är att använda någon form av parallellt system och sen skriva programmet så att det skalar på det systemet. Exempel på parallella system är GPUer, PC-datorer med CPUer som har så många kärnor som möjligt, eller kluster av PCar. Fördelen med GPUer är man får väldigt många parallella kärnor (ett nytt kort kan ha 512 kärnor eller mer) , men nackdelen är att de ställer stora krav på strukturen av algoritmerna för att kärnorna ska kunna jobba parallellt utan fördröjningar. Det är alltså inte självklart att man kan ta sin beräkning och lägga ut den på ett grafikkort, men ifall det går att anpassa den så kan man få bra prestanda. Jag tycker dock att många ofta missar att moderna CPUer kan ha 4 kärnor med HyperThreading (2 trådar/kärna => 8 parallella trådar) så redan där kan man få en rejäl uppsnabbning.

Angående assembler igen så är det såklart kul att kunna även om det knappt finns några praktiska användningsområden för det längre. Ett ställe där det fortfarande används en del är för programmering av små mikrokontrollrar (t.ex. från http://www.microchip.com/) som har många speciella instruktioner. Men ofta har C/C++-kompilatorerna stöd för de instruktionerna (s.k. intrinsics, http://msdn.microsoft.com/en-us/library/26td21ds%28v=VS.100%2...) så även där är det antagligen mer rationellt att använda någonting annat än assembler.

Att parallellisera beräkningarna till flera kärnor och trådar gör vi redan och det snabbar, som du säger, upp det hela ordentligt.
Jo, det kräver en hel del anpassning för att få algoritmerna att passa till CUDA. Dock har vi skrivit vårt program med tanke på sådana portningar i framtiden så förhoppningsvis ska det kunna gå.

Angående assembler så kände jag inte riktigt till att det var så "ute" som ni beskriver.
Kanske bättre att först börja lära sig lite grundläggande CUDA då.

Visa signatur

Namn : Jesper | Ålder : 45 | In-game namn : iller
Yrke : Matematisk modellerare (finansiell matematik), mjukvaruutvecklare för risksystem.
Utbildning : Doktor i matematik + en del mat-stat, numme och IT-relaterat.

Permalänk
Skrivet av JesperT:

Kanske bättre att först börja lära sig lite grundläggande CUDA då.

Det tror jag är en bra idé, du kommer att lära dig en massa användbara saker om du börjar titta på det.

Du har säkert redan hittat hit, men här är i alla fall en bra utgångspunkt: http://developer.nvidia.com/category/zone/cuda-zone.

Tanka ner och installera senaste versionen av CUDA Toolkit, förutsatt att du har ett modernt NVIDIA grafikkort såklart!

I CUDA C Programming Guide som följer med toolkitet, eller går att ta hem direkt här http://developer.download.nvidia.com/compute/cuda/3_2_prod/to..., så finns den mesta informationen man kan behöva även om begreppen kan vara lite förvillande i början. Det är såklart bara att fråga här om du undrar nått.

Permalänk
Medlem
Skrivet av VirtualIntent:

Det tror jag är en bra idé, du kommer att lära dig en massa användbara saker om du börjar titta på det.

Du har säkert redan hittat hit, men här är i alla fall en bra utgångspunkt: http://developer.nvidia.com/category/zone/cuda-zone.

Tanka ner och installera senaste versionen av CUDA Toolkit, förutsatt att du har ett modernt NVIDIA grafikkort såklart!

I CUDA C Programming Guide som följer med toolkitet, eller går att ta hem direkt här http://developer.download.nvidia.com/compute/cuda/3_2_prod/to..., så finns den mesta informationen man kan behöva även om begreppen kan vara lite förvillande i början. Det är såklart bara att fråga här om du undrar nått.

Finns ingen anledning att använda CUDA när OpenCL finns.

Visa signatur

Intel Core i7-3770K | NVIDIA Geforce GTX 980 | 16 GB DDR3 | DELL P2415Q | DELL U2711 | DELL U2410

Permalänk
Skrivet av MagnusL:

Finns ingen anledning att använda CUDA när OpenCL finns.

Jag antar att du har aktivt använt båda språken/miljöerna?

Skulle du säga att verktygen för OpenCL är lika väl utvecklade som för CUDA? På jobbet så tittade vi på att använda OpenCL istället för CUDA för mindre än ett år sen, men då var det inget snack om att CUDA fungerade betydligt bättre, speciellt som vi ändå bara använder NVIDIA grafikkort.

Permalänk
Medlem

Visserligen en två veckor gammal tråd men vad fasiken...

Skrivet av VirtualIntent:

Som iXam är inne på så var det ganska många år sedan en människa kunde skriva lika snabb kod i assembler som en modern kompilator kan, så av den anledningen skulle jag inte föreslå att använda assembler.

Huh? Man måste vara tämligen usel på assembly för att vara sämre än en kompilator på att exempelvis koda en icke-triviell signalbehandlingsfunktion eller liknande. Har du ens programmerat i x86 assembly eller analyserat disassembly från en kompilator?

När det gäller ren x86 så är det normalt sett inte så stora förbättringar man kan åstadkomma men när man använder SIMD så är det inte ovanligt att man skriver kod som är 1000% snabbare än vad en modern kompilator presterar från C-kod utan intrinsics med samtliga optimeringsalternativ påslagna. Auto vectorization är ett hett ämne när det gäller kompilatorutveckling men i dagsläget är det tämligen oanvändbart.

Att skriva SIMD-kod med intrinsics är lite av en lightversion av att programmera i assembly då anropen är 1:1 mappningar av opcodes, man slipper bara hålla reda på detaljer. Det är mest en smaksak om man väljer att använda intrinsics eller skriva assembly direkt. Själv använder jag både och beroende på sammanhang, intrinsics går snabbare att skriva men assembly ger bättre optimerad kod. Vill man bli bra på att använda intrinsics så måste man dock veta hur det fungerar "under skalet" så man bör definitivt lära sig att programmera i assembly innan man ger sig på intrinsics.

Skrivet av VirtualIntent:

Angående assembler igen så är det såklart kul att kunna även om det knappt finns några praktiska användningsområden för det längre.

De flesta program som är beräkningsintensiva har nytta av väloptimerade assemblyrutiner.

Innan man ger sig in på att knacka assembly bör man dock profilera programmet för att hitta hot spots och sedan först försöka förbättra själva algoritmerna, dåliga algoritmer är den vanligaste orsaken till långsamma program.

Intressant läsning gällande optimeringar finns här: http://agner.org/optimize/. Jag rekommenderar starkt att du läser igenom manualerna som finns där.

Visa signatur

Assembly är ett högnivåspråk.