Upload
andra-dor
View
218
Download
0
Embed Size (px)
DESCRIPTION
tehnici de dezasamblare-laborator PAM
Citation preview
Dezasamblare
Dezasamblare = Procesul prin care din cod mașina (coduri înțelese de procesor) obținem instrucțiuni
in limbaj de asamblare (instrucțiuni ce pot fi înțelese de oameni).
Sa se dezasambleze următoarele instrucțiuni in cod mașina:
178C
3E3C
1D18
0C05
049B
01A2
Le transformam in binar (cei 2 biți de 0 di fata nu ii punem, deoarece instrucțiunile in pic au 14 biți):
01 0111 1000 1100
11 1110 0011 0101
01 1101 0001 1000
00 1100 0000 0101
00 0100 1001 1011
00 0001 1010 0010
Ne uitam in pdf-ul microcontrolerului (datasheet), Cap.15. Instruction Set Summary, Table 15-2. Din
tabelul cu instrucțiuni găsim instrucțiunile echivalente si parametrii lor. Exista instructiuni care nu au
nici un parametru, unele care au unul singur, si altele care au 2 parametri.
De exemplu pentru instrucțiunea a treia (01 1101 0001 1000 ), ne uitam in tabel si identificam ca
biții de început (opcode) corespund cu instrucțiunea BTFSS:
Instrucțiunea BTFSS are 2 parametri: BTFSS F, B
primul parametru „F”, este compus din cei 7 biții „f”(de pe pozițiile [6..0]): 0011000 = 0x18
al doilea parametru, „B” este compus din biții „b”(de pe pozițiile [9..7]): 010 = 2
Rezulta instructiunea: BTFSS 0x18,2. La fel se procedează si pentru restul instrucțiunilor:
01 0111 1000 1100 BSF 0xc, 0x7
11 1110 0011 0101 ADDLW 0x3C
01 1101 0001 1000 BTFSS 0x18, 0x2
00 1100 0000 0101 RRF 0x5, 0
00 0100 1001 1011 IORWF 0x1b, 1
00 0001 1010 0010 CLRF 0x22
In locul adreselor variabilelor trebuie sa completam numele variabilelor (daca le cunoaștem) si al
locațiilor speciale de memorie. Acest lucru îl putem face doar pentru numerele ce reprezintă adrese
de memorie (ne dam seama din tipul instrucțiunii, este vorba de câmpurile cu fffffff din tabel)
Pentru locațiile speciale de memorie, ne uitam in datasheet, la Cap.2. Memory Organization, Figure
2-6;
Pentru locațiile de memorie folosite de utilizator, ar trebuie sa știm ce denumire le-a dat
programatorul; sa presupunem ca in programul inițial ar fi fost definita o secvența de genul:
CBLOCK 0x20
alfa
beta
gama
ENDC
Asta inseamna ca alfa se afla la adresa 0x20, beta la adresa 0x21 si gama la adresa 0x22.
In urma transformării avem:
BSF PIR1, 0x7
ADDLW 0x3C
BTFSS RCSTA, 0x2
RRF PORTA, W
IORWF CCPR2, F
CLRF gama
In următorul pas putem înlocui (pentru locațiile speciale) si denumirile biților; ne uitam in Cap.2.
Memory Organization, Table 2-1
Bsf PIR1, GIE
addlw 60
btfss RCSTA, FERR
rrf PORTA, w
iorwf CCPR2L
clrf gama
Deci in final avem echivalenta (pe care o putem verifica scriind secvența de program in asamblare(cea
din dreapta) in MPLAB si asamblând programul); ar trebui sa obținem in cod mașina secvența din
stânga:
Cod mașina Limbaj de asamblare
178C bsf PIR1, GIE
3E3C addlw 60
1D18 btfss RCSTA, FERR
0C05 rrf PORTA, w
049B iorwf CCPR2L
01A2 clrf gama