68
Pergatiti: Roland Vasili Bazuar në Slidet e Kip Irvine Transferimi i të dhenave, Adresimi, dhe Aritmetika

Leksione 7 & 8 p

  • Upload
    fasma3

  • View
    222

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Transferimi i të dhenave, Adresimi, dhe Aritmetika

Page 2: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Vështrim i përgjithshëm

2

• Instruksione Transferimi të Dhenash

• Mbledhja dhe Zbritja

• Veprime & Direktiva të lidhura me të Dhëna

• Adresimi Indirekt

• Instruksionet JMP dhe LOOP

Page 3: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksione Transferimi të Dhënash

• Tipe Operandesh

• Komente për Operandet eInstruksionit

• Operandë të drejtpërdrejtë Kujtesë

• Instruksioni MOV

• Zgjerimi me Zero & me Shenjën

• Instruksioni XCHG

• Instruksionet Direct-Offset

3

Page 4: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

4

Page 5: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Komente për Operandet e Instruksionit

5

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

Page 6: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

6

.data

var1 BYTE 10h

.code

mov al,var1 ; AL = 10h

mov al,[var1] ; AL = 10h

Format alternativ

Page 7: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksioni MOV

7

.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

Page 8: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha juaj . . .

8

.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:

Page 9: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Zgjërim me Zero (Zero Extension)

9

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

Page 10: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Zgjërim me Shenjën (Sign Extension)

10

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

Page 11: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksioni XCHG

11

.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.

Page 12: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operandë Direkt-Ofset

12

.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ë.

Page 13: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operandë Direkt-Ofset (vazhdim)

13

.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?

Page 14: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha juaj . . .

14

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

Page 15: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Në Vazhdim

15

• Instruksione Transferimi të Dhenash

• Mbledhja dhe Zbritja

• Veprime & Direktiva të lidhura me të Dhëna

• Adresimi Indirekt

• Instruksionet JMP dhe LOOP

Page 16: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

16

Page 17: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

17

Page 18: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembuj me INC dhe DEC

18

.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

Page 19: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksionet ADD dhe SUB

19

• ADD destinacion, burim

• Logjika: destinacion destinacion + burim

• SUB destinacion, burim

• Logjika: destinacion destinacion – burim

• Kanë vend të njëjtat rregulla me instruksioninMOV

Page 20: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembuj me ADD dhe SUB

20

.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

Page 21: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksioni NEG (negate)

21

.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?

Page 22: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Implementimi i Shprehjeve Aritmetike

22

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)

Page 23: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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.

23

Page 24: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Flamuri Zero (ZF)

24

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.

Page 25: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Flamuri i Shënjës (SF)

25

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

Page 26: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Numra të plotë me Shënjë dhe Pa Shënjë

Një vështrim Hardware-ik

26

• 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

Page 27: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Flamujt Overflow dhe CarryNjë vështrim Hardware-ik

27

• 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

Page 28: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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).

28

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

Page 29: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Flamuri Overflow (OF)Flamuri Overflow vendoset kur rezultati me shënjë i një veprimi nuk është i vlefshëm ose është jashtë rangut.

29

; 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.

Page 30: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

30

Cila do jetë vlera e flamurit Overflow ?

mov al,80h

add al,92h ; OF =

mov al,-2

add al,+127 ; OF =

1

0

Page 31: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Në Vazhdim

31

• Instruksione Transferimi të Dhenash

• Mbledhja dhe Zbritja

• Veprime & Direktiva të lidhura me të Dhëna

• Adresimi Indirekt

• Instruksionet JMP dhe LOOP

Page 32: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatorë dhe Direktiva të lidhura me të Dhena

• Operatori OFFSET

• Operatori PTR

• Operatori TYPE

• Operatori LENGTHOF

• Operatori SIZEOF

• Direktiva LABEL

32

Page 33: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

33

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)).

Page 34: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembuj për operatorin OFFSET

34

.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:

Page 35: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Lidhja me C/C++

35

; 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

Page 36: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatori PTR

36

.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).

Page 37: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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:

37

12345678 00005678

1234

78

56

34

12

0001

0002

0003

offsetdoubleword word byte

myDouble

myDouble + 1

myDouble + 2

myDouble + 3

Page 38: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembuj për operatorin PTR

38

.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

Page 39: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatori PTR (vazhdim)

39

.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.

Page 40: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha Juaj . . .

40

.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

Page 41: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatori TYPEOperatori TYPE kthen madhësinë, në bytes, të një elementi të vetëm të të dhenave të deklaruara.

41

.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

Page 42: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatori LENGTHOF

42

.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.

Page 43: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operatori SIZEOF

43

.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.

Page 44: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shtrirje në Rreshta Shumëfishe (1 nga 2)

44

.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:

Page 45: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shtrirje në Rreshta Shumëfishe (2 of 2)

45

.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 :

Page 46: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

46

.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

Page 47: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Në Vazhdim

47

• Instruksione Transferimi të Dhenash

• Mbledhja dhe Zbritja

• Veprime & Direktiva të lidhura me të Dhëna

• Adresimi Indirekt

• Instruksionet JMP dhe LOOP

Page 48: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Adresimi Indirekt

• Operandet Indirekte

• Shembull Mbledhjeje Matrice

• Operande të Indeksuar

• Treguesa (Pointers)

48

Page 49: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operande Indirekt (1 nga 2)

49

.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).

Page 50: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operande Indirekt (2 nga 2)

50

.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

Page 51: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembull Mbledhjeje Matrice

51

.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.

Page 52: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Operandë të Indeksuar

52

.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.

Page 53: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shkallëzimi i Indeksit

53

.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:

Page 54: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Treguesit(Pointers)

54

.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

Page 55: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Në Vazhdim

• Instruksione Transferimi të Dhenash• Mbledhja dhe Zbritja• Veprime & Direktiva të lidhura me të

Dhëna• Adresimi Indirekt• Instruksionet JMP dhe LOOP

55

Page 56: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instrusionet JMP dhe LOOP

• Instruksioni JMP

• Instruksioni LOOP

• Shembull me LOOP

• Mbledhje matrice me numra të plotë

• Kopjimi i një Vargu Karakteresh (String)

56

Page 57: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksioni JMP

57

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:

Page 58: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Instruksioni LOOP

58

• 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.

Page 59: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shembull me LOOP

59

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

Page 60: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha Juaj . . .

60

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

Page 61: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha Juaj . . .

61

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

Page 62: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Cikël i Përseritur

62

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

Page 63: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Shuma e Elementeve të një Matrice me Numra të Plotë

63

.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.

Page 64: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha Juaj . . .

64

Ç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 ?

Page 65: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Kopjimi i një Vargu Karakteresh(String)

65

.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:

Page 66: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Rradha Juaj . . .

66

Rishkruani programin në faqën e

mëparshme, duke përdorur adresimin

indirekt në vend të adresimit të indeksuar.

Page 67: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

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

67

Page 68: Leksione 7 & 8 p

Pergatiti: Roland Vasili – Bazuar në Slidet e Kip Irvine

Fund

68