Instruciuni de prelucrare la nivel de bit
Sponsored Links
This presentation is the property of its rightful owner.
1 / 33

Instrucţiuni de prelucrare la nivel de bit - instrucţiuni logice (NOT, AND, OR, XOR, TEST etc.); PowerPoint PPT Presentation


  • 70 Views
  • Uploaded on
  • Presentation posted in: General

Instrucţiuni de prelucrare la nivel de bit - instrucţiuni logice (NOT, AND, OR, XOR, TEST etc.); - instrucţiuni de deplasare (SHL, SAL, SHR, SAR etc.); - instrucţiuni de rotire (ROL, ROR, RCL, RCR); Instrucţiuni logice OF şi CF  0; AF - nedefinit;

Download Presentation

Instrucţiuni de prelucrare la nivel de bit - instrucţiuni logice (NOT, AND, OR, XOR, TEST etc.);

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Instruciuni de prelucrare la nivel de bit

- instruciuni logice (NOT, AND, OR, XOR, TEST etc.);

- instruciuni de deplasare (SHL, SAL, SHR, SAR etc.);

- instruciuni de rotire (ROL, ROR, RCL, RCR);

Instruciuni logice

OF i CF 0;

AF - nedefinit;

SF, ZF, PF - sunt poziionai conform rezultatului instruciunii.

NOT <dest>Nu afecteaz nici un indicator.

AND <dest>, <sursa>(dest) (dest) and (sursa)

OR <dest>, <sursa>(dest) (dest) or (sursa)

XOR <dest>, <sursa>(dest) (dest) xor (sursa)

TEST <dest>, <sursa>

Poziioneaz indicatorii pentru operaia

(dest) and (sursa), fr a modifica nici un operand.


  • Instruciuni de testare i modificare de bit.

    Bitul testat este specificat prin deplasamentul su (al doilea operand, dat de 8 bii sau reg_16/32) fa de bitul cel mai puin semnificativ al destinaiei (reg/mem_6/32). Ceilali indicatori sunt nedefinii.

    BT<dest>, <poziie>(Bit Test)

    (CF) Bit (dest, poziie)

    BTS<dest>, <poziie>(Bit Test and Set)

    (CF) Bit (dest, poziie),

    Bit (dest, poziie) 1

    BTR<dest>, <poziie>(Bit Test and Reset)

    (CF) Bit (dest, poziie),

    Bit (dest, poziie) 0

    BTC<dest>, <poziie>(Bit Test and Complement)

    (CF) Bit (dest, poziie),

    Bit (dest, poziie) Not (Bit (dest, poziie))


  • Instruciuni de scanare pe bit.

    Aceste instruciuni permit scanarea biilor din cel de-al doilea operand direct, ncepnd cu bitul mai puin semnificativ (forward) sau invers (reverse), pentru a determina primul bit egal cu 1. Dac toi biii sunt zero ZF=1, altfel ZF=0, i registrul destinaie va reine indexul primului bit 1 din operandul surs (reg/mem de aceeai dimensiune cu reg. Dest.). Modif. ZF, iar toi ceilali sunt nedefinii.

    - scanare direct:

    BSF<dest>, <sursa>(Bit Scan Forward)

    - scanare invers:

    BSR<dest>, <sursa>(Bit Scan Reverse)

  • Instruciuni de setare condiionat.

    Pun octetul pe zero sau unu, n funcie de una din cele 16 condiii definite de indicatori. Operandul destinaie poate fi reg/mem. Aceste instruciuni sunt folosite pentru implementarea expresiilor booleene, din limbajele de nivel nalt.


SETcond<dest>(SET byte on condition)

ifcondthen(dest) 1

else(dest) 0

SETE / SETZ ZF = 1

SETNE / SETNZ ZF = 0

SETL / SETNGE SF <> OF, valori cu semn

SETLE / SETNG SF <> OF sau ZF = 1, valori cu semn

SETNL / SETGE SF = OF, valori cu semn

