Rozdíl mezi ASM a strojovým kódem

jjrsk

  • *****
  • 911
    • Zobrazit profil
Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #15 kdy: 10. 03. 2026, 12:14:38 »
...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.



smoofy

  • *****
  • 1 061
    • Zobrazit profil
    • E-mail
Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #16 kdy: 10. 03. 2026, 18:43:45 »
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.

Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #17 kdy: 10. 03. 2026, 19:00:27 »
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í.
„Řemeslo se naučí každý. Umění nikdo.“
„Jednoduchost je nejvyšší úroveň sofistikovanosti.“
- Leonardo Da Vinci

Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #18 kdy: 10. 03. 2026, 20:09:02 »
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.

* Až na pár výjimek, ale to ať si vyřeší uživatelé SAPI-1 různých generací :o

Kit

  • *****
  • 968
    • Zobrazit profil
    • E-mail
Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #19 kdy: 10. 03. 2026, 22:09:58 »
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.


Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #20 kdy: Dnes v 07:49:57 »
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...

xyz

  • ****
  • 297
    • Zobrazit profil
Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #21 kdy: Dnes v 08:20:22 »
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 :)

Re:Rozdíl mezi ASM a strojovým kódem
« Odpověď #22 kdy: Dnes v 10:58:53 »
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.
Citace
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ů). :)
Citace
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.