Upload
fasma3
View
232
Download
2
Embed Size (px)
Citation preview
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
Transferimi i të dhenave, Adresimi,
dhe Aritmetika
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine2
Vështrim i përgjithshëm
• Instruksione Transferimi të Dhenash
• Mbledhja dhe Zbritja
• Veprime & Direktiva të lidhura me të Dhëna
• Adresimi Indirekt
• Instruksionet JMP dhe LOOP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine3
Instruksione Transferimi të Dhënash
• Tipe Operandesh
• Komente për Operandet e Instruksionit
• Operandë të drejtpërdrejtë Kujtesë
• Instruksioni MOV
• Zgjerimi me Zero & me Shenjën
• Instruksioni XCHG
• Instruksionet Direct-Offset
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine4
Tipe Operandesh
• Tre tipe bazë operandesh:
• Immediate – një konstante e plotë (8, 16, or 32 bits)
• Vlera kodohet me instruksionin
• Register – emri i një regjistri
• Emri i registrit konvertohet në një numër dhe kodohet me
instruksionin
• Memory – referencë në një vendndodhje në kujtesë
• Adresa e kujtesës kodohet me instruksionin, ose një
regjistër mban adresën e vendndodhjeje kujtese
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine5
Komente për Operandet e Instruksionit
Operandi Përshkrimi
r8 Regjistër 8-bit me përdorim të përgjithshëm: AH, AL, BH, BL, CH, CL, DH, DL
r16 Regjistër 16-bit me përdorim të përgjithshëm: AX, BX, CX, DX, SI, DI, SP, BP
r32 Regjistër 32-bit me përdorim të përgjithshëm: EAX, EBX, ECX, EDX, ESI, EDI, ESP, EBP
reg Çfarëdo regjistër me përdorim të përgjithshëm
sreg Regjistër segmenti 16-bit: CS, DS, SS, ES, FS, GS
imm Vlerë imediate 8-, 16-, ose 32-bit
imm8 Vlerë imediate byte 8-bit
imm16 Vlerë imediate word 16-bit
imm32 Vlerë imediate dobleword 32-bit
r/m8 Operand 8-bit që mund të jetë regjistër me përdorim të përgjithshëm ose byte kujtese
r/m16 Operand 16-bit që mund të jetë regjistër me përdorim të përgjithshëm ose word kujtese
r/m32 Operand 32-bit që mund të jetë regjistër me përdorim të përgjithshëm ose doubleword kujtese
mem Operand Kujtese 8-, 16-, 32-bit
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine6
Operandë të drejtpërdrejtë Kujtesë
• Operand i drejtpërdrejt Kujtese është një emër reference në hapësirën e kujtesës
• Emri i referencës (etiketa(label)) vlerësohet automatikisht nga asembluesi
.data
var1 BYTE 10h
.code
mov al,var1 ; AL = 10h
mov al,[var1] ; AL = 10h
Format alternativ
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine7
Instruksioni MOV
.data
count BYTE 100
wVal WORD 2
.code
mov bl,count
mov ax,wVal
mov count,al
mov al,wVal ; gabim
mov ax,count ; gabim
mov eax,count ; gabim
• Zhvendos nga burimi në destinacion. Sintaksa:
MOV destinacion,burim
• Nuk lejohet të përdorën dy operatorë kujtese njëkohësisht
• Nuk mund të përdoren si destinacion CS dhe EIP
• Nuk mund të kemi zhvendosje vlere immediate me segment
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine8
Rradha juaj . . .
.data
bVal BYTE 100
bVal2 BYTE ?
wVal WORD 2
dVal DWORD 5
.code
mov esi,wVal Përmasa të ndryshme
mov eip,dVal EIP nuk mund të jetë destinacioni
mov 25,bVal Vlera immediate nuk mund të jetë
destinacioni
mov bVal2,bVal Nuk lejohen zhvendosje nga kujtesa në
kujtesë
Sqaroni pse secila nga instruksionet MOV që vijojnë janë të
pavlefshme:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine9
Zgjërim me Zero (Zero Extension)
mov bl,10001111b
movzx ax,bl ; zgjërim me zero
Kur kopjoni një vlerë më të vogël në një destinacion më të madh,
instruksioni MOVZX mbush (zgjëron) gjysmën e sipërme të
destinacionit me zero.
1 0 0 0 1 1 1 1
1 0 0 0 1 1 1 1
Source
Destination0 0 0 0 0 0 0 0
0
Destinacioni duhet të jetë regjistër.
Burimi
Destinacioni
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine10
Zgjërim me Shenjën (Sign Extension)
mov bl,10001111b
movsx ax,bl ; Zgjerim me shënjën
Instruksioni MOVSX mbush gjysmën e sipërme të destinacionit
me kopjim të vlerës së bit-it të shenjës së operandit burimor.
1 0 0 0 1 1 1 1
1 0 0 0 1 1 1 1
Source
Destination1 1 1 1 1 1 1 1
Destinacioni duhet të jetë regjistër.
Burimi
Destinacioni
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine11
Instruksioni XCHG
.data
var1 WORD 1000h
var2 WORD 2000h
.code
xchg ax,bx ; shkëmben regj. 16-bit
xchg ah,al ; shkëmben regj. 8-bit
xchg var1,bx ; shkëmbim mem, reg
xchg eax,ebx ; shkëmben regj. 32-bit
xchg var1,var2 ; gabim: dy operandë kujtese
XCHG shkëmben vlerat e dy operandeve. Të paktën njëri prej
operandëve duhet të jetë regjistër. Nuk lejohen operandë
immediate.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine12
Operandë Direkt-Ofset
.data
arrayB BYTE 10h,20h,30h,40h
.code
mov al,arrayB+1 ; AL = 20h
mov al,[arrayB+1] ; simbol alternativ
Një konstante ofset shtohet në një etiketë(label) të dhënash
për të prodhuar një adresë reale. Adresa vlerësohet për të
marrë vlerën në vendndodhjen e saj në kujtesë.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine13
Operandë Direkt-Ofset (vazhdim)
.data
arrayW WORD 1000h,2000h,3000h
arrayD DWORD 1,2,3,4
.code
mov ax,[arrayW+2] ; AX = 2000h
mov ax,[arrayW+4] ; AX = 3000h
mov eax,[arrayD+4] ; EAX = 00000002h
Një konstante ofset shtohet në një etiketë(label) të dhënash
për të prodhuar një adresë reale. Adresa vlerësohet për të
marrë vlerën në vendndodhjen e saj në kujtesë.
; Mund të asemblohen instruksionet që vijojnë?
mov ax,[arrayW-2] ; ??
mov eax,[arrayD+16] ; ??
Çdo të ndodhë kur ato do ekzekutohen?
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine14
Rradha juaj . . .
Shkruani një program që bën rënditjen e tre vlerave doubleword në
vlera në matricën që vijon si: 3, 1, 2.
.data
arrayD DWORD 1,2,3
• Hapi 2: Shkëmbejmë EAX me vlerën e tretë të matricës dhe e
kopjojmë vlerën në EAX te pozicioni i parë i matricës.
• Hapi 1: kopjojmë vlerën e parë në EAX dhe e shkëmbejmë atë
me vlerën në pozicionin e dytë.
mov eax,arrayD
xchg eax,[arrayD+4]
xchg eax,[arrayD+8]
mov arrayD,eax
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine15
Në Vazhdim
• Instruksione Transferimi të Dhenash
• Mbledhja dhe Zbritja
• Veprime & Direktiva të lidhura me të Dhëna
• Adresimi Indirekt
• Instruksionet JMP dhe LOOP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine16
Mbledhja dhe Zbritja
• Instruksionet INC dhe DEC
• Instruksionet ADD dhe SUB
• Instruksioni NEG
• Implementimi i Shprehjeve Aritmetike
• Flamuj që preken nga Aritmetika
• Zero
• Sign
• Carry
• Overflow
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine17
Instruksionet INC dhe DEC
• Shto 1, zbrit 1 nga operandi destinacion• operandi mund të jetë regjister ose kujtesë
• INC destinacion
• Logjika: destinacion destinacion + 1
• DEC destinacion
• Logjika: destinacion destinacion – 1
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine18
Shembuj me INC dhe DEC
.data
myWord WORD 1000h
myDword DWORD 10000000h
.code
inc myWord ; 1001h
dec myWord ; 1000h
inc myDword ; 10000001h
mov ax,00FFh
inc ax ; AX = 0100h
mov ax,00FFh
inc al ; AX = 0000h
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine19
Instruksionet ADD dhe SUB
• ADD destinacion, burim
• Logjika: destinacion destinacion + burim
• SUB destinacion, burim
• Logjika: destinacion destinacion – burim
• Kanë vend të njëjtat rregulla me instruksioninMOV
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine20
Shembuj me ADD dhe SUB
.data
var1 DWORD 10000h
var2 DWORD 20000h
.code ; ---EAX---
mov eax,var1 ; 00010000h
add eax,var2 ; 00030000h
add ax,0FFFFh ; 0003FFFFh
add eax,1 ; 00040000h
sub ax,1 ; 0004FFFFh
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine21
Instruksioni NEG (negate)
.data
valB BYTE -1
valW WORD +32767
.code
mov al,valB ; AL = -1
neg al ; AL = +1
neg valW ; valW = -32767
Ndryshon shenjën e operandit. Operandi mund të jetë një
regjistër ose operand kujtese.
Supozoni se AX përmban –32,768 dhe ne aplikojmë NEG mbi
të. Do jetë i vlefshëm rezultati?
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine22
Implementimi i Shprehjeve Aritmetike
Rval SDWORD ?
Xval SDWORD 26
Yval SDWORD 30
Zval SDWORD 40
.code
mov eax,Xval
neg eax ; EAX = -26
mov ebx,Yval
sub ebx,Zval ; EBX = -10
add eax,ebx
mov Rval,eax ; -36
Kompiluesit e Gjuhëve të Nivelit të Lartë përkthejnë shprehjet
matematike në gjuhë makine. Kjo mund të bëhet edhe prej jush.
Për shembull:
Rval = -Xval + (Yval – Zval)
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine23
Flamuj që preken nga Aritmetika
• Njësia Aritmetike dhe Logjike(ALU) ka një numër
flamujsh gjëndjeje që reflekton rezultatin e veprimeve
aritmetike (dhe bitwise)
• Bazohen mbi përmbajtjen e operandit destinacion
• Flamujt Kryesorë:
• Flamuri Zero – vendoset(bëhet 1) kur destinacioni
barazohet me zero
• Flamuri Sign – vendoset kur destinacioni bëhet negativ
• Flamuri Carry – vendoset kur vlera pa shenjë del jashtë
rangut
• Flamuri Overflow – vendoset kur vlera me shënjë del
jashtë rangut
• Instruksioni MOV nuk ndikon mbi flamujt.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine24
Flamuri Zero (ZF)
mov cx,1
sub cx,1 ; CX = 0, ZF = 1
mov ax,0FFFFh
inc ax ; AX = 0, ZF = 1
inc ax ; AX = 1, ZF = 0
Flamuri Zero vendoset kur rezultati i një veprimi prodhon zero
në operandin destinacion.
Mbani mend...
• Një flamur vendoset kur barazohet me 1.
• Një flamur është i pastër kur bëhet i barabartë me 0.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine25
Flamuri i Shënjës (SF)
mov cx,0
sub cx,1 ; CX = -1, SF = 1
add cx,2 ; CX = 1, SF = 0
Flamuri i Shënjës vendoset kur operandi destinacion bëhet
negativ. Flamuri është i pastër kur destinacioni bëhet pozitiv.
Flamuri i shënjës është një kopje e bit-it më të lartë të destinacionit:
mov al,0
sub al,1 ; AL = 11111111b, SF = 1
add al,2 ; AL = 00000001b, SF = 0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine26
Numra të plotë me Shënjë dhe Pa Shënjë
Një vështrim Hardware-ik
• Të gjithë instruksionet e CPU-së veprojnë ekzaktësisht
njëlloj si në numrat me shënjë ashtu dhe në ato pa shënjë
• CPU-ja nuk mund të dallojë numrat e plotë me shënjë apo
pa shënjë
• JU, programuesit, jeni përgjegjësit e vetëm për përdorimin
e saktë të tipit të të dhenave me çdo instruksion
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine27
Flamujt Overflow dhe Carry
Një vështrim Hardware-ik
• Si modifikon instruksioni ADD flamujt OF dhe CF:
• OF = (mbart MSB) XOR (transportoje tek MSB)
• CF = (mbart MSB)
• Si modifikon instruksioni SUB flamujt OF dhe CF:
• NEG burimin dhe ADD atë tek destinacioni
• OF = (mbart MSB) XOR (transportoje tek MSB)
• CF = INVERT (vepron mbi MSB)
MSB = Most Significant Bit (bit-i i rendit më të lartë)
XOR = veprimi eXclusive-OR
NEG = Negate
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine28
Flamuri Carry (CF)
Flamuri carry vendoset kur rezultati i një veprimi gjeneron një vlerë
pa shenjë jashtë rangut (shumë i madh ose shmë i vogël për
operandin destinacion).
mov al,0FFh
add al,1 ; CF = 1, AL = 00
; Provoni të kaloni nën zero:
mov al,0
sub al,1 ; CF = 1, AL = FF
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine29
Flamuri Overflow (OF)
Flamuri Overflow vendoset kur rezultati me shënjë i një veprimi nuk
është i vlefshëm ose është jashtë rangut.
; Shembull 1
mov al,+127
add al,1 ; OF = 1, AL = ??
; Shembull 2
mov al,7Fh ; OF = 1, AL = 80h
add al,1
Dy shembujt janë identikë në nivel binar sepse 7Fh është i
barabartë me +127. Për të përcaktuar vlerën e operandit
destinacion, shpesh është më e lehtë të llogaritet në hexadecimal.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine30
Një Rregull Njëhsimi
• Për të shtuar dy numra të plotë, kujtoni që flamuri
Overflow vendoset vetëm kur . . .
• Shtohen dy nmra pozitivë dhe rezultati është negativ
• Shtohen dy numra negativë dhe shuma e tyre është
pozitive
Cila do jetë vlera e flamurit Overflow ?
mov al,80h
add al,92h ; OF =
mov al,-2
add al,+127 ; OF =
1
0
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine31
Në Vazhdim
• Instruksione Transferimi të Dhenash
• Mbledhja dhe Zbritja
• Veprime & Direktiva të lidhura me të
Dhëna
• Adresimi Indirekt
• Instruksionet JMP dhe LOOP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine32
Operatorë dhe Direktiva të lidhura me të
Dhena
• Operatori OFFSET
• Operatori PTR
• Operatori TYPE
• Operatori LENGTHOF
• Operatori SIZEOF
• Direktiva LABEL
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine33
Operatori OFFSET
• OFFSET kthen distancën në bytes, të një etikete nga fillimi i
segmentit të mbyllur të saj
• Në mënyrën e Mbrojtur (Protected mode): 32 bits
• Në mënyrën Reale(Real mode): 16 bits
offset
myByte
data segment:
Programet që shkruajmë për Mënyrën e Mbrojtur kanë
vetëm një segment unik (ne përdorim modelin e kujtesës
flat (flat memory model)).
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine34
Shembuj për operatorin OFFSET
.data
bVal BYTE ?
wVal WORD ?
dVal DWORD ?
dVal2 DWORD ?
.code
mov esi,OFFSET bVal ; ESI = 00404000
mov esi,OFFSET wVal ; ESI = 00404001
mov esi,OFFSET dVal ; ESI = 00404003
mov esi,OFFSET dVal2 ; ESI = 00404007
Le të supozojmë se segmenti data fillon në 00404000h:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine35
Lidhja me C/C++
; versioni C++:
char array[1000];
char * p = array;
Vlera e kthyer nga operatori OFFSET është një tregues(pointer).
Krahasoni kodin që vijon të shkruar si në gjuhën C++ ashtu dhe
në gjuhën assembly:
.data
array BYTE 1000 DUP(?)
.code
mov esi,OFFSET array ; ESI është p
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine36
Operatori PTR
.data
myDouble DWORD 12345678h
.code
mov ax,myDouble ; gabim – pse?
mov ax,WORD PTR myDouble ; ngarkon 5678h
mov WORD PTR myDouble,4321h ; ruan 4321h
Mbivendos tipin e paracaktuar të një etikete (variable). Siguron
fleksibilitet për aksesin e një pjesë të një variable.
Kujtoni se për akomodimin e të dhenave në kujtesë përdoret
renditja little endian (shikoni Seksionin 3.4.9 të librit).
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine37
Renditja Little Endian
• Renditja Little Endian referohet te mënyra që Intel akomodon numrat e plotë në kujtesë.
• Numrat eplotë Multi-byte akomodohen në renditje të kundërt , me bit-in më pak të rendësishëm të akomoduar te adresa më e ulët
• Për shembull, doubleword 12345678h duhet të akomodohet si:
12345678 00005678
1234
78
56
34
12
0001
0002
0003
offsetdoubleword word byte
myDouble
myDouble + 1
myDouble + 2
myDouble + 3
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine38
Shembuj për operatorin PTR
.data
myDouble DWORD 12345678h
12345678 00005678
1234
78
56
34
12
0001
0002
0003
offsetdoubleword word byte
myDouble
myDouble + 1
myDouble + 2
myDouble + 3
mov al,BYTE PTR myDouble ; AL = 78h
mov al,BYTE PTR [myDouble+1] ; AL = 56h
mov al,BYTE PTR [myDouble+2] ; AL = 34h
mov ax,WORD PTR myDouble ; AX = 5678h
mov ax,WORD PTR [myDouble+2] ; AX = 1234h
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine39
Operatori PTR (vazhdim)
.data
myBytes BYTE 12h,34h,56h,78h
.code
mov ax,WORD PTR [myBytes] ; AX = 3412h
mov ax,WORD PTR [myBytes+2] ; AX = 7856h
mov eax,DWORD PTR myBytes ; EAX = 78563412h
Operatori PTR mund të përdoret edhe për kombinimin e
elementeve të tipeve të të dhenave më të vogla dhe
transferimin e tyre në një operand më të madh. CPU-ja
automatikisht do kthej në menyrë të anasjelltë byte-t.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine40
Rradha Juaj . . .
.data
varB BYTE 65h,31h,02h,05h
varW WORD 6543h,1202h
varD DWORD 12345678h
.code
mov ax,WORD PTR [varB+2] ; a.
mov bl,BYTE PTR varD ; b.
mov bl,BYTE PTR [varW+2] ; c.
mov ax,WORD PTR [varD+2] ; d.
mov eax,DWORD PTR varW ; e.
Shkruani vlerat e çdo operandi destinacion:
0502h
78h
02h
1234h
12026543h
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine41
Operatori TYPE
Operatori TYPE kthen madhësinë, në bytes, të një
elementi të vetëm të të dhenave të deklaruara.
.data
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
var4 QWORD ?
.code
mov eax,TYPE var1 ; 1
mov eax,TYPE var2 ; 2
mov eax,TYPE var3 ; 4
mov eax,TYPE var4 ; 8
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine42
Operatori LENGTHOF
.data LENGTHOF
byte1 BYTE 10,20,30 ; 3
array1 WORD 30 DUP(?),0,0 ; 32
array2 WORD 5 DUP(3 DUP(?)) ; 15
array3 DWORD 1,2,3,4 ; 4
digitStr BYTE "12345678",0 ; 9
.code
mov ecx,LENGTHOF array1 ; 32
Operatori LENGTHOF numëron numrin e elementeve
në një deklarim të thjeshtë të dhenash.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine43
Operatori SIZEOF
.data SIZEOF
byte1 BYTE 10,20,30 ; 3
array1 WORD 30 DUP(?),0,0 ; 64
array2 WORD 5 DUP(3 DUP(?)) ; 30
array3 DWORD 1,2,3,4 ; 16
digitStr BYTE "12345678",0 ; 9
.code
mov ecx,SIZEOF array1 ; 64
Operatori SIZEOF kthen një vlerë që është ekivalente me
prodhimin e LENGTHOF me TYPE.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine44
Shtrirje në Rreshta Shumëfishe (1 nga 2)
.data
array WORD 10,20,
30,40,
50,60
.code
mov eax,LENGTHOF array ; 6
mov ebx,SIZEOF array ; 12
Një deklarim i të dhenave shtrihet në rreshta shumëfishe nëse
çdo rresht (përveç të fundit) mbaron me presje. Operatorët
LENGTHOF dhe SIZEOF spozojnë se të gjithë rreshtat i
takojnë deklaratës:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine45
Shtrirje në Rreshta Shumëfishe (2 of 2)
.data
array WORD 10,20
WORD 30,40
WORD 50,60
.code
mov eax,LENGTHOF array ; 2
mov ebx,SIZEOF array ; 4
Në shembullin që vijon, array identifikon vetëm deklaratën e
parë WORD. Krahasoni vlerat e kthyera nga LENGTHOF
dhe SIZEOF këtu me ato të faqës së mësipërme :
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine46
Direktiva LABEL
• Përcakton një emër dhe tip alternativ etikete në një
vendndodhje ekzistuese akomodimi
• LABEL nuk bën alokim të asnjë hapësire akomodimi
në vetvete
• Shmang nevojen e përdorimit të operatorit PTR
.data
dwList LABEL DWORD
wordList LABEL WORD
intList BYTE 00h,10h,00h,20h
.code
mov eax,dwList ; 20001000h
mov cx,wordList ; 1000h
mov dl,intList ; 00h
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine47
Në Vazhdim
• Instruksione Transferimi të Dhenash
• Mbledhja dhe Zbritja
• Veprime & Direktiva të lidhura me të
Dhëna
• Adresimi Indirekt
• Instruksionet JMP dhe LOOP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine48
Adresimi Indirekt
• Operandet Indirekte
• Shembull Mbledhjeje Matrice
• Operande të Indeksuar
• Treguesa (Pointers)
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine49
Operande Indirekt (1 nga 2)
.data
val1 BYTE 10h,20h,30h
.code
mov esi,OFFSET val1
mov al,[esi] ; vlerësohet ESI (AL = 10h)
inc esi
mov al,[esi] ; AL = 20h
inc esi
mov al,[esi] ; AL = 30h
Një operand indirekt mban adresën e një variable, zakonisht të
një matrice apo të një vargu karakterësh. Ai mund të vlerësohet
(ekzaktësisht si një tregues).
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine50
Operande Indirekt (2 nga 2)
.data
myCount WORD 0
.code
mov esi,OFFSET myCount
inc [esi] ; gabim: me dy kuptime
inc WORD PTR [esi] ; ok
Përdorni PTR të qartësoni vetinë e madhësisë së një operandi
kujtese.
Duhet të përdoret PTR këtu?
add [esi],20
po, për arsye se [esi] mund
të tregoj në një a byte, word,
ose doubleword
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine51
Shembull Mbledhjeje Matrice
.data
arrayW WORD 1000h,2000h,3000h
.code
mov esi,OFFSET arrayW
mov ax,[esi]
add esi,2 ; ose: add esi,TYPE arrayW
add ax,[esi]
add esi,2
add ax,[esi] ; AX = shuma e matricës
Operandet Indirektë janë ideale për shqyrtimin e një matrice.
Shenoni që regjistri në kllapa dhet të rritet me një vlerë që
përshtatet me tipin e matricës.
Për Detyrë: Modifikoni këtë shembull për një matrice me
doublewords.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine52
Operandë të Indeksuar
.data
arrayW WORD 1000h,2000h,3000h
.code
mov esi,0
mov ax,[arrayW + esi] ; AX = 1000h
mov ax,arrayW[esi] ; format alternativ
add esi,2
add ax,[arrayW + esi]
etc.
Një operand i indeksuar shton një konstante në një regjistër për
të prodhuar një adresë reale. Ekzistojnë dy forma për ta
shënuar:
[label + reg] label[reg]
Për Detyrë: Modifikoni këtë shembll për një matricë me
doublewords.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine53
Shkallëzimi i Indeksit
.data
arrayB BYTE 0,1,2,3,4,5
arrayW WORD 0,1,2,3,4,5
arrayD DWORD 0,1,2,3,4,5
.code
mov esi,4
mov al,arrayB[esi*TYPE arrayB] ; 04
mov bx,arrayW[esi*TYPE arrayW] ; 0004
mov edx,arrayD[esi*TYPE arrayD] ; 00000004
Mund të shkallëzoni një operand indirekt ose të indeksuar te
ofseti i një elementi matrice. Kjo bëhet duke shumëzuar
indeksin me tipin(TYPE) e matricës:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine54
Treguesit(Pointers)
.data
arrayW WORD 1000h,2000h,3000h
ptrW DWORD arrayW
.code
mov esi,ptrW
mov ax,[esi] ; AX = 1000h
Ne mund të deklarojmë një tregues variable(pointer variable) që
përmban offset-in e një variable tjetër.
Format Alternativ :
ptrW DWORD OFFSET arrayW
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine55
Në Vazhdim
• Instruksione Transferimi të Dhenash
• Mbledhja dhe Zbritja
• Veprime & Direktiva të lidhura me të
Dhëna
• Adresimi Indirekt
• Instruksionet JMP dhe LOOP
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine56
Instrusionet JMP dhe LOOP
• Instruksioni JMP
• Instruksioni LOOP
• Shembull me LOOP
• Mbledhje matrice me numra të plotë
• Kopjimi i një Vargu Karakteresh (String)
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine57
Instruksioni JMP
top:
.
.
jmp top
• JMP është një kërcim pa kondita në një etiketë që zakonisht
ndodhet në të njëjtën procedure.
• Sintaksa: JMP destinacioni
• Logjika: EIP destinacioni
• Shembull:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine58
Instruksioni LOOP
• Instruksioni LOOP krijon një cikël të numëruar
• Sintaksa: LOOP destinacion
• Logjika:
• ECX ECX – 1
• if ECX != 0, kërce te destinacioni
• Implementimi:
• Asembluesi llogarit distancën, në bytes, midis ofsetit të
instruksionit vijues dhe ofsetit të etiketës destinacion. Ky
quhet ofseti relativ.
• Ofseti relativ i shtohet EIP.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine59
Shembull me LOOP
00000000 66 B8 0000 mov ax,0
00000004 B9 00000005 mov ecx,5
00000009 66 03 C1 L1: add ax,cx
0000000C E2 FB loop L1
0000000E
Cikli që vijon llogarit shumën e numrave të plotë
5 + 4 + 3 +2 + 1:
Kur asemblohet një LOOP, vendndodhja aktuale = 0000000E (ofseti I
instruksionit pasues). –5 (FBh) shtohet te vendndodhja aktuale, duke
shkaktuar një kërcim te vendndodhja 00000009:
00000009 0000000E + FB
ofseti kod makine kod burimi
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine60
Rradha Juaj . . .
Nëse ofseti relativ kodohet në një byte të thjeshtë me shenjë,
(a) cili është kërcimi më i madh i mundshëm prapavajtës?
(b) cili është kërcimi më i madh i mundshëm paravajtës?
(a) 128
(b) +127
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine61
Rradha Juaj . . .
Cila do jetë vlera përfundimtare e AX?
mov ax,6
mov ecx,4
L1:
inc ax
loop L1
Sa herë do ekzekutohet cikli?mov ecx,0
X2:
inc ax
loop X2
10
4,294,967,296 = 232
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine62
Cikël i Përseritur
Nëse është e nevojshme të kodohet një cikël brenda një cikli
tjetër, duhet të ruhet vlera ECX e numëruesit të ciklit të
jashtëm. Në shembullin që vijon, cikli i jashtëm ekzekutohet
100 herë, ndërsa cikli i brendshëm 20 herë.
.data
count DWORD ?
.code
mov ecx,100 ; vendos numëruesin e ciklit të jashtëm
mov count,ecx ; ruan numëruesin e ciklit
mov ecx,20 ; vendos numëruesin e ciklit të brendshëm
L2: .
.
loop L2 ; persërit ciklin e brendshëm
mov ecx,count ; kthen numëruesin e ciklit të jashtëm
loop L1 ; repeat the outer loop
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine63
Shuma e Elementeve të një Matrice me
Numra të Plotë
.data
intarray WORD 100h,200h,300h,400h
.code
mov edi,OFFSET intarray ; adresa e intarray
mov ecx,LENGTHOF intarray ; numeruesi i ciklit
mov ax,0 ; bën zero akumulatorin
L1:
add ax,[edi] ; shton një numër të plotë
add edi,TYPE intarray ; tregon te numri pasues
loop L1 ; persërit derisa ECX = 0
Kodi që vijon llogarit shumën e elementeve të një matrice me
numra të plotë 16-bit.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine64
Rradha Juaj . . .
Çfarë ndryshime duhet të bëni te
programi në faqën e mëparshme nëse do
ishit duke shtuar një matricë me
elementë doubleword ?
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine65
Kopjimi i një Vargu Karakteresh(String)
.data
source BYTE "This is the source string",0
target BYTE SIZEOF source DUP(0)
.code
mov esi,0 ; index register
mov ecx,SIZEOF source ; numëruesi i ciklit
L1:
mov al,source[esi] ; merr char nga source
mov target[esi],al ; e rezervon atë në target
inc esi ; kalon te karakteri tjeter
loop L1 ; përsëritet për gjithë vargun
Përdorim i
mirë i
SIZEOF
Kodi që vijon kopjon një string nga burimi në destinacion:
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine66
Rradha Juaj . . .
Rishkruani programin në faqën e
mëparshme, duke përdorur adresimin
indirekt në vend të adresimit të indeksuar.
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine67
Përmbledhje
• Transferim të Dhenash
• MOV – transferim të dhenash nga burimi te destinacioni
• MOVSX, MOVZX, XCHG
• Tipe Operandesh
• direct, direct-offset, indirect, indexed
• Aritmetika
• INC, DEC, ADD, SUB, NEG
• Sign, Carry, Zero, Overflow flags
• Operatoret
• OFFSET, PTR, TYPE, LENGTHOF, SIZEOF, TYPEDEF
• JMP dhe LOOP – instruksione degezimi
Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine68
Fund