Programování v assembleru

smoofy

  • *****
  • 1 056
    • Zobrazit profil
    • E-mail
Re:Programovani v assembleru
« Odpověď #15 kdy: 25. 07. 2013, 16:13:12 »
Tak delal jsem v Pascalu, Java, Delphi, C, Python at uz ve skole, nebo pak nejaky mirnejsi upravy kodu etc. za programatora se nepovazuju, jde mi spise o co nejlepsi pochopeni principu funkce, zrychlovani programu, zatez software na pamet,cpu a to predevsim na x86 a x64 platforme, nicmene sam casto narazim na nazor, ze je dobre se zacit ucit na jednodussich architekturach, s cimz nemam vubec zadnej problem. Pokud nekdo muze doporucit nejakej sw simulator, se kterym se da hrat a podchytit zaklady bylo by to super.
Zaujal mne predevsim prispevek punkatux, ktery vystihuje moje snazeni v jedine vete:
Citace
Dost jsem se naucil divanim se na zkompilovany kod, ale take si pamatuju, ze nez jsem se naucil na co se presne divat, kod generovany kompilatorem byl pro mne dost nepruhledny. Az dnes vim proc to dela tak, jak to dela.


gamer

Re:Programovani v assembleru
« Odpověď #16 kdy: 25. 07. 2013, 16:33:58 »
Mňo, četl jsem dokumentaci k cca 40-ti různým procesorům a rozhodně si netroufnu říct, že bych zvládl programovat pro víc než jednu architekturu a režim. Pravda, už sem raději nepiš, dokud o tom nebudeš vědět víc. Že Zilog Z80 je dobrý na učení, no možná, proč ne, existují pro něj free simulátory, o ortogonalitě jeho instrukční sady nelze moc mluvit, býval oblíbený. Ale že potom, co se naučíš programovat pro Z80, budeš umět programovat i pro x64 jen po prostudování dokumentace je blábol hodný masitého idota.
Programoval jsem v assembleru kde co, Z80, jednočipy, DSP s harwardskou architekturou, x86 a je to všechno na jedno brdo, nastuduješ instrukční sadu a hotovo.

Uznávám, že po prostudování instrukční sady budeš sice umět napsat INC EAX; Možná přijdeš i na to, proč je to rychlejší než ADD EAX,1; ale tím to tak skončí. No idiotovi nemá smysl vysvětlovat, že program dávno neběží v paměti sám, že musí volat nějaká přerušení, pokud chce víc než jen sčítat a odčítat, že to jsou přerušení BIOSu a OS, atd, atd, atd, což se rozhodně na Z80 nenaučí. Ale tím se netrap, to tu píšu pro chytřejší.
Hele když už píšeš o přerušení, měl by sis ujasnit, o co vlasně jde. "Voláním přerušení" asi myslíš instrukci INT na x86, což je jenom trochu jinak fungující instrukce CALL a shodou okolností se to používá na volání služeb operačního systému. To má Z80 assembler taky, je to instrukce RST. S opravdovým přerušením to ale nemá skoro nic společného, přerušení je nějaká (obvykle hardwarová) událost, která se zpracovává handlerem přerušení asynchronně ve chvíli, kdy nastane. S tím se naučí pracovat jedině na něčem bez OS, protože tohle vždycky řeší OS (leda že by chtěl psát driver do kernelu, což nepředpokládám). Takže naopak, tohle se naučí jedině na Z80 nebo něčem podobně jednoduchém. To že zavoláš instrukcí INT nějakou službu OS, je triviální operace a není se na tom co učit.

Mirek

Re:Programovani v assembleru
« Odpověď #17 kdy: 25. 07. 2013, 17:10:31 »
Programoval jsem v assembleru kde co, Z80, jednočipy, DSP s harwardskou architekturou, x86 a je to všechno na jedno brdo, nastuduješ instrukční sadu a hotovo.
A nezapoměl jsi na něco? Co takhle nastudovat podrobně ještě minimálně architekturu konkrétního procesoru, správu paměti, systém přerušení, případně funkční bloky, které jsou jeho součástí. Instrukční sada je jen jazyk, kterým se ovládá HW samotného procesoru a architektura do ní vnáší logiku.

Hele když už píšeš o přerušení, měl by sis ujasnit, o co vlasně jde. "Voláním přerušení" asi myslíš instrukci INT na x86, což je jenom trochu jinak fungující instrukce CALL a shodou okolností se to používá na volání služeb operačního systému. To má Z80 assembler taky, je to instrukce RST. S opravdovým přerušením to ale nemá skoro nic společného, přerušení je nějaká (obvykle hardwarová) událost, která se zpracovává handlerem přerušení asynchronně ve chvíli, kdy nastane. S tím se naučí pracovat jedině na něčem bez OS, protože tohle vždycky řeší OS (leda že by chtěl psát driver do kernelu, což nepředpokládám). Takže naopak, tohle se naučí jedině na Z80 nebo něčem podobně jednoduchém. To že zavoláš instrukcí INT nějakou službu OS, je triviální operace a není se na tom co učit.
Tvůj pohled na problematiku přerušení v assembleru je dost zjednodušený. Navíc je často právě oblast driverů to, kde se dá setkat s assemblerem a tím jsme u HW interruptů se vším co k tomu patří.

Mirek

Re:Programovani v assembleru
« Odpověď #18 kdy: 25. 07. 2013, 17:18:16 »
třeba Intel 8051, Atmel AVR, a nebo PIC jestli tě zajímá RISC.

Jojo, na naučení fajn, třeba Arduino je na hraní za pár kaček, navíc se s tím dají realizovat i poměrně pěkný věci.
Jen je to šikovnější spíš pro nějakého začínajícího elektronika, protože se bude muset naučit i něco o tom, co to je proud, jaké je maximální proudové zatížení vstupu atd.

To není nutně pravda - když vybere kit, který má na sobě alespoň pár LEDek (třeba MSP430 LaunchPad od TI za hubičku - myslím, že mně přišel na 4 USD i s poštovným), nemusí vůbec nic dělat. Jen připojí k USB.

http://www.ti.com/tool/msp-exp430g2

Pokud nechce řešit externí bazmek a má strach z čehokoliv, co by připomínalo HW, může zkusit třeba AVR v simulátoru: http://www.atmel.com/microsite/atmel_studio6/debugging_simulation.aspx . A existuje i pro Linux.

gamer

Re:Programovani v assembleru
« Odpověď #19 kdy: 25. 07. 2013, 17:20:31 »
A nezapoměl jsi na něco? Co takhle nastudovat podrobně ještě minimálně architekturu konkrétního procesoru, správu paměti, systém přerušení, případně funkční bloky, které jsou jeho součástí. Instrukční sada je jen jazyk, kterým se ovládá HW samotného procesoru a architektura do ní vnáší logiku.
Všechno je to hrozně podobné, nikdo za posledních 20 let nic světoborného nevymyslel. Je to jako s programovacím jazykem, když se naučíš jeden a pochopíš základní principy, každý další se dá naučit mnohem rychleji a snadněji.

Tvůj pohled na problematiku přerušení v assembleru je dost zjednodušený.
Rád se nechám poučit.


Mirek

Re:Programovani v assembleru
« Odpověď #20 kdy: 25. 07. 2013, 17:24:56 »
Tak delal jsem v Pascalu, Java, Delphi, C, Python at uz ve skole, nebo pak nejaky mirnejsi upravy kodu etc. za programatora se nepovazuju, jde mi spise o co nejlepsi pochopeni principu funkce, zrychlovani programu, zatez software na pamet,cpu a to predevsim na x86 a x64 platforme, nicmene sam casto narazim na nazor, ze je dobre se zacit ucit na jednodussich architekturach, s cimz nemam vubec zadnej problem. Pokud nekdo muze doporucit nejakej sw simulator, se kterym se da hrat a podchytit zaklady bylo by to super.
Zaujal mne predevsim prispevek punkatux, ktery vystihuje moje snazeni v jedine vete:
Citace
Dost jsem se naucil divanim se na zkompilovany kod, ale take si pamatuju, ze nez jsem se naucil na co se presne divat, kod generovany kompilatorem byl pro mne dost nepruhledny. Az dnes vim proc to dela tak, jak to dela.

Rozumím, takže spíš aplikační než systémové programování. V tom případě bych doporučil začít na něčem jednoduchém k pochopení základů a principů (viz výše), potom na té jednoduché platformě přejít na C a studovat vygenerované ASM kódy, klidně s různými stupni optimalizací a snažit se pochopit co, jak a proč se překládá právě tak, jak se to překládá. Pro to bych opravdu doporučil AVR a nebo i8051 (na ten by taky měly být k sehnání nějaké simulátory - zkus pohledat). A potom na x86 / x64 a začít opět s jednoduchými věcmi a pak jít do generovaného kódu atd.

Mirek

Re:Programovani v assembleru
« Odpověď #21 kdy: 25. 07. 2013, 17:37:16 »
A nezapoměl jsi na něco? Co takhle nastudovat podrobně ještě minimálně architekturu konkrétního procesoru, správu paměti, systém přerušení, případně funkční bloky, které jsou jeho součástí. Instrukční sada je jen jazyk, kterým se ovládá HW samotného procesoru a architektura do ní vnáší logiku.
Všechno je to hrozně podobné, nikdo za posledních 20 let nic světoborného nevymyslel. Je to jako s programovacím jazykem, když se naučíš jeden a pochopíš základní principy, každý další se dá naučit mnohem rychleji a snadněji.

Tvůj pohled na problematiku přerušení v assembleru je dost zjednodušený.
Rád se nechám poučit.

Takže přeskakuješ první kapitoly dokumentace CPU a čteš jen instrukční sadu? Co tímhle způsobem píšeš za SW?

Zatímco jazyky vyšší úrovně slouží primárně k zápisu algoritmů, assembler je jazyk k přímému ovládání HW procesoru a abych v něm na konkrétní platformě mohl něco smysluplného, musím architektuře podrobně rozumět. A architekturou samozřejmě nemyslím von Neumann v. Harvard.

Pavel Tisnovsky

Re:Programovani v assembleru
« Odpověď #22 kdy: 25. 07. 2013, 17:41:38 »
Tak delal jsem v Pascalu, Java, Delphi, C, Python at uz ve skole, nebo pak nejaky mirnejsi upravy kodu etc. za programatora se nepovazuju, jde mi spise o co nejlepsi pochopeni principu funkce, zrychlovani programu, zatez software na pamet,cpu a to predevsim na x86 a x64 platforme, nicmene sam casto narazim na nazor, ze je dobre se zacit ucit na jednodussich architekturach, s cimz nemam vubec zadnej problem. Pokud nekdo muze doporucit nejakej sw simulator, se kterym se da hrat a podchytit zaklady bylo by to super.

Ja bych asi dneska zkusil napriklad simulator PICu [http://www.root.cz/clanky/vyvojove-nastroje-pro-osmibitove-mikroradice-pic/] a kdyztak si koupit za par korun realny procesor a treba zacit blikat LEDkama nebo neco podobneho. Vypada to mozna sice detinsky, ale u osmibitovych mikroradicu se dostanete blizko k "zelezu", zadny OS a nic dalsiho mezi Vasim programem a CPU nebude :-)

JS

Re:Programovani v assembleru
« Odpověď #23 kdy: 25. 07. 2013, 18:07:03 »
Smoofy, a co zkusit Jones Forth? Je v x86 assembleru na Linuxu a pak castecne v sobe, je napsany ve stylu "literate programming" (i kdyz to neni tutorial assembleru, ale Forthu), a nauci to cloveka jak bootstrapovat maly kompilator, coz je IMHO o dost poucnejsi nez samotny assembler.

Jinak si myslim, ze nema moc smysl to studovat, mozna opravdu na nejake embedded architekture, ktera je jednoducha, a osvetli tak principy navrhu pocitacu. V praxi assembler pouzijes jen v extremnich pripadech, kde z toho ci onoho duvodu nelze pouzit C kompilator, nebo jsi natolik dobry, ze opravdu umis napsat tech par radek lepe (coz IMHO rozhodne neni snadne se na takovou uroven dostat).

Takže přeskakuješ první kapitoly dokumentace CPU a čteš jen instrukční sadu? Co tímhle způsobem píšeš za SW?

Fascinuje me, kolik je tady lidi s nizkou socialni inteligenci, co maji potrebu si na ostatnich honit ego. Je celkem jasne, jak to autor myslel, a ze zna minimalne x86 a Z80. A ma celkem pravdu; jakmile clovek pochopi u assembleru nektere zakladni koncepce, pak uz je to opravdu jen precteni manualu.

v2kt0r

Re:Programovani v assembleru
« Odpověď #24 kdy: 25. 07. 2013, 18:29:55 »
Milý hochu ;D, než se zeptám, tak se kouknu a něco se dozvím, není assembler jako assembler. (Blba kárající smajlík!)
Thumbs up za nick, ale >>blicí smajlík nad zbytečně hrubým blbem<< za zbytek.
Co tě přesně na tazateli, nebo na čem jiném, tolik žere? On neříká "proč vy kreténi ten vás asembler vypadá tak nečitelně", ale slušně se ptá kde začít (tos částečně napsal, ale proč to shazování okolo?), žádá o radu a je ochoten zaplatit (takže se každý může rozhodnout, zda někoho za jeho vlastní peníze povodí za ručku a něco mu vysvětlí)... Takže kde přesně vidíš jaký problém?

Mirek

Re:Programovani v assembleru
« Odpověď #25 kdy: 25. 07. 2013, 19:17:43 »
Fascinuje me, kolik je tady lidi s nizkou socialni inteligenci, co maji potrebu si na ostatnich honit ego. Je celkem jasne, jak to autor myslel, a ze zna minimalne x86 a Z80. A ma celkem pravdu; jakmile clovek pochopi u assembleru nektere zakladni koncepce, pak uz je to opravdu jen precteni manualu.

O mojí sociální inteligenci se neboj. A autor pravdu nemá - jestli chceš v assembleru něco smysluplného napsat a využít ho opravdu tam, kde má smysl, potřebuješ o daném CPU vědět o dost víc než jen instrukční sadu a s "některými základními koncepcemi" opravdu nevystačíš.

Ale problém bude pravděpodobně v tom, co vidíme pod smysluplným využitím assembleru, a tam může být kámen úrazu.

IDDQD

Re:Programovani v assembleru
« Odpověď #26 kdy: 25. 07. 2013, 19:29:32 »
Ale problém bude pravděpodobně v tom, co vidíme pod smysluplným využitím assembleru, a tam může být kámen úrazu.

Taky to tak vidím, také jsem měl na VŠ základy ASM a nebýt toho, že do toho vidím víc, mohl bych tvrdit stejné kraviny.
Ono stačí říct, chci spojit tyto dva řetězce a vytisknout je vlastní funkcí volající služby OS a ne knihovním call printf.
To chci vidět, jak to někdo, kdo si přečte jen instrukční sadu X64 procesoru, udělá ;D

gamer

Re:Programovani v assembleru
« Odpověď #27 kdy: 25. 07. 2013, 22:13:56 »
Takže přeskakuješ první kapitoly dokumentace CPU a čteš jen instrukční sadu? Co tímhle způsobem píšeš za SW?
SW alespoň částečne v assembleru (takový magor abych psal něco většího celé v assembleru zase nejsem) jsem napsal dost a dostal jsem za to i zaplaceno. Dělal jsem i řídici systémy pro zákaznický hardware, který možná běžně každý den potkáváš, ale raději nebudu psát, co to je ;)

