Sunteți pe pagina 1din 17

info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...

1of17 05.11.200623:18
BotauCristian 15August2005
info.devNet
Introducereinasamblare
Limbajuldeasamblare:avantajesidezavantajeinfolosirealui
Desi este unul dintre cele mai vechi limbaje de programare, limbajul de asamblare
esteincorporat sincelemainoicompilatoarecumarfiVisual C++siDelphi.Codulde
asamblare este foarte apropiat de codul executabil al programelor, asamblorul avand
roluldeacodificainstructiuniledinlimbajdeasamblareincodmasina.
In prezent, limbajul de asamblare este din ce in ce mai putin folosit in scrierea
programelor,deoarececompilatoareledeultimageneratieaufunctiilecelemaifolositede
programatoridejascrisesioptimizateinlimbajdeasamblare(genmemmove,memset/
fillchar,etc.)incluseinuniturisibiblioteci.Bineinteles,dacasedoresteatingereaunor
timpi de executie foarte mici, folosirea limbajului de asamblare este preferabila (cand
avemalgoritmuldecomplexitateoptima).
Avantajealelimbajuluideasamblare
Vitezafoartemaretheexecutieaprogramelor(uneleprogramescrisesioptimizate
inasamblareauvitezadeexecutiepanala510deorimaimaredecatcelescrise
inCsauPascal)
Marimeacoduluiexecutabilestefoartemica
Ajuta utilizatorul sa inteleaga mai bine cum functioneaza microprocesorul si sa
scrieprogrameeficientesiinHighLevelLanguages.
Dezavantajealelimbajuluideasamblare
nu este portabil un program scris pentru calculatoare IBM PC nu va rula pe un
AppleMacintosh(diferauneleinstructiuni)
un program in asamblare este mai greu de scris si ia mai mult timp decat un
programscrisinPascalsauC
unprogramscrisinasamblareestemaigreudedepanat
Majoritateacompilatoarelordinprezentpermitprogramatoruluisascrieanumiteparti
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
2of17 05.11.200623:18
de cod sau subprograme in asamblare, astfel incat programatorul sa poata scrie in
asamblare doar partea din program care se executa de cele mai multe ori, programul
ruland astfel mult mai rapid. Sunt si compilatoare dedicate exclusiv limbajului de
asamblare, cum ar fi TASM Turbo Assembler (il gasiti in directorul BP/Bin), MASM
MicrosoftAssembler,etc.
Pentru a scrie o secventa de limbaj de asamblare intrun program C se foloseste
cuvantulrezervatasm:
asm{instructiuniinasamblare}
iarinpascal:
asm
codasamblare
end.
Notiunidebazaalelimbajuluideasamblare
Registrii
Limbajul de asamblare este foarte apropiat de codul executabil, deci pentru ca
programatorul sa fie capabil sa scrie codul in asamblare trebuie sa cunoasca modul in
carefunctioneazamicroprocesorulsimodulincareacestaexecutainstructiunile.
Toateoperatiilearitmetice/logice/acceslamemoriesefacprinintermediulregistrilor.
Registrii microprocesorului sunt asemanatori variabilelor (pot fi initializati cu anumite
valori,sepotefectuaoperatiiasupralor,potfiaccesati(cititi/modificati)).
Registriimicroprocesoruluisuntclasificatiinmaimultecategorii:
registrideuzgeneral:eax,ebx,ecx,edxsisubregistriilor
registri segment : cs (code segment), ds (data segment), es (extra segment), ss
(stack segment) sunt folositi pentru adresarea memoriei in cazul modelului de
memoriesegmentat
registriiindex:esi,edi(sourceindex,destinationindex)
registrispeciali:ebp,esp,ip
Registrii de uz general sunt folositi in executia operatiilor aritmetice si logice.
Registriidesegmentsiceiindexsuntfolositiinadresareamemoriei,iarceispecialisunt
folositidemicroprocesorsiS.O.pentrurulareaprogramelor.
Registriideuzgeneral
Acestiasunt:
eaxnumitsi"accumulator"acestaestecelmaifolositinexecutareaoperatiilor
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
3of17 05.11.200623:18
aritmetice(adunare,scadere,inmultire,impartire)
ebx numit si "base" acesta registru este folosit pentru adresarea indirecta a
memoriei
ecxnumitsi"count"acestregistruestefolositmaialesincadrul"buclelor"(in
instructiunilerepetitivefor/whiledo/dowhile/repeatuntil)
edxnumitsi"data"retineanumitevariabile,siestefolositimpreunacueaxin
executarea operatiei "div" impartire intreaga (avand rolul de a retine restul
impartirii).
Dupa cum ati observat, fiecare registru general are o functie specifica, insa oricare
dineipotfifolositisilaoperatiiaritmetice/logice,adresarememoriesaucasivariabile.
Registriiprecedatideprefixul"e"sunt"pe32debiti",decipotfitrataticasivariabile
unsigned long/signed long (doubleword). Acestia pot fi folositi si ca registri pe 16 biti
(word) sau pe 8 biti (byte) prin intermediul "subregistrilor" : ax, bx, cx, dx (reprezinta
wordulnesemnificativ=celdindreapta).,ah,bh,ch,dh(byteulcelmaisemnificatival
ax,bx,cx,dx),al,bl,cl,dl(registriipe8biti).
Registriidesegmentsiindex
Acestiregistrisuntfolositilaadresareamemoriei.
Deexemplu
Avemvariabilavoid*x(x:pointerinpascal)
pentrumodeluldememoriesegmentata,inadresareamemorieiadresatedexsefolosesc
intructiunile(vezi"Intructiuniledebazaaleunuimicroprocesor8086"):
//es:[di]vaaccesaadresapointatadex
lesdi,x
//secopiazainaxprimulword
//delaadresaes:[di]
movax,es:[di]
//secopiazainalceldeal3leabyte
//delaadresaes:[di]
moval,es:[di+2]
Parantezeledreptesereferalazonadememorieadresataderegistru.
Exemplu:
"[esi]"sereferalavaloareaaflatalaadresadememoriecuoffsetulesi,iar"esi"
sereferalavaloareastocatainregistrulesi
dacaesi=100atunci[esi]vareprezentavaloareacareseaflalaadresacu
offsetul100,iaresivareprezentavaloarea100.
VasfatuiescsaNUincercatisamodificatiurmatoriiregistri:cs(carecontine
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
4of17 05.11.200623:18
segmentullacareseaflaincarcatcodulexecutabilului,sscontinesegmentulde
memorieincareseaflastivasistemului).
Registriispeciali
Suntfolositifoarterarinscriereaefectivaaprogramelor,decinuvetiaccesaprea
desacestiregistri.Deexemplu,ip(instructionpointer)careretineadresa(defapt
offsetul)lacareseaflainstructiuneacareurmeazasafieexecutata.
Flagurilemicroprocesorului
Flagurilemicroprocesoruluisuntasemanatoareunorvariabileboolene.Cuajutorul
lorputemaflarezultatuluneicomparatiisaudacaooperatieaprodus"overflow",etc.
Acesteflagurinupotfiaccesatedirectcasiregistrii,citestareadacaunflageste
activatsefaceprinintermediul"jump"urilorconditionate.(veziinstructiuneacmp).
Exemplu:
Fieax=1.Decrementarealuiaxcu1vaducelaactivareaflaguluinumit
ZeroFlag.(rezultatuloperatieiafost0).
Fieax=65535(0xFFFF).Incrementarealuiaxcu2vaducelasetareaflaguluinumit
OverflowFlag(rezultatuloperatieinu"incape"in16biti)
Instructiuniledebazaalemicroprocesorului8086:
Suntfolositeurmatoareleprescurtari:
reg8/reg16/reg32sereferalaregistripe8/16/32biti
imm8/imm16/imm32sereferalavaloriimediate(constante)
mem8/mem16/mem32zonamemoriedememoriesauvariabilepe8/16/32
biti
Scriere/Citirememoriesiregistri
InstructiuneaMOV
Sintaxa
movdest,source//echivalentacudest=source
Variante
movreg8/16/32,mem8/16/32
movreg8/16/32,reg8/16/32
movmem8/16/32,reg8/16/32
movreg8/16/32,imm8/16/32
movmem8/16/32,imm8/16/32
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
5of17 05.11.200623:18
Descriere
Instructiuneacopiazaovaloaredintrolocatieinaltalocatie.Aceastalocatiepoatefi
zona de memorie, variabila, registru. De retinut este ca nu exista variante ale
instructiuniicarecopiazadirectdintrozonadememorieinalta.
Flaguriafectate
Instructiuneamovnumodificaniciunflag.
Restrictii
Ambiioperanzitrebuiesaaibaaceeasimarime.Deexemplupentruultimavariantaa
instructiunii mov trebuie specificata marimea zonei de memorie. Instructiunea "mov
[bx],0"nuestecorectadeoarececompilatorulnustiecevreasafacainstructiunea:sa
copieze valoarea 0 in byteul, in wordul sau in doublewordul de la adresa bx. Astfel
variantelecorectesunt:
movbyteptr[bx],0
movwordptr[bx],0
movdwordptr[bx],0
Exemplu
movax,3//ax=3
movbx,ax//bx=ax
Instructiuniaritmetice
InstructiunileADD,SUB,INC,DEC
Sintaxa
adddest,source//echivalentacudest+=source
subdest,source//echivalentacudest=source
incdest//echivalentacudest++
decdest//echivalentacudest
Variante
add(sub)reg8/16/32,mem8/16/32
add(sub)reg8/16/32,reg8/16/32
add(sub)mem8/16/32,reg8/16/32
add(sub)reg8/16/32,imm8/16/32
add(sub)mem8/16/32,imm8/16/32
Descriere
Instructiunea"add"estefolositapentruaadunadouavalori,"sub"pentruascadeao
valoaredinalta,incincrementareauneivariabile,"dec"decrementareauneivariabile
(registru/memorie).
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
6of17 05.11.200623:18
Flaguriafectate
Flagurileafectatedeacesteinstructiunisunt:
carryflagpentru"signedoverflow"
overflowflagpentruoverflow
signflagactivatdacarezultatulestenegativ
zeroflagactivatdacarezultatuloperatieiafost0
parityflagestesetatinfunctiedeparitatearezultatului
Restrictii
Destinatiatrebuiesaaibaaceeasimarimecasisursa.
Exemplu
movax,3//ax=3
addbx,ax//bx=ax+3
Instructiunipebiti
InstructiunileAND,TEST,OR,XOR,NOT
Sintaxa
anddest,source//echivalentacudest&=source
testdest,source//dest&source
ordest,source//echivalentacudest|=source
xordest,source//echivalentacudest^=source
notdest//~dest
Variante
Pentru "and", "or", "test", "xor" sunt ca si cele de la add. Pentru "not" avem doua
variante:
notreg8/16/32
notmem
Descriere
Executa operatiile pe biti corespunzatoare. Instructiunea test (nondestructive
and)esteasemanatoareluiand,darnuafecteazarezultatulcidoarflagurile.
Flaguriafectate
Instructiunea"not"nuafecteazaniciunflag.
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
7of17 05.11.200623:18
Flagurileafectatedecelalalteinstructiunisunt:
carry,overflowledezactiveaza
signflagestecopiatbitulcelmaisemnificativdinrezultat(semnulrezultatului,de
fapt)
zeroflagactivatdacarezultatuloperatieiafost0
parityflagestesetatinfunctiedeparitatearezultatului
Restrictii
Destinatiatrebuiesaaibaaceeasimarimecasisursa.
Instructinile OR/XOR/INC/DEC modifica flagurile microprocesorului: Carry(numai
ADD/SUB),Overflow,Zero,Parity.
Exemplu
movax,5//ax=3
testax,1//daca(ax&1)
jz@skip//dacaaxestenuesteimparsarila@skip
//executainstructiuni
@skip
andbx,FFFEh//bx=bx&0xFFFE(sesterge
//bitulcelmainesemnificativ)
InstructiunilePUSH/POP
Descriere
Acesteinstructiunisuntfolositepentruaccesareastiveisistemului.Instructiunea
PUSHpunepestivasistemuluiovaloare,iarinstructiuneaPOPextragevaloareadin
varfulstivei.
Sintaxa
pushval
popval
Variante
pushreg8/16/32
popreg8/16/32
Exemplu
@lp:
pushcx//salvamvaloareacx
...//prelucreazadatele,sepoatemodificacx
popcx//scoatedepestivavaloareacx
deccx
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
8of17 05.11.200623:18
jnz@lp//daca(cx!=0)atuncisariinapoila@lp
InstructiuneaCMP
Descriere
Comparadouavalorisiseteazaflagurilemicroprocesoruluicurezultatelecompararii.
Decelemaimulteoriestefolositaincombinatiecujumpurile(vezimaijos).
Sintaxa
cmpval1,val2
Variante
cmpreg8/16/32,reg8/16/32
cmpreg8/16/32,imm8/16/32
cmpmem8/16/32,reg8/16/32
cmpmem8/16/32,imm8/16/32
Jumpurileneconditionate(JMP)sijumpurileconditionate(JE,JNE,JB,
JBE,JA,JAE,JZ,JNZ)
Aceste instructiuni sunt folosite pentru generarea instructiunilor If /while do /do
while/repeat/for.SuntasemanatoareinstructiuniigotodinC/Pascal.
Sintaxa:instructiunelabel
JE"sare"cuexecutiaprogramuluilalabeldacaflagulequalityestesetat
JNE"sare"cuexecutiaprogramuluilalabeldacaflagulequalitynuestesetat
JB"sare"cuexecutiaprogramuluilalabeldacaflagulbelowestesetat
JBE"sare"cuexecutiaprogramuluilalabeldacaflagulbelowsauflagulequalityeste
setat
JA"sare"cuexecutiaprogramuluilalabeldacaflagulbelownuestesetat
JAE"sare"cuexecutiaprogramuluilalabeldacaflagulequalityestesetatsauflagul
belownuestesetat
JZ"sare"cuexecutiaprogramuluilalabeldacaflagulzeroestesetat
JNZ"sare"cuexecutiaprogramuluilalabeldacaflagulzeronuestesetat
JMP"sare"cuexecutiaprogramuluilalabel
Exemplu:
movax,1
@loop:
instr1
instr2