SETNLE / SETG SF = OF i ZF = 0, valori cu semn

SETB / SETNAE / SETC CF = 1, valori fr semn

SETBE / SETNA CF = 1 sau ZF = 1,fr semn

SETNB / SETAE / SETNC CF = 0, valori fr semn

SETNBE / SETACF = 0 i ZF = 0,fr semn

SETO / SETNOOF = 1 / respectiv OF = 0

SETP / SETPEPF = 1, adic paritate par


SETNP / SETPOPF = 0, adic paritate impar

SETS / SETNSSF = 1 / respectiv SF = 0

  • Instruciuni de deplasare

    Deplasrile pot fi aritmetice sau logice. Se poate deplasa operandul destinaie cu pn la 31 de bii, corespunztor operandului contor, codificat n instruciune (sunt luai n considerare numai ultimii 5 bii ai acestuia).

    OF = este nedefinit ntr-o deplasare pe mai muli bii;

    = este poziionat pt. deplasare de un bit;

    CF = ultimul bit deplasat n afara operandului destinaie;

    AF = nedefinit;

    SF, ZF, PF = modificai conform rezultatului.

    SHL / SAL <dest>, <contor> (SHift logical / Arithmetic Left)

    Poziiile eliberate devin zero; ntre cele dou mnemonici nu exist nici o deosebire. Bitul cel mai semnificativ se deplaseaz n CF.


SHR<dest>, <contor>(SHift logical Right)

SAR<dest>, <contor>(Shift Arithmetic Right)

Bitul cel mai semnificativ i pstreaz vechea valoare, dar este i deplasat spre dreapta (extensie de semn), ceea ce nseamn c nu poate s apar depire (schimbarea de semn a rezultatului) i (OF)=0 la o deplasare de 1 bit.

Trebuie menionat c SAR nu furnizeaz acelai rezultat ca instruciunea IDIV, pentru aceeai operanzi, dac dempritul este negativ, i sunt deplasai (SAR) n afara operandului bii egali cu 1. De exemplu -5 deplasat la dreapta (SAR), cu un bit va furniza -3, n timp ce mprirea ntreag (IDIV) va furniza valoarea -2: (-5) = (11111011) (11111101) = (-3)

Diferena dintre cele dou instruciuni este c IDIV trunchiaz toate cturile ctre zero, n timp ce SAR trunchiaz numerele pozitive ctre zero, iar pe cele negative ctre infinit negativ.


La 386/486 pot fi realizate instruciuni de deplasare dubl, pe cuvnt sau dublu cuvnt. Operandul destinaie poate fi reg/ mem, iar sursa reg. general. Rezultatul nlocuiete operandul destinaie, iar contorul numrului de bii deplasai este specificat de registrul CL, sau ca o valoare imediat de 8 bii. Indicatorii sunt poziionai la fel ca la deplasrile anterioare.

SHLD<dest>, <sursa>, <contor>(SHift Left Double)

CF . . . . . . Dest

. . . . . .Sursa

SHRD<dest>, <sursa>, <contor>(SHift Right Double)

Dest . . . CF

Surs . . .


Registrul surs nu se modific. Instruciunea este util atunci cnd se mpacheteaz date din mai multe surse diferite.

  • Instruciuni de rotire

    n cazul rotaiilor, biii deplasai n afara operandului nu sunt pierdui, ca n cazul deplasrilor, ci sunt rotii (circulai) napoi ctre cellalt capt al operandului. ncepnd de la procesoarele 286 contorul, chiar dac este diferit de 1, el poate fi specificat n instruciune, ca dat imediat.

    Rotaiile modific numai CF i OF:

    CF = ultimul bit rotit n afara operandului;

    OF = nedefinit pentru rotaii multibit;

    = 1 sau 0, pentru rotaie doar de 1 bit, dup cum s-a modificat sau nu bitul de semn al operandului.


ROL<dest>, <contor>(ROtate Left)

CFBn . . . . . . B0Bn

ROR<dest>, <contor>(ROtate Right)

B0CFBn . . . . . . B0Bn

RCL<dest>, <contor>(Rotate through Carry Left)

B0 CF Bn . . . . . . B0CF

RCR<dest>, <contor>(ROtate through Carry Right)

B0 CF Bn . . . . . . B0CF

1) nmulirea cu 20 a uni numr din registrul AX:

; 20 = 16 + 4 = 24 + 22

; deci 2 deplasri la stnga, se salveaz rezultatul,

movcl, 2; care reprezint * 4, i nc dou deplasri

shlax, cl

movbx, ax; se salveaz *4 n (BX)


movcl, 2; contorul pentru nc dou deplasri (*16)

shlax, cl; care realizeaz * 16, i se adun cele dou

addax, bx; rezultate pariale

2) mprirea la 1024 a valorii din registrul AX:

movcl, 2; 1024 = 210 = 28 * 22

sarah, cl; dup 8 deplasri la dreapta AL se pierde

xchg ah, al; (sau mov ah, al), e suficient s deplasm AH la

cbw; dreapta cu 2, i apoi s-i facem extensia de semn

3) mprirea unui numr de 32 bii (64) la o putere a lui 2, de exemplu la 64 = 26:

mem_32dd50000;

. . . . .; trebuie deplasat numrul la dr. cu 6 bii

movcx, 6; contorul numrului de deplasri

iar:sarword ptr mem_32[2], 1; bitul 17 (CF)

rcrwordptr mem_32[0], 1; (CF) bitul 16

loop iar


4) Determinarea numrului de bii egali cu 1 dintr-o variabil.

.model small

.stack100h

.data

lung_varequ8

variabiladwlung_vardup (0acfh)

nr_unitatidb?

.code

assume cs: @code, ds: @data

start:movax, @data

movds, ax

movsi, 0; indexul curent al cuvintelor din variabila

movdl, lung_var; contor numr de cuvinte

movbl, 0; contor numr de uniti gsite

bucla2: movcx, 16; contorul de bii pentru un cuvnt


movax, variabila[si] ; se citete cuvntul curent

bucla1:

rclax, 1; o rotaie pentru a deplasa un bit

adcbl, 0; se contorizeaz numrul de uniti

loopbucla1; pentru un cuvnt

addsi, type variabila ; se actualizeaz indexul

decdl; se testeaz dac mai sunt cuvinte

jnzbucla2; dac da se reia citirea cuvintelor

movnr_unitati, bl; dac nu se depune rezultatul

movax, 4C00h; revenire DOS

int21h

end

4a). Aceeai problem poate fi rezolvat utiliznd instruciunile BSF i BTR, astfel:


movcx, lung_var; contor dimensiune variabil

movbl, 0; contor uniti

movsi, 0; index cuvinte

bucla:movax, variabila[si]

scanare:

bsfdx, ax; determin primul bit 1 (indexul n DX)

jzgata_cuv; dac ZF=0, toi biii sunt 0

btrax, dx; transfer 1 din AX, din poziia DX n CF,

adcbl, 0; iar bitul =0, sau inc bl, numr unitile

jmpscanare; se reia scanarea cuvntului curent

gata_cuv:

addsi, 2; indexul cuvntului urmtor

loop bucla; decrementare contor numr de cuv. variabil

; dac nu s-a terminat variabila ia cuv. urmtor


5) Tiprirea coninutului registrului DX, n format octal:

tip_carprocfar

; procedura tiprete caracterul al crui cod ASCII

; l primete n registrul AL

pushdx; se salveaz registrul de lucru DX

movdl, al; se apeleaz funcia 2 din DOS care

movah, 2; tiprete caracterul al crui cod

int21h; ASCII se transmite n registrul DL

popdx; se reface registrul salvat

ret

tip_carendp

tip_octalprocfar

; tiprete n octal valoarea, fr semn transmis n DX

pushcx; se salveaz registrele de lucru

pushax


; prima cifr de tiprit este doar de 1 bit

roldx, 1; care este rotit pe ultimul bit

moval, dl; i dus n registrul AL

andal, 1; se terg ceilali bii

addal, 30h; este convertit la codul ASCII

calltip_car; i se tiprete

; urmtoarele 5 cifre sunt de cte 3 bii

movcx, 5; contor numr de cifre de tiprit

octal1:pushcx; se salveaz contorul n stiv

movcl, 3; contor numr de rotiri la stnga

roldx, cl; cifra este rotit pe ultimii 3 bii

moval, dl; i adus n AL

andal, 7; sunt teri ceilali bii

addal, 30h; i convertit la codul ASCII

calltip_car; tiprirea cifrei


popcx; se citete valoarea contorului de cifre

loopoctal1

popax; se refac registrele salvate n stiv

popcx

ret

tip_octalendp


  • Instruciuni de operare pe iruri

    Exist cinci operaii de baz ce opereaz pe iruride lungime de pn la un segment (64K la 286, respectiv 4G la 386/486), i permit: mutare, comparare de iruri, scanarea unui ir pentru o valoare i transfer la/de la acumulator. Aceste operaii de baz pot fi precedate de un prefix special de un octet care are ca efect repetarea instruciunii prin hardware. Repetiia se poate termina printr-o varietate de condiii, iar o operaie repetat poate fi ntrerupt sau suspendat.

    O instruciune pe ir poate avea un operand surs, un operand destinaie sau pe amndoi. irul surs este n (DS) sau ntr-un alt segment, dac este prefixat peste aceast presupunere. irul destinaie se afl, ntotdeauna, n segmentul dat de registrul (ES).

    SI este ca offset pentru elementului curent al irului surs, iar DI este offset pentru irul destinaie. Instruciunile pe ir actualizeaz automat SI i/sau DI. DF determin dac registrele index sunt auto-incrementate-decrementate (DF=0-1), iar pas de actualizare depinde de tipul irurilor: 1 - octet, 2 - cuvnt, 4 - dublu cuvnt.


Dac este prezent un prefix de repetare reg. CX este decrementat la fiecare repetiie a instruciunii pe ir; repetarea va lua sfrit cnd CX=0, sau pentru unele prefixe i n funcie de ZF.

Sunt cinci mnemonici pentru dou forme de prefix octet, care controleaz repetarea unei instruciuni pe ir(uri). Prefixele de repetare nu afecteaz indicatorii.

REP / REPE / REPZ / REPNE / REPNZ

REP - REPeat - este utilizat mpreun cu MOVS- STOS, "repet ct timp nu este sfritul irului, adic (CX<>0)";

REPE / REPZ - REPeat while Equal / Zero - care opereaz la fel i au fizic acelai prefix octet ca REP. Sunt utilizate pentru CMPS i SCAS, i necesit, n plus fa de condiia anterioar, ca ZF s fie setat nainte de efectuarea urmtoarei repetiii;

REPNE / REPNZ - REPeat while Not Equal / Zero - este asemntor cu cele anterioare, cu deosebirea c ZF trebuie pus pe 0, sau repetiia se termin.


MOVS <sir_dest>, <sir_sursa> (MOVe data from String to string)

MOVSB / MOVSW / MOVSD

Se transfer un element (octet/cuvnt/dublu cuvnt) de la surs (SI) la destinaie (DI), i actualizeaz SI/DI

Utilizat mpreun cu prefixul REP realizeaz un transfer de bloc memorie-memorie.

CMPS<sir_dest>, <sir_sursa>(COMPare String operands)

CMPSB / CMPSW / CMPSD

Aceast instruciune scade operandul destinaie (referit de DI) din cel surs (referit de SI), modific indicatorii de stare, dar nu altereaz nici unul dintre operanzi, dup care actualizeaz SI/DI.

Trebuie reinut c spre deosebire de instr. CMP care scade sursa din destinaie, CMPS realizeaz scderea invers: surs - destinaie.

Dac CMPS are prefixul REPE sau REPZ operaia este interpretat "compar ct timp nu este sfrit irul (CX<>0) i irurile sunt egale (ZF=1)"; determina prima pereche de elemente diferite.


Dac CMPS este precedat de REPNE/REPNZ "compar ct timp nu este sfrit de ir (CX<>0), i elementele irurilor nu sunt egale (ZF=0)"; determina prima pereche de elemente egale.

SCAS<sir_dest>(SCAn String data)

SCASB / SCASW / SCASD

Instruciunea scade elem. ir dest. (octet/ cuvnt/ dublu cuvnt) adresat de DI, din AL, AX sau EAX, i actualizeaz indicatorii, dar fr a modifica irul destinaie sau acumulatorul.

Dac SCAS este prefixat de REPE/REPZ "scaneaz ct timp nu este sfritul irului (CX<>0) i valoarea scanat este egal cu elementele irului (ZF=1)"; determina abaterea fa de o valoare.

Dac SCAS este prefixat de REPNE/REPNZ "scaneaz ct timp nu este sfritul irului (CX<>0) i valoarea scanat este diferit de elementele irului (ZF=0)"; localizeaz o valoare ntr-un ir.


LODS<sir_sursa>(LOaD String operand)

LODSB / LODSW / LODSD

Transfer elementul irului surs adresat de SI, n AL, AX sau EAX, i actualizeaz SI. Instruciunea se utilizeaz n bucle soft.

STOS<sir_dest>(STOre String data)

STOSB / STOSW / STOSD

Transfer un element din acumulator (AL, AX, EAX) n irul destinaie, i actualizeaz DI, pentru a referi urmtorul element.

Instruciunea poate fi precedat de prefixul REP, i astfel se poate iniializa un ir cu o constant.


1) Copierea unui ir de octei dintr-o zon de memorie ntr-alta.

date_sirsegmentwordpublic'data'

sir1db1000 dup (7,0f0h); irul surs

lung1equ$ - sir; lungimea irului surs

sir2db1000 dup (2 dup (?)); rezervare pt. ir dest.

ptr_sir1ddsir1; pointer sir1

ptr_sir2ddsir2; pointer sir2

date_sirends

codsegmentwordpublic'code'

assume cs:cod, ds:date_sir, es:date_sir

start:movax, date_sir; iniializare registru segment DS

movds, ax; i apoi adresele celor dou iruri

moves, ax; sau:lesdi,ptr_sir2

leadi, sir2;ldssi,ptr_sir1

leasi, sir1


movcx, lung1; contorul transferului = lungimea sursei

cld; direcia de parcurgere a irului (df=0)

repeta:

lodsb

stosb; sau: movs sir2,sir1 , sau movsb

looprepeta; sau:repmovsb

movax, 4c00h; revenire DOS

int21h

codends

endstart


2) Copierea informaiei dintr-un buffer din memorie n memoria ecran. n modul text pentru fiecare caracter de pe ecran se rezerv doi octei: unul reprezint atributele de afiare (afiare continu / intermitent - 1 bit, culoare fond - 3 bii, culoare caracter - 4 bii), iar cel de-al doilea este codul ASCII al caracterului afiat.

.model small

.data

mem_ecrandd0B8000000h; adresa memoriei ecran

dimensiuneequ2000

buffer dw dimensiune dup (3a33h); se va afia acelai caracter

ptr_bufddbuffer

.code

start:movax, @data; iniializare DS

movds, ax

movah, 0; selecie mod de lucru

moval, 0; alfanumeric 40*25 alb/negru, pt. 80*25 al=2


int10h

lesdi, mem_ecran

ldssi, ptr_buf

movcx, dimensiune

cld; direcia de parcurgere

repmovsw; transfer buffer n mem_ecran

movax, 4c00h; revenire DOS

int21h

.stack10h

endstart


3) Determinarea poziiei unui anumit caracter (sau a unui ir de caractere) ntr-un fiier surs de pe disc.

.model small

.stack10h

.data

carequ'A; caracterul de identificat (sau irul)

lung equ 2048; dimensiunea maxim a fiierului-4 sectoare

bufferdb lung dup (?); spaiu de mem. pentru fiier

nume_fis db 'fisier.asm', 0 ; nume fii.- ASCIIZ, adic dup

; numele poate fi precedat i de calea de acces

pozitiedw?; poziia caracterului n fiier

nr_logicdw? ; numrul logic atribuit fiierului

contordw?; numrul efectiv de caractere citite

mes_lipsadb'nu exista fisier cu acest nume$'

mes_err_citdb'eroare de citire de pe disc$'

mes_car_lipsadb'caracterul cautat nu este in fisier$'


.code

start:movax, @data; iniializare DS

movds, ax

movah, 3dh; apel DOS pentru deschidere de fiier

moval, 0; n modul "citete" (1-scrie,2-citire/scriere)

leadx, nume_fis; adresa numelui fiierului

int21h; apel funcie 'deschide fiier'

jclipsa_fis

movnr_logic, ax; se depune numrul sectorului

movbx, ax; i n BX, pentru funcia de citire

movcx, lung; contor numr maxim de caractere citite

leadx, buffer; adresa unde se vor depune caracterele

movah, 3fh; funcia de citire din fiier

int21h

jcerr_cit; dac a aprut eroare al citire


movcontor, ax; la 'contor' se depune numrul de car.

movcx, ax; contor de cutare 'car'

push ds; se ncarc n ES adresa de segment

popes; a 'buffer'-ului

leadi, buffer; i n registrul (DI) offsetul acestuia

moval, car; caracterul de cutat

cld; stabilire direcie de parcurgere, (DF)=0

repnescasb; continu scanarea pn-l gsete

jegasit; dac nu s-a gsit nu se face saltul

leadx, mes_car_lipsa; i se tiprete mesajul

movah, 9; mesajul: 'caracterul cautat nu este in fisier'

int21h

jmpgata

gasit:decdi; poziia caracterului cutat, (DI)-1

movpozitie, di; deoarece (DI) a fost actualizat dup


jmpgata; scanare

lipsa_fis:

leadx, mes_lipsa; nu s-a gsit fiierul cu

movah, 9; numele specificat

int21h

jmpgata

err_cit:

leadx, mes_err_cit; eroare la citirea fiierului

movah, 9

int21h

gata:movah, 3eh; nchiderea fiierului deschis

movbx, nr_logic

int21h

movax, 4c00h; revenire DOS

int21h

endstart


Determinarea poziiei unui ir de caractere ntr-un fiier:

sir_cardb'asamblare'

lung_sirdw$-sir_car

ptr_sirddsir_car

ptr_bufddbuffer

pozitie dw ?; poziia irului de caractere

. . . . . . . . . . . . . . . . . . .

lesdi, ptr_buf

ldssi, ptr_sir

movcx, contor; dimensiune buffer

subcx, lung_sir; cutarea se va face ncepnd de la 0

inccx; pn la (contor) - (lung_sir)

cld; direcia de parcurgere (DF=0)

reia:push si; se salveaz adresa irului cutat

push di; se salveaz adresa irului n care se cut


push cx; se salveaz contorul numrului maxim de cutri

movcx, lung_sir; contorul de comparaii

repe cmps buffer, sir_car; se compar ct timp sunt egale

popcx; reface resurse salvate n stiv: contorul

popdi; i adrese iruri: destinaie - irul n care se

popsi ; caut, surs (sub)irul care se caut

jegasit; salt dac s-a gsit sir_car n buffer

incdi; cutarea se va relua de la urmtorul caracter

loopreia; din buffer, dac (contor) <> 0

; -> irul de caractere nu este n fiierul dat (respectiv n buffer)

jmpnu_gasit

gasit:movpozitie, di; valoarea salvat pentru (DI)

. . . . . . . . . . . . . . . . . . .

nu_gasit:; tiprire mesaj: Nu s-a gasit sirul de caractere


  • Login