Limbajul Assembler abc-doar


AND d,s *---**?** Logical AND



Yüklə 1,03 Mb.
səhifə3/10
tarix16.12.2017
ölçüsü1,03 Mb.
#35021
1   2   3   4   5   6   7   8   9   10

AND d,s *---**?** Logical AND

CALL a --------- Call

CBW --------- Convert Byte to Word in AX

CLC --------- Clear Carry

CLD -0------- Clear Direction

CLI --0------ Clear Interrupt

CMC --------* Complement Carry

CMP d,s *---***** Compare

CMPS *---***** Compare memory at SI and DI

CWD --------- Convert Word to Double in AX,DX

DAA ?---***** Decimal Adjust for Add in AX

DAS ?---***** Decimal Adjust for Substract in AX

DEC d *---****- Decrement

DIV s ?---????? Divide (unsigned) in AX (,DX)

ESC s --------- Escape (to external device)

HLT --------- Halt

IDIV s ?---????? Divide (signed) in AX (,DX)

IMUL s *---????* Multiply (signed) in AX(,DX)

IN d,p --------- Input

INC d *---****- Increment

INT --00----- Interrupt

INTO --**----- Interrupt on Overflow

IRET ********* Interrupt Return

JB/JNAE a --------- Jump on Below/Not Above or Equal

JBE/JNA a --------- Jump on Below or Equal/Not Above

JCXZ a --------- Jump on CX Zero

JE/JZ a --------- Jump on Equal/Zero

JL/JNGE a --------- Jump on Less/Not Greater or Equal

JLE/JNG --------- Jump on Less or Equal/Not Greater

JMP a --------- Unconditional Jump

JNB/JAE a --------- Jump on not Below/Above or Equal

JNBE/JA a --------- Jump on not Below or Equal/Above

JNE/JNZ a --------- Jump on not Equal/Not Zero

JNL/JGE a --------- Jump on not Less/Greater or Equal

JNLE/JG a --------- Jump on not Less or Equal/Greater

JNO a --------- Jump on not Overflow

JNP/JPO a --------- Jump on not Parity/Parity Odd

JNS a --------- Jump on not Sign

JO a --------- Jump on Overflow

JP/JPE a --------- Jump on Parity/Parity Even

JS a --------- Jump on Sign

LAHF --------- Load AH with 8080 Flags

LDS r,s --------- Load pointer to DS


-14-

MNEMONIC ODITSZAPC (flags) DESCRIPTION

LEA r,s --------- Load EA to register

LES r,s --------- Load pointer to ES

LOCK --------- Bus Lock prefix

LODS --------- Load memory at SI into AX

LOOP a --------- Loop CX times

LOOPNZ/LOOPNE a --------- Loop while not Zero/Not Equal

LOOPZ/LOOPE a --------- Loop while Zero/Equal

MOV d,s --------- Move

MOVS --------- Move memory at SI to DI

MUL s *---????* Multiply (unsigned) in AX(,DX)

NEG d *---***** Negate

NOP --------- No Operation ( =XCHG AX,AX )

NOT d --------- Logical NOT

OR d,s *---**?** Logical inclusive OR

OUT p,s --------- Output

POP d --------- Pop

POPF ********* Pop Flags

PUSH s --------- Push

PUSHF --------- Push Flags

RCL d,c *-------* Rotate through Carry Left

RCR d,c *-------* Rotate through Carry Right

REP/REPNE/REPNZ --------- Repeat/Repeat Not Equal/Not Zero

REPE/REPZ --------- Repeat Equal/Zero

RET (s) --------- Return from call

ROL d,c --------- Rotate Left

ROR d,c *-------* Rotate Right

SAHF ----***** Store AH into 8080 Flags

SAR d,c *---**?** Shift Arithmetic Right

SBB d,s *---***** Substract with Borrow

SCAS *---***** Scan memory at DI compared to AX

SEG r --------- Segment register

SHL/SAL d,c *---**?** Shift logical/Arithmetic Left

SHR d,c *---**?** Shift logical Right

STC --------- Set Carry

STD -0------- Set Direction

