Sunteți pe pagina 1din 23

BTI

ASM - 1

Rzvan Daniel ZOTA


Facultatea de Cibernetic, Statistic i
Informatic Economic
zota@ase.ro
http://zota.ase.ro/bti

Coninut

Instruciuni logice
Instruciuni de deplasare
Operaii aritmetice
Depire i transport
Setarea indicatorilor de stare

Exemple de accesare a memoriei


SEGMENT code
var1
DW 01234h
;definete o variabil
valoarea
;1234h

;word cu

var2
DW 01234
;definete o variabil
;word cu
valoarea
;zecimal 1234
var3
RESW
; definete o variabil
;word cu valoare
;nespecificat
var4
mesaj

DW 01BCDh

mov si,var2
; se fol. SI ca pointer spre var2
; (cod C echivalent: SI=&var2 )
mov ax,[si]
memorie la
mov bx,mesaj
un

; se citete din
;var2
; referire indirect
; BX este un pointer la
;string

dec BYTE [bx+1] ; e' devine d' !

DB Hello!'

start:
mov ax,cs
de date

; seteaz segmentul

mov ds,ax
; DS=CS
; orice referire la memorie se pp. c
este n segmentul DS

mov si, 1
index
inc [mesaj+SI]

; SI este pe post de

; == inc [SI + 8]
; == inc [9]

mov ax,[var2]
; AX <- [var2]
; == mov ax,[2]

Exemple de accesare a memoriei


(cont.)
;Memoria poate fi adresat folosind 4 regitri:
;

SI -> Implic DS

DI -> Implic DS

BX -> Implic DS

BP -> Implic SS !

; Exemple:

; deplasamente pe 8 sau 16 bii


mov ax,[23h]

; ax <- word la DS:0023

mov ah,[bx+5]
(BX+5)

; ah <- byte la DS:

mov ax,[bx+si+107] ; ax <- word la


; DS:(BX+SI+107)

mov ax,[bx]
;ax <- unui word din memorie referit de BX
mov al,[bx]
; al <- unui byte din memorie referit de BX

mov ax,[bx+di+47]
la
; DS:(BX+DI+47)

; ax <- word

mov ax,[si]

; ax <- unui word referit de SI

mov ah,[si]

; ah <- unui byte referit de SI

; De reinut! Cei doi op ai instr. MOV nu


pot

mov cx,[di]

; cx <- unui word referit de DI

; fi ambii locaii de memorie

mov ax,[bp]
; ax <- [SS:BP] operaie cu stiva
; n plus se permite folosirea BX+SI i BX+DI
mov ax,[bx+si]
mov ch,[bx+di]

mov [bx],[si]

; Instr. ilegal

mov [di],[si]

; Instr. ilegal

; Caz special: operaii cu stiva!


pop word [var]

; [var] <- SS:[SP]

Registrul indicatorilor de stare


AC (Alignment check)
(VM) Virtual mode
(RF) Resume
(NT) Nested task
(IOPL) Input/output
privilege level
(O) Overflow
(D) Direction
(I) Interrupt
(T) Trace
(S) Sign
(Z) Zero
(A) Auxiliary Carry
(P) Parity
(C) Carry
8086, 8088, 80186

80286

80386, 80486DX
80486SX

Instruciuni logice
Instruciunile logice acioneaz bit-cu-bit
NOT:

A =~A

AND:

A &= B

OR:

A |= B

XOR:

A ^= B

Cu excepia lui NOT aceste instruciuni au efect asupra


indicatorilor de stare dup cum urmeaz:
terge indicatorul carry (C)
terge indicatorul overflow (O)
seteaz zero flag (Z) dac rezultatul este zero, sau l terge n caz
contrar
copiaz bitul mai nalt al rezultatului n indicatorul sign (S)
seteaz bitul de paritate (P) conform cu paritatea rezultatului

Instruciunea NOT nu are efect asupra nici unui flag


6

Instruciuni logice (cont.)

TEST (AND non-destructiv) - face produsul logic al celor doi operanzi


i seteaz indicatorii dar nu memoreaz rezultatul
TEST AL,1
seteaz indicatorii ca i instruciunea AND dar nu modific registrul
AL
flaguri afectate: SF, ZF, PF, CF = 0, OF = 0, AF nedefinit

Instruciunile AND i OR sunt folosite pe post de mascare a datelor


o valoare de tip mask este folosit pentru a fora anumii bii s ia
valoarea 0 sau 1 n cadrul altei valori
un astfel de mask are efect asupra anumitor bii iar pe alii i las
neschimbai
AND face ca biii selectai s ia valoarea 0
AND

CL, 0Fh

OR face ca biii selectai s ia valoarea 1


OR CL, 0Fh
7

Instruciuni de deplasare

Instruciuni de deplasare (cont.)


