Asembla lingvo

Asembla komputillingvo estas skribosistemo por la maŝina lingvo, kiun uzas konkreta komputila arkitekturo, legebla de homoj. Maŝina lingvo, nura sinsekvo de bitoj, estas legebligita anstataŭigante la nombrajn valorojn per vico da ordonsimboloj kaj valoroj (tial en Esperanto oni ankaŭ uzas la nomon simbola maŝinkodo).

Malkiel en altnivelaj lingvoj ebliĝas 1-al-1-traduko de asembla kodo kaj maŝinkodo, do komputiloj povas traduki en ambaŭ direktoj sen perdi informojn. Asemblilo transformas asemblan kodon en la maŝinan; la transformon en la kontraŭa direkto plenumas malasemblilo. Plej ofte vera programado estas farita en asembla lingvo uzante pli altnivelajn kapablojn de la lingvo (minimume nomojn, ofte eĉ makroojn), la 1-al-1-rilato perdiĝas.

Ĉiu procesora arkitekturo havas sian propran maŝinan lingvon, kaj tial propran asemblan lingvon. Ĉi tiuj lingvoj malsamas pro la nombro kaj speco de operacioj kiujn ili disponigas. Ili ankaŭ povas havi malsamajn grandecojn kaj nombrojn de reĝistroj, kaj malsamajn manierojn prezenti datumtipojn en memoro. Kvankam ĉiuj ĝeneralcelaj komputiloj kapablas fari escence la samajn aferojn, la manieroj malsamas.

Aldone, pluraj aroj da mnemonikaj simboloj aŭ pluraj sintaksoj povas ekzisti por unu sama sortimento da komandoj. En tiaj okazoj, la plej populara kutime estas tiu uzata en la dokumentaro de la fabrikanto.

Maŝinaj komandoj 
Similaj bazaj operacioj estas uzeblaj en preskaŭ ĉiuj komandaroj.

 kopii / movi
 kopii datumon el reĝistro al alia reĝistro
 kopii datumon el memora loko al reĝistro aŭ inverse
 komputi
 aldoni, subtrahi, (parte eĉ multipliki aŭ dividi) valorojn en du reĝistroj, metante la rezulton en reĝistron
 perbite kombini du reĝistrajn valorojn per logika "kaj" aŭ logika "aŭ" aŭ logika "malinkluziva aŭ"
 kompari kaj utiligi kondiĉojn
 regi fluon de programo
 salti al alia loko en la programo (kutime komandoj estas traktataj sinsekve)
 salti al alia loko, sed konservi la pozicion de la sekva komando kiel revenlokon
 reiri al la lasta revenloko
 kondiĉe salti

Konkretaj komandaroj ofte havas unuopajn aŭ malmultajn komandojn por oftaj komplikaj operacioj (por kiuj normale necesus multaj unuopaj komandoj), ekzemple:

 movi grandajn memorblokojn
 alta aritmetiko (sinuso, kosinuso, kvadrata radiko, ktp.)
 alta logiko (CRC32 aŭ eĉ kriptografio)
 apliki unu operacion (ekzemple aldonadon) al aro de valoroj

La nomoj de la komandoj varias laŭ la asembla lingvo por diversaj procesoroj. Ankaŭ por unu sama procesoro povas ekzisti pluraj malsimilaj variantoj de asembla lingvo. Tamen iuj nomoj de komandoj ofte samas en diversaj asemblaj lingvoj.

Kelkaj ĉefaj maŝinkomandoj de x86 
Ekzemploj validas por procesoroj Intel x86 kaj similaj.

La komando mov havas du argumentojn kaj estas skribata en la formo mov a, b. La direkto de kopiado de la datumoj dependas de la konkreta varianto de asembla lingvo. Povas esti aŭ de a al b aŭ inverse.

Kalkulaj komandoj kutime havas du argumentojn. Ekzemple adicio aldonas unu el la argumentoj al la alia. Same kiel pri kopiado: kien estas skribota la rezulto dependas de la konkreta varianto de asembla lingvo. Do add a, b povas signifi, ke la valoro a+b estas konservita en a aŭ en b.

Ordonoj de asembla lingvo 
Aldone al kodoj por maŝinaj komandoj, asemblaj lingvoj havas kromajn ordonojn por asembli datumblokojn kaj doni adreslokojn al komandoj aŭ kodo.

Ili kutime havas simplan simbolan kapablon por difini valorojn kiel simbolajn esprimojn, kiuj estas evaluitaj je asembla tempo, ebligante verki kodon kiu estas pli facile legi kaj kompreni.

Ili ankaŭ kutime havas makroan lingvon por plifaciligi la kreon de komplikaj pecoj de kodo aŭ datumoj.

Uzo de asembla lingvo 
Estas iom da polemiko pri la utileco de asembla lingvo. En multaj okazoj, modernaj tradukiloj povas transformi fontan programon el altnivela lingvo en maŝinan kodon funkciantan preskaŭ same rapide kiel mane verkita kodo en asembla lingvo. Sed en la frua epoko asembla lingvo estis pli-malpli devo por kreado de utilaj programoj, tradukiloj de altnivelaj lingvoj aŭ ne ekzistis aŭ ties rezulta kodo estis nepraktike larĝa kaj ruliĝis tro longe.

Tamen, kelkajn komputojn ankaŭ hodiaŭ eblas plirapidigi per asemblilo, kaj kelkaj malaltnivelaĵoj estas pli facile fareblaj en asembla lingvo. Sistemdependaj taskoj faritaj de operaciumoj simple ne povas esti esprimitaj en altnivelaj lingvoj. Multaj tradukiloj transformas kodon de altnivelaj lingvoj en asemblan lingvon antaŭ ol plene traduki, do la asembla kodo povas esti vidita por sencimigaj kaj optimumigaj celoj.

Eksteraj ligiloj 

 http://www.nasm.us
 http://flatassembler.net
 http://c2.com/cgi/wiki?LearningAssemblyLanguage (angla) 

Programlingvoj