|
AND d,s *---**?** Logical AND
|
səhifə | 3/10 | tarix | 16.12.2017 | ölçüsü | 1,03 Mb. | | #35021 |
| 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;
Dostları ilə paylaş: |
|
|