SHL/SAL (shift left/shift arithmetic left)
mut fiecare bit al operandului o poziie la stnga de cte
ori specific operandul numrtor (count)
poziiile rmase libere sunt umplute cu zerouri la bitul cel
mai puin semnificativ (cmps); bitul cms se deplaseaz n
carry flag
reprezint o modalitate rapid de nmulire cu 2

NOT:

Exist 2 forme de deplasare:


1) prin folosirea unui contor efectiv (immediate shift count) (8086,
8088 permit pentru aceasta doar valoarea 1: SHL AX, 1
2) prin folosirea registrului CL pentru numrtor

Exemple
;cum se face nmulirea lui AX cu 10 (1010) (nmulim cu 2 i cu 8, apoi
adunm ;rezultatele)
shl

ax, 1

; AX ori 2

mov

bx, ax

; salvm 2*AX

shl

ax, 2

; 2*AX(original) * 4 = 8*AX (original)

add

ax, bx

; 2*AX + 8*AX = 10*AX

;cum se poate face nmulrea lui AX cu 18 (10010) (nmulim cu 2 i cu 16,


apoi adunm rezultatele)
shl

ax, 1

; AX ori 2

mov

bx, ax

; salvm 2*AX n BX

shl

ax, 3

; 2*AX(original) ori 8 = 16*AX (original)

add

ax, bx

; 2*AX + 16*AX = 18*AX

10

Instruciuni de deplasare (cont.)


SHR (shift right)
deplaseaz toi biii din operandul destinaie la dreapta cu
un bit
poziiile rmase libere sunt umplute cu zero la bitul cms.
Bitul cmps este copiat n carry flag

O modalitate rapid pentru mprirea cu 2 (pentru


numere fr semn)

11

Instruciuni de deplasare (cont.)


SAR (shift arithmetic right)
deplaseaz toi biii operandului destinaie la dreapta cu
un bit replicnd bitul cms.
Bitul cmps este copiat n carry flag
Utilizarea principal este aceea de a face o mprire cu
semn la o putere a lui 2:

12

Instruciuni de deplasare (cont.)


RCL (rotate through carry left)
face o rotaie a biilor ctre stnga prin intermediul lui carry flag
cel mai semnificativ bit din operand trece n CF, se deplaseaz toi biii
din operand cu o poziie la stnga iar CF original trece n bitul cel mai
puin semnificativ din operand

ROL (rotate left)


face o rotaie a biilor la stnga
deplaseaz cel mai semnificativ bit al operandului n bitul cmps.
Biii 10-14 din AX se mut n biii 0-4

ROL

AX, 6

AND

AX, 1fh

NOT: Exist dou forme de rotaie:


1) folosirea contorului efectiv (8086, 8088 permit doar un contor 1: ROL AX,
1)
2) folosirea registrului CL pentru memorarea contorului de rotaie

13

Instruciuni de deplasare (cont.)


RCR (rotate through carry right)
face o rotaie a biilor spre dreapta prin intermediul lui
carry flag
bitul din CF este scris napoi n bitul cms al operandului

ROR (rotate right)


face o rotaie a biilor spre dreapta
deplaseaz bitul cmps n bitul cms.

14

Operaii de deplasare
Exemple
mov ax,3

; Valori iniiale AX = 0000 0000 0000 0011

mov bx,5

BX = 0000 0000 0000 0101

or ax,9 ; ax <- ax | 0000 1001


and ax,10101010b
xor ax,0FFh

AX = 0000 0000 0000 1011

; ax <- ax & 1010 1010 AX = 0000 0000 0000 1010

; ax <- ax ^ 1111 1111 AX = 0000 0000 1111 0101

neg ax ; ax <- (-ax)

AX = 1111 1111 0000 1011

not ax

AX = 0000 0000 1111 0100

; ax <- (~ax)

or ax,1 ; ax <- ax | 0000 0001

AX = 0000 0000 1111 0101

shl ax,1 ; depl logic la stg cu 1 bit


shr ax,1

AX = 0000 0001 1110 1010

; depl logic la dr cu 1 bit

ror ax,1 ; rotaie stg (LSB=MSB)

AX = 0000 0000 1111 0101

AX = 1000 0000 0111 1010

rol ax,1 ; rotaie dr (MSB=LSB) AX = 0000 0000 1111 0101


mov cl,3

; folosim CL pt depl cu 3 bii

shr ax,cl

; mprim AX la 8

mov cl,3

; folosim CL pt depl cu 3 bi

shl bx,cl

; nmulim BX cu 8

CL = 0000 0011

AX = 0000 0000 0001 1110


CL = 0000 0011

BX = 0000 0000 0010 1000


15

Instruciuni aritmetice
ADD (addition): A += B
Adunare ntre regitri: add ax, bx
Adunare efectiv: add dl, 33h
Adunare memorie la registru (data din memorie adunat
la AL):
mov