STI --0------ Set Interrupt

STOS --------- Store AX into memory at DI

SUB d,s *---***** Substract

TEST d,s *---**?** AND function to flags

WAIT --------- Wait

XCHG r (,d) --------- Exchange

XLAT --------- Translate byte to AL

XOR d,s *---**?** Logical Exclusive OR
Descrierea instructiunilor este destul de clara si intuitiva in original,

motiv pentru care am evitat contorsiunile gramaticale prin care se traduce

in limba romana definitia originala.In principiu,conditiile logice si

operatiile descrise sunt destul de usor de inteles.Pentru majoritatea

instructiunilor se va face si o descriere mai completa,insotita de cate

un exemplu simplist(vezi mai departe).


-15-

Semnificatia notatiilor utilizate este urmatoarea:

FLAG DESCRIERE

OF (O) OverFlow Flag (Bit 11)

DF (D) Direction Flag (Bit 10)

IF (I) Interrupt Enable Flag (Bit 9)

TF (T) Trap Flag (Bit 8)

SF (S) Sign Flag (Bit 7)

ZF (Z) Zero Flag (Bit 6)

AF (A) Auxilliary carry Flag (Bit 4)

PF (P) Parity Flag (Bit 2)

CF (C) Carry Flag (Bit 0)

reprezentand setarile din registrul FLAGS.

Alte simboluri utilizate in tabele sau programe sunt:

SIMBOL SEMNIFICATIE

a adresa

c contor (count)

d destinatie

e expresie sau sir

p port I/O

r registru

s sursa

sr registru segment (CS,DS,SS,ES)

sy simbol

t tipul simbolului

- neafectat

* afectat

0 resetat

1 setat

? necunoscut

ASSUME sr:sy Asuma numele registrului de segment (s)

ASSUME NOTHING Sterge toate asumtiile anterioare

DB e(,...) Defineste byte-ul(sau mai multi bytes)

DBS e Defineste byte-ul arhivat

DD e(,...) Defineste un cuvant dublu(double word)(/mai multe)

DDS e Defineste un cuvant dublu arhivat (storage)

DW e(,...) Defineste cuvinte (words)

DWS e Defineste cuvinte arhivate (storage)

EXT (sr:)sy(t) Extern (t=ABS/BYTE/DWORD/FAR/NEAR/WORD)

LABEL t Eticheta (t=BYTE,DWORD,FAR,NEAR,WORD)

PROC t Procedura (t=FAR/NEAR,default NEAR)

ABS valoarea absoluta a operandului

BYTE operatie la nivel de byte

DWORD operatie cu date de tip dword

FAR registrii IP si CS sunt modificati

HIGH cei 8 biti mai semnificativi (din 16)

LENGTH numarul unitatilor de baza

LOW cei 8 biti mai putin semnificativi (din 16)

NEAR nu se modifica decat registrul IP

OFFSET offset-ul adresei (din segment)

PTR creaza o variabila sau o eticheta (pointer)

SEG segmentul unei adrese


-16-

SIMBOL SEMNIFICATIE

SHORT un byte la operatiile de jump (salt)

SIZE numarul de bytes definiti prin declaratie

THIS creaza o variabila sau eticheta din tipul respectiv

TYPE numarul de bytes din unitatea definita

WORD operatie la nivel de word (16 biti)

AX registrul acumulator

BX registrul baza

CX registrul counter (contor)

DX registrul pentru date

AL registrul inferior din AX (cu semnificatie mica)

BL -"- -"- din BX

CL -"- -"- din CX

DL -"- -"- din DX

AH registrul superior din AX (cu semnificatie mare)

BH -"- -"- din BX

CH -"- -"- din CX

DH -"- -"- din DX

SP registrul stiva (stack)

BP rezistrul pointer spre baza stivei

SI registrul Index sursa

DI registrul Index destinatie

CS registrul segment de cod

DS registrul segment de date

SS registrul segment de stiva

ES registrul segment extra

IP registrul pointer de instructiuni
Acestea sunt toate formulele mnemonice recunoscute de catre procesorul

8086.Modul lor de combinare,pentru a forma programe,tine de experienta

