Asembla lingvo

El Vikipedio, la libera enciklopedio

Komputiko > Programlingvo > Asembla Komputillingvo


Asembla komputillingvo estas legebla de homoj skribosistemo por la maŝina lingvo kiun uzas specifa komputila arĥitekturo. Maŝina lingvo, nura sinsekvo de bitoj, estas legebligita per anstataŭi la originalajn valorojn per simboloj (tial en Esperanto oni ankaŭ uzas la nomon simbola maŝinkodo).

Do, dum komputilo rekonas la ordonon "10110000 01100001", por programistoj estas pli facile memori la egalan reprezenton en asembla lingvo "mov $0x61, %al" (signifas movi la deksesuman valoron 61, dekume 97, al la memorloko 'al').

Malkiel en altnivelaj lingvoj, estas 1-al-1 traduko de simpla asembla lingvo al maŝina lingvo, do komputiloj povas traduki en ambaŭ direktoj sen perdi informojn. Transformi asemblan lingvon en maŝinajn lingvojn estas farita per asemblilo, la alian direkton per malasemblilo. Kiam vera programado estas farita en asembla lingvo, estas kutime en pli komplika speco, kaj la konvena 1-al-1 rilato ne plu estas.

Ĉiu komputila arĥitekturo havas sian propran maŝinan lingvon, kaj tial propran asemblan lingvon (la ĉi-supra ekzemplo estas de la i386). Ĉi tiuj lingvoj malsamas pro la nombro kaj speco de operacioj kiujn ili subtenas. Ili ankaŭ povas havi malsamajn grandecojn kaj nombrojn de reĝistroj, kaj malsamajn reprezentmanierojn de datumtipoj en memoro. Dum ĉiuj ĝeneralcelaj komputiloj kapablas fari escene la samajn aferojn, la maniero malsamas.

Aldone, multoblaj aroj de mnemonikaj simboloj aŭ asembla sintakso povas ekzisti por unuopa instrukciaro. En ĉi tiuj kazoj, la plej populara estas kutime tio uzata de la fabrikanto en la dokumentaro.


Maŝinaj instrukcioj

Simlaj bazaj operacioj estas uzebla en preskaŭ ĉiuj instrukciaroj.

  • movado
    • preni valoron en reĝistron
    • movi datumon el memora loko al reĝistro, aŭ inverse
  • komputado
    • aldoni, subtrahi, multobligi, aŭ dividi la valorojn de du reĝistroj, metante la rezulton en reĝistron.
    • kombini du reĝistrajn valorojn per logika kaj/aŭ
    • nuligi reĝistran valoron aritmetike aŭ per logika ne
  • efiki fluon de programo
    • salti al alia loko en la programo (kutime instrukcioj estas traktataj sinsekve)
    • salti al alia loko, sed ŝpari la sekvan instrukcion kiel revenlokon
    • reiri al la lasta revenloko

Specifaj instrukciaroj ofte havas unuopajn aŭ malmultajn instrukciojn por operacioj por kiu kutime necesus multaj instrukcioj, ekzemple:

  • movi grandajn memorblokojn
  • alta aritmetiko (sine, cosine, kvadrata radiko, ktp.)
  • apliki unu operacion (ekz. aldonadon) al aro de valoroj

Nomoj de la instrukcioj ogte estas diversaj en asmblaj lingvoj por diversaj procesoroj. Ankaŭ por la sama procesoro estadas pluraj diversaj variantoj de asembla lingvo. Tamen estas nomoj de instrukcioj kiuj estas ofte la samaj en diversaj asemblaj lingvoj:

Instrukcio Signifo
jmp senkondiĉa trairo
mov kopiado
cmp komparo
and laŭbita logika KAJ
sub subtraho
dec malpligrandigo je 1
inc pligrandigo je 1
add adicio
mul multipliko
div divido
xor laŭbita logika malinkluziva AŬ
or laŭbita logika AŬ
nop operacio kiu nenion faras
not laŭbita logika NE
ret reveno el funkcio

Instrukcio mov kutime havas 2 argumentojn kaj estas skribita en formo

mov a, b

Direkto de kopiado de la datumoj dependas de la konkreta varianto de asembla lingvo. Povas esti kaj a->b kaj b->a.

Kalkulaj instrukcioj kutime havas 2 argumentojn. Ekzemple adicio aldonas la unu el la argumentoj la alain. Same kiel pri kopiado, kien estas skribita la rezulto dapendas de la konkreta varianto de asembla lingvo. Do

add a, b

estas a+b->aa+b->b .

Ordonoj de asembla lingvo

Aldone al kodoj por maŝinaj instrukcioj, asemblaj lingvoj havas kromajn ordonojn por asembli datumblokojn, kaj doni adreslokojn al instrukcioj 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 profundigitan makroa lingvo 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 kazoj, modernaj tradukiloj povas transformi kodon de altnivelaj lingvoj en maŝinan kodon kiu funkcias same rapide kiel mane verkita kodo en asembla lingvo.

Tamen, iuj *discrete* kalkuloj povas ankoraŭ esti transformitaj en pli rapidan kodon per asemblilo, kaj iuj malaltnivelaĵoj estas pli facile fareblaj en asembla lingvo. Iuj sistemdependaj taskoj faritaj de operaciumoj simple ne povas esti esprimitaj en altnivelaj lingvoj. Multaj tradukiloj transformas kodon de altnivelaj lingvoj en asemblan lingvon antaŭ plene traduki, do la asembla kodo povas esti vidita por sencimigaj kaj optimumigaj celoj.

Eksteraj ligiloj

greke http://www.masm32.com greke http://sourceforge.net/projects/nasm greke http://flatassembler.net greke http://c2.com/cgi/wiki?LearningAssemblyLanguage