Sunteți pe pagina 1din 17

BTI

ASM - 2

Rzvan Daniel ZOTA


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

Coninut
Instruciuni de control al programului
Instruciuni de salt necondiionat
Instruciuni de salt condiionat
Utilizarea procedurilor i macrourilor

Salt necondiionat
JMP
Short jump - instruciune pe 2-octei ce permite saltul la locaia de
memorie n intervalul +127 i -128 octei de la locaia de memorie ce
urmeaz saltului
OPCODE
DISP
JMP

SHORT Label

Near jump instruciune pe 3-octei ce permite saltul n intervalul


+/- 32Kb de la locaia instruciunii din segmentul de cod curent
JMP

Label

OPCODE

DISP low

DISP high

Far jump instruciune pe 5-octei ce permite saltul la o locaie de


memorie n ntregul spaiu de memorie
JMP

Label

OPCODE

IP low

IP high

CS low

CS high

Pentru 80386, 80486, saltul near este n spaiul +/-2G dac


computerul opereaz n mod protejat i n domeniul +/-32K bytes
pentru modul real

Salturi condiionale
Instruciunile logice i aritmetice seteaz flag-urile
Flag-urile ofer informaii de stare n urma instruciunilor
anterioare
Prin utilizarea indicatorilor de stare se pot realiza salturi
condiionale transferul execuiei programului ctre o alt
instruciune din cadrul programului
dac condiia a fost adevrat
Salt napoi sau nainte ctre locaia specificat
Pointerul de instruciuni (IP) se modific n mod continuu
(pentru a se referi la instruciunea urmtoare ce va fi
executat)

dac condiia a fost fals


Se continu execuia cu urmtoarea instruciune
IP este incrementat ca de obicei
4

Salturi condiionale (cont.)


Salturile condiionale sunt totdeauna short pentru 808680286
Domeniul saltului este ntre +127 bytes i -128 bytes de la
locaia urmtoare saltului condiional

La 80386, 80486 salturile condiionale sunt fie short fie near


Salturile condiionale testeaz: sign (S), zero (Z), carry (C),
parity (P) i overflow (O)
Observaie:
Val. FFh este mai mare dect 00h n mulimea numerelor fr semn
Val. FFh (-1) este mai mic dect 00h pentru numere cu semn
La comparaia:
00h dar
cu semn

fr semn

ffh este mai mare dect

ffh este mai mic dect 00h

Comparaii numerice
CMP(compare) compar dou valori X i Y
Echiv cu o scdere care modific doar indicatorii de stare
Folosit pentru verificarea coninutului unui registru sau a
unei locaii de memorie cu o alt valoare
De regul se folosete cu o instruciune de salt condiional
cmp

al, 10h

;compar cu 10h (coninutul lui AL nu se

SUPER

;dac este 10h sau mai mare se face salt la


;memorie SUPER

modific)

jae
locaia de

SUB (subtraction) calculeaz diferena X - Y


Salveaz rezultatul n X i seteaz indicatorii de stare

Setri ale indicatorilor


CMP

Op1, Op2

Operanzi fr semn

Operanzi cu semn

Z: egalitate/inegalitate

Z: egalitate/inegalitate

C: Op1 < Op2 (C=1)


Op1 >= Op2 (C=0)

C: fr semnificaie

S: fr semnificaie
O: fr semnificaie

S i O mpreun
Dac ((S=0) i (O=1)) sau ((S=1) i (O=0))
atunci Op1 < Op2
Dac ((S=0) i (O=0)) sau ((S=1) i (O=1))
atunci Op1 >= Op2

Compararea ntregilor cu semn


Fie CMP AX,BX
Bitul Sign bit (S) va fi setat n funcie de rezultatul AX-BX (dac are
un 1 n cmsb al rezultatului)
Bitul Overflow flag (O) va fi setat dac rezultatul AX-BX a produs un
numr n afara domeniului de definiie (-32768 - 32767 pentru 16bii) reprezentat ca ntreg.

Instruciunile JS (jump on sign) i JL (jump less than)


JS se uit la sign bit (S) ultimei comparri sau scderi.
Dac S = = 1 atunci se face salt.
JL verific (S XOR O) pentru ultima comparaie (sau scdere)
Indiferent de valoarea lui AX-BX (chiar dac a produs
depire) JL va fi corect executat

Compararea ntregilor cu semn (cont.)`2


JL este adevrat:
S=1, O=0:
(AX-BX) negativ i (AX-BX) nu a produs depire
Examplu (8-bii):
(-5) - (2) = (-7)
Rezultatul (-7) are bitul de semn setat
Astfel (-5) este mai mic dect (2).

Ramificare condiional (cont.)


Terminologia folosit pentru a diferenia instruciunile care
folosesc carry flag i cele care utilizeaz overflow flag
Above/Below

comparaie fr semn

Greater/Less

comparaie cu semn

Semnificaia numelor instruciunilor de salt


J

=>

Jump

=>

Not

A/B G/L

=>

Above/Below Greater/Less

=>

Equal

10

Sumarul instruciunilor de salt condiional


Comand

Descriere

Condiie

JA=JNBE

Jump if above

C=0 & Z=0

Jump if not below or equal


JBE=JNA

Jump if below or equal

JAE=JNB=JNC Jump if above or equal

C=1 | Z=1
C=0

Jump if not below


Jump if no carry
JB=JNA=JC

Jump if below

C=1

Jump if carry
JE=JZ

Jump if equal

Z=1

Jump if Zero
JNE=JNZ

Jump if not equal

Z=0

Jump if not zero


JS

Jump Sign (MSB=1)

S=1
11

Sumarul instruciunilor de salt condiional


Comand

Descriere

Condiie

JNS

Jump Not Sign (MSB=0)

S=0

JO

Jump if overflow set

O=1

JNO

Jump if no overflow

JG=JNLE

Jump if greater

JGE=JNL

O=0

Jump if not less or equal

S=O & Z=0

Jump if greater or equal

S=O

Jump if not less


JL=JNGE

Jump if less

S^O

Jump if not greater or equal


JLE=JNG

Jump if less or equal

S^O | Z=1

Jump if not greater


JCXZ

Jump if register CX=zero

CX=0

12

Compararea testelor condiionale cu cod liniar

cmp ax, bx
ja
true_label
.
<False Processing>
.
jmp
done_label
.
true_label: <True processing>
.
done_label: <resume execution>

13

Compararea testelor condiionale cu cod


liniar (cont.)

14

Instruciunea LOOP
Instruciunea LOOP
Este o combinaie de decrementare a lui CX cu un salt
condiional
LOOP decrementeaz CX (ECX pentru modul 32-bit) i dac
CX 0 sare la adresa indicat de etichet
dac CX devine 0, va fi executat urmtoarea instruciune

15

Utilizarea unei proceduri


Exemplu:
.....
.code
pstart:
mov ax,@data
mov ds,ax
mov bx, offset mesaj1
call afisare
mov bx, offset mesaj2
call afisare
.
Afisare PROC NEAR
urm:
mov dl,[bx]
and dl,dl
jz sfarsit
inc bx
mov ah,2
int 21h
jmp urm

sfarsit:

RET
Afisare ENDP
END pstart

16

Utilizarea unui macro

Exemplu:

; io.h
exit_dos macro
mov ah,4ch
int 21 h
endm
afisare macro x
lea dx,x
mov ah,9
int 21h
endm

.model small
include io.h
.stack 200H
.data
Mesaj1 DB Hello1$
Mesaj2 DB Hello2$
.code
pstart:
mov dx, @data
mov ds, dx
afisare mesaj1
afisare mesaj2
exit_dos
end pstart

17

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