Documente Academic
Documente Profesional
Documente Cultură
Elaborare
LUCRAREA DE LABORATOR 1
programelor n limbajul de asamblare MASM n Visual Studio
Figura 1.1
n figura 1.1 sunt prezentai regitrii de uz general. Microprocesoarele pe 64 bii conin i alte
seturi de regitri care vor fi discutate la orele de curs.
Regitrii pe 64 bii sunt indicai cu prefixul R (REX). Adresarea la fiecare din 16 regitri se petrece
ca la un registru pe 64-, 32-, 16- sau 8 bii (se folosesc numai biii inferiori). Structura i destinaia
regitrilor va fi detaliat n subcapitolele urmtoare, n descrierea modurilor de compatibilitate.
Figura 1.2
Toi regitrii sunt de 16 bii. O serie de regitri (AX, BX, CX, DX) sunt disponibili i la nivel de
octet, prile mai semnificative fiind AH, BH, CH i DH, iar cele mai puin semnificative, AL, BL, CL
i DL. Denumirile regitrilor sunt:
AX - registru acumulator
BX - registru de baz general
CX - registru contor
DX - registru de date
BP - registru de baz pentru stiv (base pointer)
SP - registru indicator de stiv (stack pointer)
SI - registru index surs
DI - registru index destinaie
Registrul notat FLAGS cuprinde flagurile (bii indicatori) procesorului, sau bistabililor de condiie,
iar registrul IP (instruction pointer) este registrul de instruciuni.
Regitrii de date (AX, BX, CX, DX) pot fi folosii pentru memorarea datelor, ns unele din acetea
sunt folosii special pentru alte scopuri. De exemplu registrul CX este folosit ca contor n instruciunea
LOOP de ciclare, care l modific implicit i-i testeaz valoarea, registrul DX este folosit n
instruciunile de mprire si nmulire, iar registrul BX este folosit pentru adresarea datelor
(operanzilor).
n modul 8086 unui program scris n limbaj de asamblare se aloc patru zone de lucru n
memorie: o zon pentru date, o zon pentru instruciuni, o zon special pentru stiv i o zon
suplimentar pentru date. Fiecare din aceste zone pot avea pn la 64K octei i poart denumirea de
segment. Astfel exist segmentul de date (Data Segment), segmentul de instruciuni, cod (Code
Segment), segmentul de stiv (Stack Segment) si segmentul suplimentar de date (Extra Segment).
Este posibil ca cele 4 segmente sa fie suprapuse total sau parial. Adresele de nceput ale
acestor segmente se afl n 4 regitri segment:
Denumirile regitrilor de segment sunt:
CS - registru de segment de cod (code segment)
DS - registru de segment de date (data segment)
SS - registru de segment de stiv (stack segment)
ES - registru de segment de date suplimentar (extra segment)
Se observ c denumirile regitrilor de segment corespund zonelor principale ale unui program
executabil. Astfel, perechea de regitri (CS:IP) va indica totdeauna adresa urmtoarei instruciuni care
se va executa, iar perechea (SS:SP) indic totdeauna adresa vrfului stivei. Regitrii DS i ES conin
adresele segmentelor de date i sunt folosite pentru a accesa date.
Dac segmentul de date ncepe de la locaia de memorie 1234h atunci DS va conine valoarea
1234h. Exist instruciuni pentru ncrcarea adreselor de memorie n regitrii segment.
Regitrii pointer (SP si BP) se folosesc pentru calculul offset-ului (distanei fa de nceputul unui
segment) din cadrul segmentului. Cei doi regitri pointer sunt: pointerul de stiva SP (Stack Pointer) si
pointerul de baza (Base Pointer). SP si BP sunt regitri de 16 biti.
Registrul SP reine adresa efectiv (offset-ul) a vrfului stivei. Adresa fizic a vrfului stivei SS:SP
este dat de perechea de regitri SS si SP, registrul SS conine adresa de nceput al segmentului de stiva
iar SP conine offset-ul din acest registru (adic distana in octei de la nceputul registrului de stiva):
stiva
SP
Varfulstivei
offset
SS
Baza stivei
Registrul BP este folosit la calculul offset-ului din interiorul unui segment. De exemplu poate fi
folosit ca pointer al unei stive proprii, dar nu a procesorului. Este folosit n principal pentru adresarea
bazat indexat a datelor.
Regitrii de index, de 16 biti sunt: SI (Source Index) si DI (Destination Index). Regitrii de
index sunt folosii pentru accesul la elementele unui tablou sau a unei tabele. Aceti regitri sunt
folosii ndeosebi n prelucrarea irurilor de caractere.
Registrul de instruciuni (Instruction Pointer) conine offsetul curent n segmentul de cod.
Adic adresa efectiv a urmtoarei instruciuni de executat din segmentul de cod curent. Dup
executarea instruciunii curente, microprocesorul preia din IP adresa urmtoarei instruciuni de
executat i incrementeaz corespunztor valoarea lui IP, cu numrul de octei ai codului instruciunii ce
va fi executat. Uneori acest registru se numete numrtor de program.
Registrul de flaguri (fanioane) (bistabili de condiie) al modului 8086 are configuraia din
figura 1.3. O serie de flaguri sunt flaguri de stare: acestea sunt poziionate la 0 sau la 1 ca urmare a
unor operaii aritmetice sau logice, conin informaii despre ultima instruciune executat. Celelalte
flaguri controleaz anumite operaii ale procesorului.
Din cei 16 bii ai registrului sunt folosii 9 bii: 0, 2, 4, 6 11.
Aproape toate instruciunile limbajului de asamblare afecteaz biii de stare.
Semnificaia fagurilor este urmtoarea:
CF (Carry Flag, bistabil de transport) - semnific un transport sau un mprumut din/n bitul cel
mai semnificativ al rezultatului, de exemplu la operaii de adunare sau de scdere.
SF (Sign Flag, bistabil de semn) - este poziionat la 1 dac b.c.m.s. al rezultatului (bitul de
semn) este 1.
OF (Overflow Flag, bistabil de depire) - este poziionat la 1 dac operaia a condus la o
depire de domeniu a rezultatului (la operaii cu sau fr semn).
TF (Trap Flag, bistabil de urmrire) - dac este poziionat la 1, se foreaz o ntrerupere, pe un
nivel predefinit, la execuia fiecrei instruciuni; acest fapt este util n programele de depanare, n
care este posibil rularea pas cu pas a unui program.
IF (Interrupt Flag, bistabil de ntreruperi) - dac este poziionat la 1, procesorul ia n
consideraie ntreruperile hardware externe; altfel, acestea sunt ignorate.
DF (Direction Flag, bistabil de direcie) - precizeaz sensul (cresctor sau descresctor) de
variaie a adreselor la operaiile cu iruri de octei sau de cuvinte.
Flagurile CF, PF, AF, ZF, SF i OF sunt numite flaguri de stare (aritmetice). Flagurile TF, IF i DF sunt
numite flaguri de control.
1.2.2 Modul de compatibilitate pe 32 bii (microprocesor de 32 bii)
Pentru modul de compatibilitate pe 32 bii , sunt utilizate numai prile inferioare pe 32 bii (figura
1.4) ai regitrilor microprocesoarelor pe 64 de bii i setul de regitri utilizat n lucrrile de laborator
este urmtorul:
Figura 1.4
Microprocesoarele de 32 bii sunt compatibile ca arhitectur cu cele de 16 bii, prin aceea ca
regitrii de 16 bii se regsesc ca subregitri ai regitrilor de 32 de bii. Pentru accesarea regitrilor de
32 bii a fost adugat un set de instruciuni.
Regitrii din figur, de exemplu al, ah, ax , indic regitri pe 8 i 16 bii ai registrului extins
eax pe 32 bii (prefix e (Extended)).
Regitrii generali ax, bx, cx, dx, si, di, bp i sp de 16 bii fac parte din regitrii generali de 32 bi i ai
microprocesoarelor de 32 bii extini: eax, ebx, ecx, edx, esi, edi, ebp si esp. Primii 16 bi i din aceti
regitri sunt regitri generali ai microprocesoarelor de 16 biti.
Analog regitrii IP si FLAGS de 16 bii sunt extini la 32 bii in cazul regitrilor EIP i ELAGS
de 32 bii. Registrul FLAGS se regsete n primii 16 bii ai registrului EFLAGS.
Regitrii segment au fost pstrai de 16 bii, dar s-au adugat doi noi regitri FS i GS.
Pe lng aceti regitri, microprocesoarele de 32 (64) de bii dispun de ali regitri de control,
de gestionare a adresei, de depanare i de test, care difer de la un tip de procesor la altul fiind folosite
Figura 1.5
Dac ai instalat pe disc C:\Irvine, n Visual Studio selectai File> Open> Project/Solution i selectai
calea spre fiierul C:\Irvine (locul instalrii Irvine_6th_Edition_VS2010.msi):
C:\Irvine > Examples > ch3 > Project > Project.sln
n fereastra Solution Explorer va aprea Project.
Executai clic dublu stnga pe Project i va aprea programul Main.asm. Executai clic dublu stnga pe
programul Main.asm i va aprea o nou fereastr pentru editare, cu coninutul programului Main.asm
(figura 1.6).
Dac nu apare, executai clic dreapta pe Project i selectai Add> Existing Item i selectai calea spre
exemplul de program surs Main.asm
C:\Irvine > Examples > ch3 > Project > Main.asm i executai clic Add (figura 1.6).
Figura 1.6
n meniul Build, selectai Build Project. n fereastra de ieire pentru Visual Studio, n partea de jos a
ecranului, vor aprea mesajele de dezvoltare (asamblare i editarea legturilor (link)) a programului
(figura 1.7) .
Figura 1.7
n meniul Debug, selectai Start Without Debugging. Va aprea o fereastr cu rezultatul
execuiei programului afiarea unui text MASM program example (figura 1.8).
Figura 1.8
Pentru depnarea programului pas cu pas, executai clicuri F10 (figura 1.9), sgeata galben indic
urmtorul rnd din program care va fi executat. Putei afia starea regitrilor microprocesorului selectnd
meniul Debug, selectai Windows i Registers. Pentru afiarea strii variabilelor selectai meniul
Debug, selectai Windows, Watch>Watch1.
Figura 1.9
1.4 Elaborarea aplicaiilor pe 16 bii
Pentru a elabora aplicaii de 16-bii, este necesar s adugai dou comenzi n meniul Visual
Studio Tools. Pentru a aduga o comand, selectai External Tools din meniul Tools. n fereastra aprut
executai clic pe butonul Add i introducei o nou linie de comand cu titlul Build 16-bit ASM (figura
1.10). n linia Command - C:\Irvine\make16_vs2013.bat, calea spre fiierului make16_vs2013.bat.
Arguments i Initial directory le putei seta executnd clic pe butoanele (dreapta), clic Aply.
Figura 1.10
executai clic pe butonul Add i introducei o nou linie de comand cu titlul Run 16-bit ASM
(figura 1.11). n linia Command - cmd.exe. Arguments i Initial directory le putei seta executnd clic
pe butoanele (dreapta), clic Aply. (Close on exit nu se bifeaz)
Figura 1.11
Deseori aplicaiile pe 16-bii nu ruleaz direct n versiunile Windows pe 64 de bii , deoarece
acceseaz direct hardware-ul i memoria de sistem. n acest caz se folosete utilitarul DOSBox.
Descrcai i instalai DOSBox. Iar linia de comand cu titlul Run 16-bit ASM modificai conform
figurii 1.12. n linia Command indicai calea spre DOSBox.exe . Bifai Prompt for arguments.
Figura 1.12
n fereastra aprut introducei denumirea fiierului cu extensia .exe
Pentru ca rndurile codului s fie numerotate selectai Tools> Options> Text Editor> All Languages >
i bifai, n fereastra din dreapta, Line Numbers.
main PROC
mov ax,@data
mov ds,ax
mov ah,9
Int 21h
mov ah,1
Int 21h
cmp al,'y'
jz IsDad
cmp al,'n'
jz IsNud
Int 21h
mov ah,1
Int 21h
Exit
10
main ENDP
END main
11
Se remarca urmatoarele:
1. Fiierul Irvine16.inc conine un set de proceduri, macro-uri ce completeaz codul surs necesare
pentru dezvoltarea programelor n Visual Studio;
2.Directiva .DATA marcheaz nceputul segmentului de date. In cazul nostru acest segment contine 3
iruri de caractere, fiecrui caracter i se atribuie cte un byte (DB) n memorie, cu offset Prompt, Dad i
Nud, valorile13,10 sunt tratate ca comenzi sfritul rndului (LF), din rnd nou (CR);
3. main PROC indic nceputul procedurii main n care este inclus tot codul programului, main
ENDP indic sfritul procedurii. Directiva END main indic sfritul programului (numit si punctul de
intrare in program), tot codul plasat dup aceast directiva va fi ignorat de asamblor;
4.Primele doua instruciuni iniializeaz registrul ds. Simbolul @data reprezint numele segmentului
creat cu directiva .DATA (sau adresa segmentului, adresa primului octet din acest segment);
5.Continutul variabilelor Prompt, Dad i Nud de tip ir de caractere se afieaz pe ecran utiliznd
funcia MSDOS cu codul 9. irurile pot fi de asemenea afiate pe ecran cu funcia MSDOS cu codul 40h;
6.ntreruperea Int 21h apeleaz serviciul MSDOS (DOS Services), iar int 10h la serviciul BIOS, ca
funcia apelat s fie executat, codul ei este necesar s fie ncrcat n registrul al.
ablonul (template) unui program pe 16 bii este urmtorul:
;This program
; Last update:
INCLUDE Irvine16.inc
.data
; aici definiti datele necesare
.code
main PROC
mov ax,@data
mov ds,ax
;aici plasati codul program
exit
main ENDP
END main
Exemplu de program pe 32 bii:
INCLUDE Irvine32.inc
.data
Promt DB 'Doresti sa devii programator?(da/nu)-[y/n]',0
Dad DB 13,10,'Vei deveni!',13,10,0
Nud DB 13,10,'Vei deveni filosof!',13,10,0
.code
main PROC
mov edx,OFFSET Promt
call WriteString
call ReadChar
cmp al,'y'
jz IsDad
12
cmp al,'n'
jz IsNud
IsDad: mov edx,OFFSET Dad
call WriteString
jmp ex
IsNud: mov edx,OFFSET Nud
call WriteString
ex:
exit
main ENDP
END main
Se remarca urmatoarele:
1. Se observ, c este acelai program dar elaborat ca o aplicaie pe 32 bii, n care se utilizaez
procedurile din Irvine32.inc, pentru dezvoltarea programelor n Visual Studio;
2. Definirea irurilor de caractere se finalizeaz cu zero, offset-ul irurilor se ncarc n registrul edx
(pe 32 bii).
3. Cu instruciunea call se apeleaz dou proceduri WriteString afiarea irului i ReadCharintroducerea unui caracter de la tastatur. Pentru afiarea unui ir de caractere, offset-ul irului este
necesar s fie ncrcat n registrul edx i apoi apelat procedura (funcia). Dup apelarea
procedurii ReadChar, n registrul al se va introduce codul tastei.
Exemplu de program pe 64 bii (Visual Studio 2013):
Instalai fiierul Irvine_7th_Edition.msi pentru Visual Studio 2013
Selectai n Visual Studio proiectul C:\Irvine\Examples\Project64\Project64.sln i adugai un exemplu
de program din C:\Irvine\Examples\ch3\64 bit\AddTwoSum_64.asm.
; AddTwoSum_64.asm - Ch3 example.
ExitProcess proto
.data
sum qword 0
.code
main proc
mov rax,5
add
rax,6
mov sum,rax
mov ecx,0
call ExitProcess
main endp
end
Se remarca urmatoarele:
1. Este un program ce adun dou numere ntregi i rezultatul este salvat n variabila sum pe 64 bii
(qword).
2. Procedura de ieire din program ExitProcess, i alte proceduri utilizate, este necesar s le
declarm la nceputul programului, ExitProcess proto.
13
14
Figura A.1
n fereastra aprut executai clic Application Settings, bifai Empty project (figura A.2). Clic Finish.
Figura A.2
n fereastra Solution Explorer, eliminai fiierele Header Files, Resource Files, and Source Files,
ele nu sunt necesare. n aceeai fereastr, executai clic dreapta pe numele de proiect i selectai
selectai Build Customizations. Va aprea o nou fereastr (figura A.3), bifai caseta de selectare
MASM i executai clic pe butonul OK.
15
Figura A.3
Clic dreapta Project10, selectati Properties. Clic pe Configuration Properties. n
Configuration Properties gsii intrarea Linker.
Selectai General > Additional Library Directories i introducei linia f:\MASM10;%
(AdditionalLibraryDirectories), n exemplul nostru, astfel linker-ul va gsi fiierul bibliotec
Irvine32.lib (figura A.4). Clic Apply.
Figura A.4
Tot n Linker selectai Input>Additional Dependencies i adugai fiierul irvine32.lib;
(figura A.5).
Numele fiierelor s fie separate prin punct i virgul. Clic Apply.
16
Figura A.5
Tot n Linker selectai Debugging (depanare). Verificai dac opiunea Generate Debug Info
este setat Yes (figura A.6).
Figura A.6
Tot n Linker selectai System. Verificai dac opiunea SubSystem este setat Console (figura
A.7).
Executai clic OK.
17
Figura A.7
Executai clic dreapta pe Project i selectai Add> Existing Item i selectai calea spre exemplul
de program surs AddSub.asm
f:\MASM10> Examples > ch3 > AddSub.asm i executai clic Add (figura A.8)
Figura A.8
n fereastra Solution Explorer va aprea AddSub.asm.
Executai clic dreapta pe Project i selectai Properties > Configuration properties >
Microsoft Macro Assembler> General
Modificai Include Paths cu calea spre fiierul de pe stick F:\MASM10. Aceasta indic calea spre
fiierele cu extensia ".inc" (figura A.9). Clic Apply.
18
Figura A.9
Selectai Listing File din list i n linia Assembled Code Listing File (figura A.10), adugai $
(ProjectName).lst. Clic Apply, OK.
Figura A.10