fiecarui programator.Nu toate instructiunile corecte pot fi executate.Este

necesar sa se respecte si o anumita sintaxa.Prin combinarea simbolurilor

recunoscute de catre procesor si respectand regulile de sintaxa,se for-

meaza un limbaj articulat,care se adreseaza direct procesorului.Acest

limbaj poarta numele de limbaj de asamblare (deaorece asambleaza coduri

binare si instructiuni elementare sub forma de procese succesive execu-

tabile.

Pentru a edita un program in limbaj de asamblare(assembler) se poate

utiliza orice editor de text.Programul se editeaza sub forma unui text

simplu si se arhiveaza intr-o fila de tip text,la care se specifica o

extensie de tip .asm pentru a fi usor se recunoscut si apoi compilat.

Pentru a putea executa programul,este nevoie de un program denumit tot

assembler,care efectueaza operatia de compilare si transforma fila text

intr-o fila executabila pe care o arhiveaza cu terminatia .com sau .obj,

sau .exe(in functie de assamlorul utilizat).Practic,compilatorul face

conversia caracterelor si a instructiunilor in coduri binare executabile.

EXEMPLU mov al,061h devine 10110000 01100001 (pe 16 biti)

sau pentru formatul de 32 de biti:

jmpl %r15+4,%r0 devine 10000001 11000011 11100000 00000100

Operatia inversa poarta numele de dezasamblare(cu program dezasamblor) si

se utilizeaza pentru a transforma codurile binare in caractere tip text.


-17-

LIMBAJUL ASSEMBLER (prezentare generala)
In prezent exista un numar foarte mare de asambloare si dezasambloare,

fiecare cu particularitatile,avantajele si dezavantajele sale.Programa-

torii profesionisti vor alege un anumit program de asamblare in functie

de necestiatile de moment,sau in functie de necesitatile utilizatorilor.

In etapa actuala de dezvoltare a programelor software,exista putine

situatii in care poate fi necesar un program complex,scris in intregime

in assembler.Tendinta actuala este de a forma module executabile,care sa

poata fi apelate din cat mai multe medii de operare posibil.Programele

comerciale de nivel inalt,cum sunt C++ si Visual C++,Pascal si Delphi etc.

au si cate un assembler inclus denumit BASM(Built-in Assembler) sau TASM

(Turbo Assembler),care permite compilarea filelor .asm sau editarea de

functii si proceduri in limbaj de asamblare.

Acest manual prezinta doar notiunile elementare,la nivel de abecedar,

motiv pentru care am ales pentru prezentarea limbajului assembler pro-

gramul BASM inclus in Borland Pascal version 7.0,din urmatoarele motive:

1. Limbajul Pascal este extrem de raspandit (se invata in licee)

2. Filele executabile generate pot fi lansate direct din Windows

3. Este extrem de usor de utilizat si portabil in Delphi si C++

4. Permite toate tipurile de programare structurata,modulara (functii,pro-

ceduri,obiecte,resurse Windows,unitati,biblioteci DLL etc.)

5. Interfata grafica este simpla si accesibila

6. Compilatorul este simplu si eficient

7. Genereaza direct file executabile (cu extensia .exe) si nu mai sunt

necesare filele de tip .OBJ,.COM .ASM etc.

8. Limbajul assembler optimizeaza si extinde limitele limbajului Pascal

9. Limbajul assembler permite exploatarea resurselor Windows,impreuna cu

cele ale sistemului DOS (prin apelul nivelurilor de intrerupere)

10. Exista o versiune gratuita pentru Pascal si o bogata bibliografie

11. Este mai usor de inteles decat limbajul C++,iar modulele generate

sunt mai usor de exploatat

12. Necesita un numar mai mic de file si de module si ocupa mai putina

memorie

Programul assembler inclus in Pascal permite apelarea instructiunilor de

procesor 8086 - 80286 (doar in format de 16 biti).Pentru cei care doresc

sa utilizeze si registrii de 32 de biti,este recomandabil sa utilizeze un

alt mediu de operare (de exemplu Visual C++ accepta instructiuni pana la

80486 inclusiv).Dupa invatarea regulilor elementare,puteti utiliza orice

compilator sau emulator,dar,respectand regulile de sintaxa specifice

fiecarui mediu de operare.

In mediul Windows Pascal si Object Pascal,toate datele si operatiile

sunt incluse in ferestre de tip Windows,care asigura o oarecare "protectie"

fata de eventualele erori de format.In alte medii de operare,o eroare cat

de mica se poate transforma intr-o mica tragedie(eroare irecuperabila).

Din toate aceste considerente,este recomandabil ca incepatorii sa

utilizeze mai ales acest program in etapa de alfabetizare.Este bine ca

utilizatorii sa cunoasca foarte bine limbajul Pascal inainte de a incepe

sa programeze si editeze functii noi,scrise in assembler.Limbajul assem-

bler nu schimba fundamental posibilitatile de expresie,ci doar permite

optimizarea sau restructurarea formelor de organizare a datelor.


-18-

Astfel,de exemplu,daca o bucla de repetitie cu 1000 de cicli dureaza in

Pascal circa 45 de secunde,aceeasi bucla editata in assemmbler se va

executa in mai putin de 10 secunde.Acest gen de optimizari este foarte

util pentru editarea de browsere pentru Internet (exista si NASM,adica

un assembler scris pentru aplicatiile de retea).
BASM

Pentru a introduce intr-un program scris in Pascal,rutine scrise in

assembler,se utilizeaza cuvantul cheie asm.Toate elementele scrise in

assembler vor fi incluse intr-o bucla asm ... end; (asemenatoare cu

buclele begin ... end; din Pascal.

EXEMPLU: program assmb1;

uses WinCRT;

var regAX,RegBX:word;

begin

asm

mov ax,10

mov bx,0Ah

mov regAX,ax

mov regBX,bx

end;

writeln('Continutul registrului AX este: ',regAX);

writeln('Continutul registrului BX este: ',regBX);

end;

(mov este instructiunea 8086 pentru transferul datelor )

Programul se compileaza si se executa la fel ca orice program Pascal.

In exemplul de mai sus,am introdus cate o valaore in cei doi registri

generali AX si BX,apoi am transferat valoarea registrilor in cele doua

variabile declarate in acest scop.Observati ca ambii registri returneaza

aceeasi valoare.Explicatie: daca nu se specifica altfel,se considera ca

valorile numerice sunt decimale.Daca se adauga un h,acesta specifica

formatul hexazecimal (0123456789ABCDEF).In exemplul de mai sus,0Ah (in

format hexazecimal)=10 decimal.La transferarea valorii din registru in va-

riabila se va utiliza sistemul implicit,adica cel decimal.Concluzie,

atunci cand utilizati alt format decat cel decimal(octal sau hexazecimal),

verificati cu atentie valoarea datelor returnate.

Sintaxa generala a unei bucle asm ... end este:

asm

[Label:]
[Opcode [Operand <,Operand>]]


end;

unde: Label este o eticheta (identificator)

Prefix este prefixul unui cod operant (LOCK,REP,SEGCS etc.)

Opcode este o instructiune sau o declaratie

Operand este o expresie (constanta,registru,simbol,operator)

Separator poate fi un comentariu Pascal (inclus intre acolade)

un punct si o virgula(;) sau sfarsitul liniei

Daca se includ mai multe declaratii pe o singura linie

se vor separa prin ; iar daca se scriu linii separate

pentru fiecare declaratie se poate omite semnul ;

(EXEMPLU: mov AX,10;mov BX,7;mov CX,3 )

Programele cu o singura declaratie/linie sunt mult mai usor de depanat.


-19-

Limbajul assembler recunoaste urmatoarele cuvinte cheie (nu pot fi utili-

zate ca identificatori,nu pot fi redenumite sau sterse din memorie,etc.):

AH -registru de 8 biti,cei cu semnificatie mare

AL -registru de 8 biri,cei cu semnificatie mica

AND -operatorul binar AND (si) EXEMPLU: x AND y (adica x si y)

AX -registru general de 16 biti

BH -registru de 8 biti,cei cu semnificatie mare

BL -registru de 8 biti,cei cu semnificatie mica

BP -registru de 16 biti pentru pointer sau indexare

BX -registru general de 16 biti

BYTE -un byte Tipul expresiei 1

CH -registru de 8 biti,cei cu semnificatie mare

CL -registru de 8 biti,cei cu semnificatie mica

CS -registru de 16 biti de segment

CX -registru general de 16 biti

DH -registru de 8 biti,cei cu semnificatie mare

DI -registru de 16 biti pentru pointer sau indexare

DL -registru de 8 biti,cei cu semnificatie mica

DS -registru de 16 biti de segment

DWORD -cuvant dublu (4 bytes) Tipul expresiei 4

DX -registru general de 16 biti

ES -registru de 16 biti de segment

FAR -se utilizeaza pentru adrese situate in afara modulului curent

Tipul expresiei este 0FFFFH

HIGH -returneaza cei 8 biti semnificativi dintr-un word

LOW -returneaza cei 8 biti mai putin semnificativi dintr-un word

MOD -executa operatia modul (impartire cu rest) (Exemplu: 7 MOD 3

NEAR -se utilizeaza pentru adrese apropiate Tipul expresiei 0FFFEH

NOT -determina negarea unei expresii operator binar NOT

OFFSET -returneaza word-ul inferior al unei expresii (offset-ul)

OR -este operatorul binar OR (sau) Exemplu: x OR y

PTR -creaza un pointer (o variabila care contine adresa expresiei)

Exemplu: Expresia1 PTR Expresia2

QWORD -patru cuvinte (4*word=8 bytes) Tipul expresiei 8

SEG -returneaza segmentul unei adrese adica word-ul superior

SHL -executa un salt de n biti spre stanga in prima expresie,unde

n este valoarea celei de a doua expresii (salt binar stanga)

Exemplu: Expresie1 SHL Expresie2 ( shl ax,2 )

SHR -executa un salt binar spre dreapta in prima expresia,cu valoarea

specificata in cea de a doua expresie Exemplu: ( shr bx,3 )

SI -registru de 16 biti pentru pointer sau indexare

SP -registru de 16 biti pentru pointer sau indexare

SS -registru de 16 biti de segment

ST -registrul stivei 8087

TBYTE -10 bytes(80 biti) Tipul expresiei 10

TYPE -returneaza tipul expresiei (dimensiunea in bytes)

WORD -un cuvant=2 bytes=16 biti Tipul expresiei 2

XOR -este operatorul binar XOR (sau exclusiv)
Cuvintele cheie din lista de mai sus nu pot sa apara in expresii decat

cu semnificatia din tabel.Orice alt tip de utilizare va determina erori.


-20-

Principalul avantaj oferit de limbajul assembler este dat de posibi-

litatea de a construi functii si proceduri noi,pe care programul Pascal

sa le poata apela fie direct,fie din unitati sau din biblioteci DLL.

Functiile si procedurile se editeaza si apeleaza la fel ca cele din Pascal

dar se adauga cuvantul cheie assembler dupa declaratia procedurii:

EXEMPLU: program assmb2;

uses WinCRT;

var x,y:integer;

function Scadere(y:word):word;assembler;

asm

mov ax,y

dec ax

end;

begin

y:=77;

writeln('Numarul initial este: ',y);

y:=Scadere(y);

writeln('Numarul rezultat este: ',y);

for x:=1 to 33 do

y:=Scadere(y);

writeln('Numarul final este: ',y);

end.

In exercitiul de mai sus am declarat si definit o functie decrementala,

care scade o unitate la fiecare apel.Binenteles ca puteam include bucla

de repetitie in definitia functiei,caz in care executia ar fi fost mult

mai rapida,dar exemplul prezinta modul de apel al functiei din Pascal.

In mod similar putem executa un salt binar:

EXEMPLU: program assmb3;

uses WinCRT;

var y:integer;

function Saltexp(y:word):word;assembler;

asm

mov ax,y

shl ax,5

end;

Yüklə 1,03 Mb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin