Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: dan67 07. 03. 2026, 10:40:29
-
Ahoj všem,
mám volnější "víkendový" dotaz. V souvislostí znovuobjeveného ATARI 130XE (nedávný článek od M.Tauchmana) a o programování pro ATARI 8bity (od P.Tišnovského).
Zavzpomínal jsem na své pozdně pubertální hrátky s Atari, pokusy o něco jako programování...
Assembler a strojový kod vnímám jako jedno a to samé. Stroják jsou jen čísla, ASM jsou místo "některých čísel" zkratky instrukcí procesoru. Jinak v tom zásadní rozdíl nevidím.
Kromě ulehčení v ASM editoru, který pomáhá se skoky, resp. adresací skoků. Což bych si mohl spočítat taky sám, stejně jako jsem si časem zapamatoval kody ASM instrukcí.
Případně přenositelnost, kdy stejná instrukce na jiném procesoru má jiný kod.
Nebo mi, jako laikovi, ještě něco uniká? V souvoslosti s 8bity, moderní procesory jsou jiná liga.
Nechystám se začít programovat, jen tak vzpomínám.
-
Záleží na "kompilátoru". Některý uměly i složitější věci jako například makra. Ale jinak to víceméně vidím podobně - je to strojový kód v "lehce čitelnější" podobě.
-
Divna otazka. I Photoshop muzete napsat ve strojovem kodu (pokud se predtim zasobite dostatecnym mnozstvim elixiru mladi nebo si poridite poradnej autismus). Jestli mezi psanim v assembleru a strojovem kodu nevidite rozdil, tak jste asi nepsal rozsahlejsi veci.
-
Assembler je program, který překládá zdrojový kód v jazyce symbolických adres. Přeneseně, ale chybně, se tak nazývá i ten jazyk.
Takže ty si ty adresy klidně můžeš spočítat ručně a nacvakat binární program přímo do paměti, jako se to dělalo třeba na tom PMI-80, nebo si je pojmenuješ slovy a on ti jejich hodnoty spočítá sám. Jinak ten kód píšeš pořád ve strojáku, akorát s pomocí mnemotechnických zkratek názvů instrukcí, a ne jejich číselného vyjádření. Viz Bowen's Cards: http://www.textfiles.com/programming/CARDS/ (http://www.textfiles.com/programming/CARDS/)
-
Radovan ma pravdu tak s polovice. Zabudol na tu najdolezitejsiu cast a pritom ju ma priamo pred ocami:
Jedna sa o JAZYK SYMBOLICKYCH ADRES.
To je ten zasadny rozdiel medzi strojakom a "assemblerom" (teda spravne jazykom symbolickych adres)
STROJAK: je jedno ci ho pisete rovno v hex kodoch alebo pouzivate mnemonicke pomocky (nazvy instrukcii). Pointa je, ze mate pevne vypocitane adresy skokov, podprogramov, dat, atd...
V pripade akejkolvek upravy kodu ste v riti a musite to prepocitat znova.
JAZYK SYMBOLICKYCH ADRES: Kludne mozete pouzit aj hex kody (tam, kde adresa nieje pevne "zasita" v kode instrukcie). Podstatne je, ze skoky su dane symbolickymi navestiami (a nie len skoky, ale v podstate vsetky adresy).
Realne adresy sa vypocitaju az pri preklade. A nerobite to rucne, ale prekladac sa postara.
Upravy kodu su easy...
-
ASM - rozumím a jsem schopen pochopit.
Strojový kód - změť hex znaků ( většinou ), kterou vím jak a kam nahrát, ale bez dalších pomůcek nechápu co dělá.
-
ASM - rozumím a jsem schopen pochopit.
Strojový kód - změť hex znaků ( většinou ), kterou vím jak a kam nahrát, ale bez dalších pomůcek nechápu co dělá.
ucit se hexa kody instrukci a parametru melo smysl maximalne u 8-bitovych pocitacu, dale uz to nema smysl.
ale assembler je dobre znat, zakladni smycky, podminky, nacitani dat.
assembler je dobry, ale blbeji se pracuje se strukturami. mi se spise prestava libit vysoce abstraktni kod a spise se vracim k cecku.
-
Pointa je, ze mate pevne vypocitane adresy skokov, podprogramov, dat, atd...
Nebo také ne, pokud je to relokovatelný kód, který obsahuje relativní skoky a ostatní si počítá za běhu sám ;)
Ale lepší, než psát tu román, bude příklad. Tohle je strojový kód:
14,31,186,10,1,180,9,205,33,195,72,101,108,108,111,32,87,111,114,108,100,33,36
Tohle je jazyk symbolických adres:
org 100h
push cs
pop ds
mov dx,text
mov ah,9
int 21h
ret
text: db 'Hello World!$'
Co je tohle?
org 100h
push cs
pop ds
mov dx,266
mov ah,9
int 21h
ret
db 'Hello World!$'
A něco na odlehčení: https://www.youtube.com/watch?v=rCuEoht4fGY (https://www.youtube.com/watch?v=rCuEoht4fGY)
-
Pointa je, ze mate pevne vypocitane adresy skokov, podprogramov, dat, atd...
Nebo také ne, pokud je to relokovatelný kód, který obsahuje relativní skoky a ostatní si počítá za běhu sám ;)
Cely ten tvoj relokovatelny kod sa rozsype v momente, ked do neho vlozim dalsie instrukcie - tvoje relativne skoky budu ukazovat uplne inde ako treba.
Ale lepší, než psát tu román, bude příklad. Tohle je strojový kód:
14,31,186,10,1,180,9,205,33,195,72,101,108,108,111,32,87,111,114,108,100,33,36
Toto: "00 00 00 00 00" je tiez strojovy kod. Je lahko pochopitelny, relokovatelny, atd... Ale na zaklade tohto prikladu nebudem tvrdit, ze akykolvek strojovy kod je lahko pochopitelny, relokovatelny, atd...
Tohle je jazyk symbolických adres:
org 100h
push cs
pop ds
mov dx,text
mov ah,9
int 21h
ret
text: db 'Hello World!$'
To je ukazka, ako ma vyzerat kod, ktory bude funkcny a pouzitelny
Co je tohle?
org 100h
push cs
pop ds
mov dx,266
mov ah,9
int 21h
ret
db 'Hello World!$'
To je ukazka, ako to nerobit. Lebo potom pride niekto kto medzi "ret" a "db 'Hello World!$'" vlozi cokolvek (dalsie data, iny podprogram...) a si v riti.
A něco na odlehčení: https://www.youtube.com/watch?v=rCuEoht4fGY (https://www.youtube.com/watch?v=rCuEoht4fGY)
-
Na Didaktiku, klonu ZX Spectra, jsem po Basicu chtel zkusit neco vic na urovni hw a zkusil jsem proniknout do strojaku. Nemel jsem tehdy zadny sw, takze jsem se ucil procesorove instrukce a jejich ciselny zapis a pak vse zapsal na papir - sled cisel, ktere jsem nasledne ukladal do pameti v Basicu a pak jen spustil kod pomoci RANDOMIZE USR -adresa-
Pozdeji jsem si sehnal program Prometheus, coz je editor, monitor a disassembler. Psat pak v assembleru bylo mnohem pohodlnejsi nez prepisovat nejaka cisla. Je z toho jasne, co je co? :)
-
ASM - rozumím a jsem schopen pochopit.
Strojový kód - změť hex znaků ( většinou ), kterou vím jak a kam nahrát, ale bez dalších pomůcek nechápu co dělá.
Strojový kód je změtí nul a jedniček, často organizovaný do změti hexadecimálních znaků, které někteří zkušení programátoři umí číst. Bohužel je specifický pro daný procesor, resp. rodinu procesorů. Proto vznikly programovací jazyky, aby programátora odstínily od fyzického procesoru. Jedním z prvních pokusu byl jazyk symbolických instrukcí (resp. adres) kompilovaný programem Assembler. Jako první pokus dobrý, usnadnil psaní programů, ale stále neřešil problémy mezi rodinami procesorů. Teprve jazyk C vyřešil přenositelnost.
-
Teprve jazyk C vyřešil přenositelnost.
V rámci možností. Pokud člověk například nepotřebuje vědět, jestli char je signed nebo unsigned. Nebo jak velký je int. Viz nedávné flame vlákno o bit shiftování signed intu.
-
Teprve jazyk C vyřešil přenositelnost.
V rámci možností. Pokud člověk například nepotřebuje vědět, jestli char je signed nebo unsigned. Nebo jak velký je int. Viz nedávné flame vlákno o bit shiftování signed intu.
To jsou zase plky :D
Pokud někdo potřebuje zajistit přesnou velikost typu přenositelným způsobem, tak na to je knihovna <stdint.h>, která je součást standardu. Jestli je něco signed nebo unsigned jazyk definuje taky - že to pak nějaký kompilátor overridne je druhá věc. A bit shift signed intu je prostě UB, tak shiftuj unsigned a taky máš přenositelný program.
-
Ahoj,
díky všem za reakce a odpovědi.
Pro mě, naprostého počítačového samouka, bez žádného oficiálního IT vzdělání, jsem si to myslel správně (s lemnými nuiancemi).
-
Cely ten tvoj relokovatelny kod sa rozsype v momente, ked do neho vlozim dalsie instrukcie - tvoje relativne skoky budu ukazovat uplne inde ako treba.
Pouze pokud ho vložíš dovnitř těch skoků. A samozřejmě tak rozbiješ jakýkoliv kód složitější než "00 00 00 00 00"...
Ale neřekl bych že jsme ve sporu, na tom ostatním se shodneme 8)
A to co popisuje McFly se dá dělat i na PC, z BASICu si můžu stroják, stejně jako kdysi na Didaktiku, napoukovat přímo do paměti a rovnou spustit, nebo si ho uložit pro pozdější použití:
10 OPEN "hello.com" FOR OUTPUT AS #1
20 FOR i = 1 TO 23
30 READ b
40 PRINT #1, CHR$(b);
50 NEXT i
60 CLOSE #1
70 SYSTEM
80 DATA 14,31,186,10,1,180,9,205,33,195
90 DATA 72,101,108,108,111,32,87,111,114,108,100,33,36Teda, ne že bych tohle dnes chtěl, nebo někomu radil, takhle dělat, ale prostě to jde ;D
dan67: Ty největší a nejdůležitější věci vymysleli samouci bez oficiálního IT vzdělání, především proto, že takové ještě vůbec neexistovalo. Oni ho stvořili: https://www.youtube.com/watch?v=oE2uls6iIEU (https://www.youtube.com/watch?v=oE2uls6iIEU)
-
...Assembler a strojový kod vnímám jako jedno a to samé. ...
Nj, to jsou ty zaklady ...
Mile deti, zatimco asm lze prelozit pro ruzna CPU, tak strojak je proste omezen na jedno konkretni (nejen)* cpu. Ta cisla co z toho vypadnou proste muzou byt ruzna.
*Soucasti muze byt samozrejme kod i pro dalsi chipy.
-
Mile deti, zatimco asm lze prelozit pro ruzna CPU, tak strojak je proste omezen na jedno konkretni (nejen)* cpu. Ta cisla co z toho vypadnou proste muzou byt ruzna.
ASM nelze prelozit pro ruzna CPU. Kazda CPU architektura ma vlastni asm ve kterem je psany ten kod. No a ta cisla co z toho vypadnou budou z principu pro danou architekturu vzdycky stejna.
Kdyz se podivas na zdrojove kody nejakeho open source OS co podporuje vice platforem tak tam presne uvidis, ze to ma nejakou low level vrstvu v asm ktera je platform specific a nad ni teprve je ta spolecna univerzalni pro vsechny platformy v nejakem vyssim programovacim jazyku. Presne takhle funguje crosscompilace. Ty doslova rikas compilatoru, pro jakou architekturu ma prekladat ten vyssi jazyk. Sice to tam nebude fungovat, prave kvuli tomu ze ty instrukce nedavaji tomu tvemu CPU smysl, ale zkompilovat to v pohode pujde.
-
Assembler a strojový kód je defakto to samé, s jedním docela zásadním rozdílem. Strojovým kódem se myslí to, co vyleze z assembler editoru. Programovat ve strojovém kódu znamená psát rovnou v číslech které daný procesor vykonává jako instrukce a přepočítávat i relativní skoky, absolutní skoky apod.
Strojový kód je je prostě jen hromada čísel.
Assembler je editor, který programátora odstíní od strojového kódu tím, že to pěkně píše v IDE a to pak vygeneruje ta čísla kterým CPU rozumí.
-
zatimco asm lze prelozit pro ruzna CPU
Ehm... Ne. Proto, aby tohle šlo, vymysleli před 1000110 lety FORTRAN.
Ono je to ještě zajímavější, protože například stroják pro Intel 8080 na Zilogu Z80 spustit jde*, ale zdroják pro assembler i8080 v assembleru pro Z80 zkompilovat nejde. Má sice stejné opkódy, ale úplně jinou mnemoniku instrukcí :P
Takže bych ještě zdůraznil to, co už tu párkrát porůznu zaznělo, tedy že ten "assembler" je strojový kód zapsaný lidským jazykem.
A kdo chce vědět co programování přímo ve strojovém kódu obnáší a umožňuje, přečte si http://www.catb.org/jargon/html/story-of-mel.html (http://www.catb.org/jargon/html/story-of-mel.html).
* Až na pár výjimek, ale to ať si vyřeší uživatelé SAPI-1 různých generací :o
-
Assembler je editor, který programátora odstíní od strojového kódu tím, že to pěkně píše v IDE a to pak vygeneruje ta čísla kterým CPU rozumí.
Assembler není editor, ale aplikace, která kompiluje program z jazyka symbolických instrukcí do strojového kódu.
-
Co jako laik jsem pochopil z článků od p. Tišnovského, tak ASM je zápis symbolický, jak má cpu zpracovávat program, dokonce díky návěští nemusím si pamatovat adresní místa, díky makroassembleru (rozšíření) mohu některé věci "schovat" ze zdrojového kódu a nechat je expandovat až během překladu (zvyšuje to čitelnost a srozumitelnost), návěští navíc nás zbavují "špagety" stylu (což v Basicu je pěkný vopruz) a hlavně, překladem nemusíme vždy dostat stejný strojový kód, záleží na optimalizacích, které si volitelně aktivujeme, tím balancujeme mezi rychlostí a velikostí strojového kódu.
Na konec bych chtěl zdůraznit jednouché review po půl roce, kdy je třeba udělat úpravu. V ASM zápisu se to dá najít docela rychle a jednoduše udělat "patch", ve strojovém kódu se to většinou dá řešit jen NOP nebo JMP, protože fixní adresy...
-
Já jsem kdysi programoval krátké rutiny ve strojovém kódu na počítači se Z80. Ten počítač měl operační systém CP/M + interpret BASICu.
Do paměti jsem zapsal instrukce a pak pustil od té určitě paměti. Když jsem se zacyklil, musel jsem na zadní straně počítače resetovat pin tužkou. Assembler nebyl k dispozici :)
-
Teprve jazyk C vyřešil přenositelnost.
V rámci možností. Pokud člověk například nepotřebuje vědět, jestli char je signed nebo unsigned. Nebo jak velký je int. Viz nedávné flame vlákno o bit shiftování signed intu.
To jsou zase plky :D
Pokud někdo potřebuje zajistit přesnou velikost typu přenositelným způsobem, tak na to je knihovna <stdint.h>, která je součást standardu.
Otázka do flamu. Pokud použiju separátní tool (který ani nezná kompletní syntaxi C) abych jím lepil platformně závislé kousky textu dohromady, můžu ještě mluvit o přenositelném jazyce? Protože s preprocesorem tak jde psát přenositelně i assembler.
A věci jako endiany nebo jestli mám vůbec dvojkový doplněk se zjišťují hůř. Ty jako makro naservírované nedostanu.
Jestli je něco signed nebo unsigned jazyk definuje taky - že to pak nějaký kompilátor overridne je druhá věc.
Tak zrovna u charu je to "implementation defined". Takže jazyk C definuje jen to, že to kompilátor "overridnout" prostě musí.
A proto jsou taky "char", "signed char" a "unsigned char" 3 různé typy (aby to nebylo nudné jako u intů). :)
A bit shift signed intu je prostě UB, tak shiftuj unsigned a taky máš přenositelný program.
Ano, v C se dá psát přenositelný kód. Ale protože je to jazyk z punkových časů, tak toho ta přenositelná podmnožina až tak moc neumí. A málo šedivé programátory to může překvapit, protože spousta těch věcí z dnešního pohledu už fakt nedává smysl.
A abych přispěl i k původní otázce, tak rozdíl mezi assemblerem a strojákem nemusí být jen ty symbolické adresy. U DSPček (myslím že to bylo nějaké TMS320) jsem potkal i to, že pipeline nebyla maskovaná. Instrukce ve strojáku byly v pořadí v jakém se cpaly do pipeliny, ne v jakém se nakonec vykonaly. Takže assembler i přerovnával instrukce (podle latence + přidával potřebné nopy) z lidsky čitelného pořadí do toho jejich hnusnopekla.