Zatímco jazyky vyšší úrovně slouží primárně k zápisu algoritmů, assembler je jazyk k přímému ovládání HW procesoru a abych v něm na konkrétní platformě mohl něco smysluplného, musím architektuře podrobně rozumět. A architekturou samozřejmě nemyslím von Neumann v. Harvard.
V tom se právě mýlíš, jestli myslíš "znalostí assembleru" "znalost všech periferií připojených okolo procesoru nebo na čipu mikrokotroléru", tak to jsou dvě různé věci a je úplně jedno, jestli ty periferie obsluhuješ v assemberu nebo v nějakém vyšším programovacím jazyce. Většinou jsou ty periferie jen namapované někam do adresového prostoru a můžu napsat v assembleru
Kód: [Vybrat]
mov [ADRESA_REGISTRU],HODNOTA_REGISTRU
nebo v C
Kód: [Vybrat]
*((volatile unsigned int*) ADRESA_REGISTRU) = HODNOTA_REGISTRU;
a je to naprosto ekvivalentní a ovládám HW přímo z C.

IDDQD

Re:Programovani v assembleru
« Odpověď #28 kdy: 25. 07. 2013, 22:39:59 »
Ach jo!

Mirek

Re:Programovani v assembleru
« Odpověď #29 kdy: 26. 07. 2013, 00:12:00 »
V tom se právě mýlíš, jestli myslíš "znalostí assembleru" "znalost všech periferií připojených okolo procesoru nebo na čipu mikrokotroléru", tak to jsou dvě různé věci a je úplně jedno, jestli ty periferie obsluhuješ v assemberu nebo v nějakém vyšším programovacím jazyce. Většinou jsou ty periferie jen namapované někam do adresového prostoru a můžu napsat v assembleru
Kód: [Vybrat]
mov [ADRESA_REGISTRU],HODNOTA_REGISTRU
nebo v C
Kód: [Vybrat]
*((volatile unsigned int*) ADRESA_REGISTRU) = HODNOTA_REGISTRU;
a je to naprosto ekvivalentní a ovládám HW přímo z C.

Díky za objasnění. Teď už rozumím tomu, kde je problém a proč si nerozumíme - a nemyslím to nijak ironicky a ani se nesnažím nad tebe povyšovat, jak mi někdo naznačoval.

Nemá smysl to dál rozebírat, původního tazatele to nezajímá a ještě nějakou dobu zajímat nebude.

Nicméně má zkušenost říká, že dobrý programátor v assembleru zná detailně konkrétní CPU jako takový a to mu přináší výhody při psaní kódu. Bez toho nemůže být opravdu dobrým programátorem.