di, NUMB

;adresa lui NUMB

mov

al, 0

;se terge suma

add

al, [di]

;adun [NUMB]

add

al, [di + 1]

;adun [NUMB + 1]

NOT: instruciunea ADD modific indicatorii sign,


zero, carry, auxiliary carry, parity i overflow.
16

Instruciuni aritmetice (cont.)


INC (increment addition): A++
mov

di, NUMB

;adresa lui NUMB

mov

al, 0

;terge suma

add

al, [di]

;adun [NUMB]

inc

di

;di = di + 1

add

al, [di]

;adun [NUMB + 1]

NOT: Instruciunea INC nu afecteaz carry flag.

17

Instruciuni aritmetice (cont.)


ADC (addition with carry) - acioneaz ca o adunare
normal, cu excepia bitului din carry flag (C) care este
adunat la rezultat
utilizat n principal pentru a aduna numere mai mari de
16 bii (8086 - 80286) sau mai mari de 32 bii la 80386,
80486, Pentium.

Exemplu:
adunarea a dou numere pe 32 de bii (BX AX) + (DX CX):
add

ax, cx

adc

bx, dx

18

Instruciuni aritmetice (cont.)


SUB (subtraction): A -= B
Scdere folosind regitri: sub
Scdere efectiv:
mov

ch, 22h

sub

ch, 34h

cl, bl
Rezultatul este -12 (1110
1110)
Modificarea indicatorilor:
Z = 0 (rezultat dif de
zero)
C = 1 (mprumut)
S = 1 (rezultat negativ)
P = 0 (paritate par)
0 = 0 (fr depire)

NOT: o instruciune SUB modific indicatorii sign,


zero, carry, auxiliary carry, parity i overflow.
19

Instruciuni aritmetice (cont.)


DEC (decrement subtraction): A-- , scade valoarea 1 dintr-un
registru sau coninut de memorie: DEC BH
NOTE: Instruciunea DEC nu afecteaz indicatorul carry flag.
SBB (subtract with borrow) acioneaz ca o scdere normal,
cu excepia faptului c indicatorul carry flag (C), ce conine
mprumutul va fi sczut i el din diferen
folosit n principal pentru a scdea numere mai mari de
16 bii (8086 - 80286) sau 32 bii (la 80386, 80486,
Pentium).
Exemplu:
scderea a dou numere pe 32 de bii (BX AX) - (SI DI):
sub

ax, di

sbb

bx, si
20

Depire i transport
Transport (Carry)
indic apariia unui transport n urma unei adunri sau un mprumut n cazul
unei scderi
CF: carry flag (fr semn) 1 => transport ; 0 => fr transport
ex: 36,864 (9000h) + 36,864 (9000h) = 73,728 (12000h) > 65,535 (FFFFh) {OV, CY}
overflow, carry
Bitul carry este setat atunci cnd numrul fr semn iese din domeniu (nseamn c
operaia aritmetic a generat depire)

Depire (Overflow)
este o situaie care apare atunci cnd se adun sau se scad numere fr semn
OF: overflow flag (cu semn) {1 = OV depire, 0 = NV fr depire}
ex: 20,480 (5000h) + 20,480 (5000h) = 40,960 (A000h) > 32,767 (7FFFh) {OV, NC}
overflow, not carry
Indicatorul overflow este setat atunci cnd numrul cu semn depete domeniul de
definiie
Exemplu: FFFFh + FFFFh = FFFEh {(-1) + (-1)} = -2; NV, CY

21

Exemple
mov

ax,0fffeh

; 65534 interpretat ca fr semn

add
ax,3
fr semn

; C = 1, O = 0

---

mov

ax,0FFFEh

; -2 interpretat ca numr cu semn

add

ax,3

; C = 1, O = 0

mov

bx,07FFFh

; 32767 interpretat ca nr cu semn

---

Ok - nr cu semn

add
bx,1
cu semn

; C = 0, O = 1

mov

bx,07FFFh

; 32767 interpretat ca fr semn

add

bx,1

; C = 0, O = 1

mov

ax,07h

; 7 interpretat fie cu semn fie fr semn

add
ax,03h
semn

; C = 0, O = 0

---

Condiie de overflow

-----

Condiie de Overflow

Ok - fr semn
Ok indiferent de

22

Setarea indicatorilor de stare

FLAG

Nume

Descriere

Observaii

ZF

Zero

1:ZR:Zero
0:NZ: Non-zero

1 indic faptul c rezultatul


0 altfel

1:CY
0:NC

Operaii matematice fr semn


deplasri (transport sau mprumut)

CF

Carry

OF

Overflow

1:OV

Operaii matematice cu s
Nr pozitive sau negative reprezentat
complement fa de 2

1:NG: -

Bitul cel mai semnificativ a


rezultatului

0:NV

SF

Sign Flag
0:PZ: +

23

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