info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
9of17 05.11.200623:18
incax
//comparaaxcuvaloarea10
//siseteazaflagurile
cmpax,10
//dacaax!=10sariinapoila@loop
jne@loop
Exemplul2:
instr1
jmp@label1
instr2
instr3
@label1:
In ultimulexemplu instr2 si instr3nu vor fi executate deoarece inaintea lor se afla
instructiunea jump care face ca programul sa sara cu executia la instructiunea imediat
urmatoareetichetei"label1".
InstructiuneaLOOP
Instructiunea"loop"estefolositadeobiceiintranscriereaforurilorsiabuclelor.
Sintaxa
looplabel
Descriere
Echivalentacu:
dececx(saudeccx)
jzlabel
InstructiuneaINT
Descriere
InstructiuneaINTapealeazaointrerupere.
Sintaxa
INTnr_intrerupere(unnumarcuprinsintre0si255)
Intreruperileoprescprogramuldinrulare,executaunanumitcodsiapoipermit
continuarearulariiprogramului.Cuajutorulapeluluiintreruperiloraplicatiapoatesa
comunicecusistemuldeoperare,sicuunelecomponentehardwarealecalculatorului
(mouseul,tastatura,imprimanta,etc).Fiecareintrerupereareasociatunnumar.
Exempledeintreruperi:
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
10of17 05.11.200623:18
0x9:intrerupereapentrutastatura
0x10:intrerupereacareoferaserviciileBIOSpentruaccesullaplacavideo
0x21:intrerupereasistemuluideoperareDOS
0x33:intrerupereapentrumouse
InDOSpentruinitializareamouseuluisevaapela
functianumarul0aintreruperii0x33:
asm
{
movax,0
//seteazaregistrulaxcuvaloarea0pentruca
//driverulcegestioneazaintreruperea0x33
//sastiecatrebuiesainitializezemouseul
int0x33
}
Pentruafisareamouseului:
asm
{
movax,1
int0x33
}
Pentruascundereacursoruluidelamouse:
asm
{
movax,2
int0x33
}
TranscriereaunorinstructiuniC/PASCALinasamblare
IFcondTHENinstr
Exemplu:if(a==5)b=a//a,binteger
movax,a
cmpax,5
//neintrebamdaca!cond
jnz@skip_if
movb,ax
@skip_if:
IFcondTHENinstr1ELSEinstr2
Exemplu:if(a==b)a=belseb=a
Transcriereainasamblare:
movax,a
movbx,b
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
11of17 05.11.200623:18
//comparaaxcubxsiseteazaflagurile
cmpax,bx
je@if_then
//if(ax==bx)sarila@if_then
subb,ax
jmp@end_if:
@if_then:
suba,bx
@end_if:
DO{inst}WHILE
Exemplu:
inti,a,n
i=0
a=0
do
{
i++
a+=I
}while(i<=n)
Codulinasamblare:
//cx=0,instructiuneaxorcx,cxeste
//mairapidadecatmovcx,0
xorcx,cx
xorax,ax
movbx,n
@while:
inccx
addax,cx
cmpcx,bx
jne@while
mova,ax
movI,cx
Saufolosindinstructiunealoop(porniminvers):
movcx,n
@while:
addax,cx
loop@while
Incoduldemaisus(primavarianta)putetiobservacatevamicioptimizari:retinerea
variabilelor in registri (accesul la registri este mult mai rapid decat la memorie),
inlocuirea instructiunii mov reg, 0 cu xor reg, reg. Varianta "xor" este mai rapida (desi
movsixor"teoretic"autotatateaceasurideprocesor)deoareceinstructiuneamovreg,
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
12of17 05.11.200623:18
0 transcrisa in cod masina este mai "lunga" (are cu 24 bytes mai mult decat xor reg,
reg). Aceeasi regula se aplica si in cazul "or reg, reg" in testarea daca valoarea unui
registru este egala cu 0, intrucat instructiunea "or" modifica flagurile procesorului
(ZeroFlag). O alta optimizare este folosirea registrului ax pentru calcule (in
majoritateacazurilorinstructiunilecarefolosescregistrul(e)axsuntmairapide).
Programdemonstrativ
ExempludefunctieinrealizatainC/Asamblare(compilatorfolositBC++3.1):
//BSort.CPP
#include<stdio.h>
#include<conio.h>
inta[20],n
voidbsort()
{
asm{
movdi,sega
moves,di
movdi,offseta
//es:[di]inceputulvectorului
//esadresasegment
//diadresaoffset
}
do_while_not_ok:
asm{
//ok=1
movdx,1
//cx=n
movcx,n
//cx=n1
deccx
//ax=a[0]
movax,es:[di]
//punemdipestiva
pushdi
}
inner_for:
asm{
//bx=a[i1]
movbx,ax
//nemutampenouapozitieinvector
adddi,2
//ax=a[i]
movax,es:[di]
//comparamaxcubx(a[i1]cua[i])
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
13of17 05.11.200623:18
cmpbx,ax
//if(a[i1]<=a[i])don'tswap
jbeif_not
//interschimbama[i1]cua[i]
xchgbx,ax
//lescrieminmemorie
moves:[di],ax
moves:[di2],bx
//ok=0
xordx,dx
}
if_not:
asm{
//cx
deccx
jnzinner_for
//dacacx!=0atuncicontinuamforul
popdi
//comparadxcu0
//(mairapiddecatcmpdx,0)
ordx,dx
//if(ok)executamincaodatawhileul
jzdo_while_not_ok
}
}
voidcitire()
{
printf("Numaruldeelemente:")
scanf("%d",&n)
for(inti=0i<ni++)
{
printf("a[%d]=",i)
scanf("%d",&a[i])
}
}
voidafis()
{
for(inti=0i<ni++)
printf("%d",a[i])
}
intmain()
{
citire()
bsort()
afis()
return0
}
VariantaPascal+Asm(compilatacuBP7.0):
programb_sort
const
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
14of17 05.11.200623:18
max_N=1000
n_tests=100
var
N:Integer
a,b:array[1..max_N]ofInteger
procedurecitire
var
f:Text
i:Integer
begin
Assign(f,'bsort.in')Reset(f)
readln(f,N)
fori:=1toNdo
read(f,b[i])
Close(f)
end
procedureflip
var
i:Integer
begin
fori:=1toNdo
a[i]:=b[i]
end
varp:pointer
procedurebsortassembler
asm
{les<=>es=seg(p),di=offset(p)}
lesdi,p
@do_while_not_ok:
movdx,1
movcx,N
deccx
movax,es:[di]
pushdi
@inner_for:
movbx,ax
adddi,2
movax,es:[di]
cmpbx,ax
jbe@if_not
xchgbx,ax
moves:[di],ax
moves:[di2],bx
xordx,dx
@if_not:
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
15of17 05.11.200623:18
deccx
jnz@inner_for
popdi
ordx,dx
jz@do_while_not_ok
end
procedurebsort2
var
ok:Boolean
i,aux:Integer
begin
repeat
ok:=true
fori:=1ton1do
if(a[i]>a[i+1])then
begin
aux:=a[i]
a[i]:=a[i+1]
a[i+1]:=aux
ok:=false
end
untilok
end
var
i:Integer
starttick,endtick:LongInt
time:Longintabsolute$0000:$046C
{timerpentrumasurareatimpului}
consttickspersecond=18.206
procedurestarttimer
begin
starttick:=time
end
functionelapsedtime:real
begin
endtick:=time
elapsedtime:=(endtickstarttick)*
(1/tickspersecond)
end
begin
citire
p:=@a
starttimer
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
16of17 05.11.200623:18
fori:=1ton_testsdo
begin
flip
bsort
end
writeln(n_tests,'rularialebsortinasamblare
aurulatin:',elapsedtime:6:3,'secunde')
starttimer
fori:=1ton_testsdo
begin
flip
bsort2
end
writeln(n_tests,'rularialebsortobisnuit
aurulatin:',
elapsedtime:6:3,'secunde')
end.
Outputprogrampascal(pepculmeu:Duron750Mhz):
100rularialebsortinasamblareaurulatin:1.263secunde
100rularialebsortobisnuitaurulatin:4.614secunde
Deprecizatestecanuamoptimizatprogramulaproapedeloc(amtranscriscoduldin
pascalinasm).Cuoptimizari"hardcore"sepotobtinetimpimultmaibuni.Diferenta
dintrevariantaasmsivariantahighlevellanguageestemaimicapecompilatoarelemai
noi,cumarfiGCCsauFreePascaldeoareceacesteastiugenerauncodmaioptimizat.
Totusi,niciuncompilatornupoatebatecreieruluman.
Linkuri
http://www.arl.wustl.edu/~lockwood/class/cs306/books/
artofasm/toc.html
Cartea"TheArtofAssemblyLanguageProgramming".Estedetaliata.Foartebuna
atatpentruincepatoricatsipentruavansati.
http://www.goof.com/pcg/doc/pentopt.txt
Untutorialbunpentruoptimizareaprogramelorinasamblarepentruprocesoareledin
familiaPentium.Tutorialulestepentruavansati.
info.devNetIntroducereinasamblare http://info.devnet.ro/articole.php?page=art&art=58&artpage=0&prin...
17of17 05.11.200623:18
http://www.techtutorials.info/assembly.html
Maimultetutorialedespreassemblylanguage.
Douacuvinteconclusive...
Acestarticoltrateaza"bazele"programariiinasamblare,dupacumiizicenumele
estedoarointroducere.Pentruastisaprogrameziinasm,trebuieinvatatemultmai
multelucruri.Scopularticoluluiestedeastarniinteresulcititorilorsidealeoferio
imagineasupraacestuilimbaj.Ceicedorescsainvetemaimultedespreassembly
languagesuntinvitatisaciteascacartile/tutorialeledinsectiunealinkuri.

S-ar putea să vă placă și