NUMELE FLAGULUI nr bit FUNCTIE
OF overflow Flag 11 -indica overflow daca este 1
DF direction Flag 10 -indica directia de citire a sirurilor
IF interrupt Flag 9 -daca este 1 intreruperile sunt permise
TF trap Flag 8 -daca este 1 CPU poate lucra pas cu pas
SF sign Flag 7 -daca este 1 semnul nr. este negativ
ZF zero Flag 6 -daca este 1 rezultatul calculului = 0
AF auxiliary Flag 4 -este un carry Flag secundar
PF parity Flag 2 -indica paritatea (par/impar)
CF carry Flag 0 -contine bitul cel mai din stanga dupa
efectuarea unui calcul(left most bit)
EXEMPLU: daca registrul FLAGS contine valoarea 00000000 01000000 inseamna
ca numarul calculat (din registrii generali) este negativ (deoarce bitul 7
din FLAGS este SETAT)
Pe langa registrii,procesorul contine si stiva interna (STACK),care
este echivalenta cu o serie de procesoare de 16 biti inseriate,astfel
incat sa formeze o memorie interna minimala,care permite o serie intreaga
de operatii interne,fara a mai apela memoria fizica.
Stiva functioneaza dupa principiul LIFO (LAST IN FIRST OUT),adica
ultimele date intrate sunt eliberate primele:
EXEMPLU: 1234 va fi arhivat ca 34 12 h (h=hexazecimal)
(word) (byte)(byte)
Daca se citeste intregul cuvant,la dezarhivare se va obtine 1234 ,dar
daca se citeste doar un singur byte (8 biti),la dezarhivare se va obtine
doar ultimul byte introdus,adica 34.Notatia h sau H se utilizeaza pentru
a specifica faptul ca datele au fost scrise in sistem hexazecimal (pentru
datele decimale se poate utiliza "d",pentru cele octale "o" etc. )
-7-
Ca rezultat al capacitatii sporite de combinare a codurilor binare,
procesoarele de tip 256 si 8086 au permis o extrem de mare varietate de
formate numerice,care au generat un numar foarte mare de sisteme de ope-
rare.Datele nu erau compatibile intre aceste sisteme (Exemplu: un program
cu date in format de 12 biti nu putea fi citit de un program cu date
formatate pe 8 sau 10 biti).Programatorii isi alegeau formatul in functie
de volumul de date,sau in functie de tabieturile personale.Aceasta dez-
organizare a dus la o completa degringolada: fiecare utilizator trebuia
sa-si instaleze propriul sistem de operare inainte de a utiliza un program
iar datele nu se puteau transfera de la un program la altul decat cu aju-
torul unor programe speciale de conversie.Dar munca pentru a realiza un
program de conversie era de obicei mai mare decat valoarea datelor tran-
sferate.
Dupa aproape un deceniu de interminabile discutii in contradictoriu,
specialistii au ajuns la un acord si au adoptat un standard international
de formatare a datelor de interes comun.Astfel s-au adoptat standardele
ANSI-DOS,ASCI si apoi ASCII prin care caracterele se reprezinta pe cate
un byte(=un octet=8biti).Formatul de 16 biti,a fost denumit word (cuvant)
si este reprezentat prin 2 bytes succesivi.Deci,procesorul 8086 putea
procesa 2 bytes sau un word per operatie iar registrii sai puteau prelucra
tot 2 bytes sau 1 word (pentru registrii se utilizeaza si pluralul feminin
"registre" dar am preferat termenul de registrii pentru a nu se confunda
cu celelalte feluri de registre din limbajul comun).
Toate dezvoltarile ulterioare ale procesoarelor,si implicit ale pro-
gramelor si aplicatiilor software au tinut cont de aceasta conventie si
au proiectat noile produse cu un multiplu de 8 pentru liniile de adresa
de procesor.Practic,au dublat capsula preexistenta si au format conexiu-
nile astfel incat noul procesor sa dubleze formatul precedent.Asa au fost
concepute procesoarele "pe 32 de biti de adresa",apoi "pe 64 de biti de
adresa" si apoi "pe 128 de biti de adresa".
Fiecare dezvoltare a dus la extinderea formatului maxim,a permis
formularea de noi instructiuni,din ce in ce mai performante si a permis
adaugarea de noi registrii.La procesoarele moderne,o parte dintre re-
gistrii noi adaugati sunt accesibili pentru utilizatori iar o alta parte
sunt rezervati doar pentru personalul acreditat de firma producatoare.
In paralel cu procesorul 8086,sa dezvoltat si perfectionat si un
procesor ajutator,denumit coprocesor matematic,sau procesor 8087.Acest
procesor era format din 8 registri de 80 de biti ordonati sub forma de
stiva si era utilizat pentru calculele in virgula mobila.Acest procesor
permitea un dublu format de 40 de biti in care incapea cate un numar in
format de 32 de biti si un operator in format de 8 biti.Procesorul 8087
a stat la baza tuturor calculelor cu numere foarte mari,sau cu un numar
foarte mare de zecimale.O data cu aparitia procesoarelor si a memoriilor
RAM de 128 de biti,acest procesor a devenit desuet,dar este inca in uz
in majoritatea calculatoarelor din generatiile anterioare.
Toate procesoarele dezvoltate prin extinderea procesorului 8086 sunt
compatibile cu setul initial de instructiuni 8086.Fiecare nou procesor
(80186,80286,80386,80486,Pentium,PentiumII,PentiumIII,PentiumIV) moste-
neste setul de instructiuni de la generatia anterioara si adauga un set
nou de instructiuni incompatibile cu generatia precedenta.
Exista si procesoare incompatibile cu setul de instructiuni 80x86 !
-8-
Pentru a utiliza la maximum procesoarele din noile generatii,s-au
realizat formate ale datelor corespunzatoare cu posibilitatile hardware.
Astfel,formatul de 32 de biti a fost denumit dword(double word adica un
cuvant dublu),formatul de 64 de biti a fost denumit qword(quatro word,
adica patru cuvinte) iar cel pe 128 de biti a fost denumit dqword (double
quatro word adica opt cuvinte).Pentru procesorul 8087 s-au realizat doua
formate pe 80 de biti denumite tbyte si tword.Exista si doua formate
intermediare,pe 48 de biti,denumite fword si pword.
Pentru a putea lucra cu date de tip byte(8 biti),cei patru registri
generali (AX,BX,CX si DX) au fost subimpartiti in cate doi registri de
1 byte(8 biti).Pentru byte-ul cel mai semnificativ,numele se formeaza prin
adaugarea literei H (de la high) pentru a forma denumirile AH,BH,CH si DH
iar pentru byte-ul mai putin semnificativ se utilizeaza litera L pentru a
forma denumirile AL,BL,CL,DL.Astfel,cei patru registri generali pot fi
apelati atat la nivel de byte cat si la nivel de word,respectiv pot
efectua operatii atat in format de 8 biti cat si in format de 16 biti.
In mod curent,registrii A(acumulator) si D(date) sunt utilizati pentru
a stoca si prelucra date temporare,registrul C(counter) este utilizat
pentru a salva numarul ciclului in operatiile repetitive,iar registrul B
(base) este utilizat ca baza spre a alta adresa de date.
Pentru a lucra cu memoria fizica,procesorul 8086 imparte memoria in
segmente de cate 64 K.Astfel,o adresa este formata din adresa segmentului
si adresa de offset din interiorul segmentului.
EXEMPLU : 4576:0100 primul numar (4576) este adresa segmentului,iar
cel de al doilea (0100) este adresa de offset din interiorul segmentului
4576.
Pentru a opera cu adresele de segment,8086 utilizeaza registrii de
segment (CS,DS,SS si ES).Pentru a putea efectua operatii in si asupra
memoriei,se utilizeaza cei doi registrii pointer (SP si BP).Registrul
BP pointeaza baza stivei iar registrul SP pointeaza o adresa din inte-
riorul stivei.
Cei doi registrii de indexare (SI si DI) sunt utilizati pentru indexa-
rea ariilor de date.Registrul Flags,este utilizat pentru setari si a fost
descris anterior.
La procesoarele pe 32 de biti,registrii isi pastreaza denumirea si
semnificatia,dar se adauga sufixul E(de la extended) pentru a forma:EAX,
EBX,ECX,EDX...etc.
In plus,la procesoarele pe 32 de biti se adauga si registrii de control
cr0,cr2,cr3 si cr4 si registrii Debug (dr0,dr1,dr2,dr3,dr6 si dr7).
La procesoarele pe 64 de biti se adauga un set nou de registri denumiti
MMX(mm0,mm1,mm2,mm3,mm4,mm5,mm6,mm7).Practic,acesti registri nu sunt decat
un alias(o redenumire) a registrilor de stiva din procesorul x87 FPU,
care la tipurile noi de procesoare este incorporat impreuna cu x86.Din
acest motiv,orice operatie asupra coprocesorului matematic afecteaza si
registrii MMX dar spre deosebire de registrii de stiva ai procesorului x87
registrii MMX permit accesul aleator la memorie (random acces =nu se mai
respecta regula LIFO si date datele pot fi introduse si extrase in orice
ordine).Daca utilizati acesti registri,este bine sa va asigurati ca
datele nu vor fi corupte in timpul unor operatii matematice.
Procesoarele pe 128 de biti,adauga un set nou de registri denumiti SEE
(SEE=Streaming SIMD Extensions unde SIMD=Single Input Multiple Data )
-9-
Registrii SSE sunt pe 128 de biti si poarta numele de XMMX(xmm0,xmm1,
xmm2,xmm3,xmm4,xmm5,xmm6,xmm7).
Registrele procesorului numeric sunt pe 80 de biti,si apoi pe 128 de
biti la procesoarele SSE.
Pentru efectuarea de operatii cu si asupra datelor stacate in re-
gistrii de procesor,fiecare tip de procesor recunoaste un set de instruc-
tiuni care apeleaza direct conexiunile fizice implementate la nivel de
hardware.Pentru procesorul 8086,setul de instructiuni permise este:
AAA,AAD.AAM,AAS,ADC,ADD,AND,CALL,CBW,CLC,CLD,CLI,CMC,CMP,CMPSB,CMPSW,
DAA,DAS,DEC,DIV,ESC,HLT,IDIV,IMUL,IN,INC,INT,INTO,IRET,Jxx(JA,JAE,JB,JBE,
JC,JCXZ,JE,JG,JGE,JL,JLE,JNA,JNAE,JNB,JNBE,JNC,JNE,JNG,JNGE,JNL,JNLE,
JNO,JNP,JNS,JNZ,JO,JP,JPE,JPO,JS,JZ),LAHF,LSD,LEA,LES,LOCK,LODSB,LODSW,
LOOP/LOOPx,MOV,MOVSB,MUL,NEG,NOP,NOT,OR,OUT,POP,POPF,PUSH,PUSHF,RCL,RCR,
REPxx,RET,RETN,RETF,ROL,ROR,SAHF,SAL,SAR,SBB,SCASB,SCASW,SHL,SHR,STC,STD
STI,STOSB,STOSW,SUB,TEST,WAIT,XCHG,XLAT,XOR
Procesorul 80186 si 80188 au adaugat si urmatoarele instructiuni:
BOUND,ENTER,INSB,INSW,LEAVE,OUTSB,POPA,PUSHA,PUSHW
Procesoarele 80286 au adaugat urmatorul set de instructiuni:
ARLP,CLTS,LAR,LGDT,LIDT,LLDT,LMSW,LOADALL,LSL,LTR,SGDT,SIDT,SLDT,SMSW,STR,
VERR,VERW
Procesoarele 80386 au adaugat urmatorul set de instructiuni:
BSF,BSR,BT,BTC,BTR,BTS,CDQ,CMPSD,CWDE,INSD,IRETD,IRETDF,IRETF,JECXZ,LFS,
LGS,LSS,LODSD,LOOPD,LOOPED,LOOPNED,LOOPNZD,MOVSD,MOVSX,MOVZX,OUTSD,POPAD,
POPFD,PUSHAD,PUSHD,PUSHFD,SCASD,SETA,SETAE,SETB,SETBE,SETC,SETE,SETG,
SETGE,SETL,SETLE,SETNA,SETNB,SETNBE,SETNC,SETNE,SETNG,SETNGE,SETNL,SETNLE,
SETNO,SETNP,SETNS,SETNZ,SETO,SETP,SETPE,SETPO,SETS,SETZ,SHLD,SHRD,STOSD
Procesoarele 80486 au adaugat urmatoarele instructiuni:
BSWAP,CMPXCHG,CPUID,INVD,INVLPG,RSM,WBINVD,XADD
Procesoarele Pentium au adaugat instructiunile:
CMPXCHG8B,RDMSR,RDPMC*,RDTSC,WRMSR
Procesoarele Pentium Pro au adaugat urmatorul set de instructiuni:
CMOVA,CMOVAE,CMOVB,CMOVE,CMOVG,CMOVGE,CMOVL,CMOVLE,CMOVNA,CMOVNAE,CMOVNB,
CMOVNBE,CMOVNC,CMOVNE,CMOVNG,CMOVNGE,CMOVNL,CMOVNLE,CMOVNO,CMOVNP,CMOVNS,
CMOVNZ,CMOVO,CMOVP,CMOVPE,CMOVPO,CMOVS,CMOVZ,SYSENTER,SYSEXIT
AMD K7 a adaugat (inlocuit) registrii:
SYSCALL (echivalent cu SYSENTER) si SYSRET (echivalent cu SYSEXIT)
Procesoarele Pentium III au adaugat urmatoarele instructiuni:
MASKMOVQ,MOVNTPS,MOVNTQ,PREFETCH0,PREFETCH1,PREFETCH2,PREFETCHNTA,SFENCE
Procesoarele Pentium IV au adaugat urmatorul set de instructiuni:
CLFLUSH,LFENCE,MASKMOVDQU,MFENCE,MOVNTDQ,MOVNTL,MOVNTPD,PAUSE
-10-
Procesoarele Pentium IV 6x2 au adaugat urmatoarele instructiuni:
VMPTRLD,VMPTRST,VMCLEAR,VMREAD,VMWRITE,VMCALL,VMLAUNCH,VMRRESUME,VMXOFF,
VMXON
Procesorul 8087(coprocesorul mat.) recunoaste urmatoarele instructiuni:
F2XMI,FABS,FADD,FADDP,FBLD,FBSTP,FCHS,FCLEX,FCOM,FCOMP,FCOMPP,FDECSTP,
FDISI,FDIV,FDIVP,FDIVR,FDIVRP,FENI,FFREE,FIADD,FICOM,FICOMP,FIDIV,FIDIVR,
FILD,FIMUL,FINCSTP,FINIT,FIST,FISTP,FISUB,FLD,FLD1,FLDCW,FLDENV,FLDENVW,
FLDL2E,FLDL2T,FLDLG2,FLDLN2,FLDPI,FLDZ,FMUL,FMULP,FNCLEX,FNDISI,FNENI,
FNINIT,FNOP,FNSAVE,FNSTCW,FNSTENV,FNSTSW,FPATAN,FPREM,FPTAN,FRNDINT,FRSTOR
FRSTORW,FSAVE,FSAVEW,FSCALE,FSQRT,FST,FSTCW,FSTENV,FSTENVW,FSTP,FSTSW,
FSUB,FSUBP,FSUBR,FSUBRP,FTST,FWAIT,FXAM,FXCH,FXTRACT,FYL2X,FY2XPI
Procesorul 80287 adauga instructiunea: FSETPM
Procesorul 80387 adauga instructiunile:
FCOS,FLDENVD,FNSAVED,FNSTENVD,FPREM1,FRSTORD,FSAVED,FSIN,FSINCOS,FSTENVD,
FUCOM,FUCOMP,FUCOMPP
Procesorul Pentium Pro adauga instructiunile:
FCMOVB,FCMOVBE,FCMOVE,FCMOVNB,FCMOVNE,FCMOVNU,FCMOVU,FCOMI,FCOMIP,FUCOMI,
FUCOMIP,FXRSTOR,FXSAVE
Incepand cu Pentium MMX se adauga si instructiunile MMX:
EMMS,MOVD,MODQ,PACKSSDW,PACKSSWB,PADDB,PADDD,PADDSB,PADDSW,PADDUSB,
PADDUSW,PADDW,PAND,PANDN,PCMPEQB,PCMPEQD,PCMPEQW,PCMPGTB,PCMPGTD,PCMPGTW,
PMADDWD,PMULHW,PMULLW,POR,PSLLD,PSLLQ,PSLLW,PSRAD,PSRAW,PSRLD,PSRLQ,PSUBB,
PSUBD,PSUBSB,PSUBSW,PSUBUSB,PSUBUSW,PSUBW,PUNPCKHBW,PUNPCKHDQ,PUNPCKLBW,
PUNPCKLDQ,PUNPCKLDW,PXOR
Instructiunile SSE sunt:
SSE SIMD Floating Point Instructions:
ADDPS,ADDSS,ANDNPS,ANDPS,CMPPS,CMPPSS,COMISS,CVTPI2PS,CVTPS2PI,CVTSI2SS,
CVTSS2SI,CVTTPS2PI,CVTTSS2SI,DIVPS,DIVSS,LDMXCSR,MAXPS,MAXSS,MINPS,MINSS,
MOVAPS,MOVHLPS,MOVHPS,MOVLHPS,MOVLPS,MOVMSKPS,MOVNTPS,MOVSS,MOVUPS,MULPS,
MULSS,ORPS,RCPPS,RCPSS,RSQRTPS,RSQRTSS,SHUFPS,SQRTPS,SQRTSS,STMXCSR,SUBPS,
SUBSS,UCOMISS,UNPCKHPS,UNPCKLPS,XORPS
SSE SIMD Integer Instructions:
PAVGB,PAVGW,PEXTRW,PINSRW,PMAXUB,PMINSW,PMINUB,PMOVMSKB,PSADBW,PSHUFW
SSE2 SIMD Floating Point Instructions:
ADDPD,ADDSD,ANDNPD,ANDPD,CMPPD,CMPSD*,COMISD,CVTDQ2PD,CVTDQ2PS,CVTPD2DQ,
CVTPD2PI,CVTPD2PS,CVTPI2PD,CVTPS2DQ,CVTPS2PD,CVTSD2SI,CVTSD2SS,CVTSI2SD,
CVTSS2SD,CVTTPD2DQ,CVTTPD2PI,CVTTSD2SI,DIVPD,DIVSD,MAXPD,MAXSD,MINPD,
MINSD,MOVAPD,MOVHPD,MOVLPD,MOVMSKPD,MOVSD*,MOVUPD,MULPD,MULSD,ORPD,SHUFPD,
SQRTPD,SUBPD,SUBSD,UCOMISD,UNPCKHPD,UNPCKLPD,XORPD
SSE2 SIMD Integer Instructions
MOVDQ2Q,MOVDQA,MOVDQU,MOVQ2DO,PADDQ,PMULUDQ,PSHUFHW,PSHUFLW,PSHUFD,
PSLLDQ,PSRLDQ,PUNPCKHQDQ,PUNPCKLQDQ
SSE3 SIMD Floating Point:
ADDSUBBPD,ADDSUBPS(aritmetice),HADDPD,HADDPS,HSUBPD,HSUBPS (grafice)
-11-
SSE3 SIMD Integer Instructions
MOVDDUP,MOVSHDUP,MOVSLDUP (aritmetice) si LDDQU (pentru coduri video)
Incepand cu procesoarele Xenon 5100 si seria Core2 se adauga si setul de
instructiuni SSSE3:
PSIGNW,PSIGND,PSIGNB,PSHUFB,PMULHRSW,PMADDUBSW,PHSUBW,PHSUBSW,PHSUBD,
PHADDW,PHADDSW,PHADDD,PALIGNR,PABSW,PABSD,PABSB
Procesoare din familia 80 x 86 au fost proiectate si produse de catre
un numar foarte mare de firme si companii.Dintre acestea,cele mai cunos-
cute sunt:Intel,AMD,Chips and Technologies,Cyrix,IBM,IDT,National Semi-
conductor,NEC,NexGen,Rise Technology,SGS-Thomson,Sis,Texas Instruments,
Transmeta,UMC,VIA etc.
In functie de procesorul instalat in calculatorul d-voastra,alegeti
setul de instructiuni compatibile cu hard-ul instalat.Reciproc,puteti
edita rutine care sa verifice prezenta unei anumite instructiuni si res-
pectiv sa returneze tipul de procesor instalat.
Termenul de ASSEMBLER se utilizeaza atat pentru limbajul de programare,
cat si pentru programele care realizeaza conversia instructiunilor scrise
in assembler la codul binar compatibil cu procesorul instalat.Un astfel
de program de asamblare este diferit de compilatoarele limbajelor de nivel
inalt prin faptul ca exista o corespondenta directa intre fiecare instruc-
tiune si codul binar generat:
EXEMPLU : mov al,061 h se transforma in: 10110000 01100001
adica instructiunea de a deplasa numarul hexazecimal 61 in registrul AL
se traduce prin numarul hexazecimal 0xb061 adica 10110000 01100001 binar
In mod similar,fiecare instructiune se traduce intr-un cod binar com-
patibil cu procesorul instalat.Tehnica mnemotehnica de formare a numelui
fiecarei instructiuni a simplificat procesul extrem de dificil de mani-
pulare a stivelor binare.
Limbajul complet,include pe langa instructiuni si un set de operatori,
la care se adauga declaratiile si definitiile datelor,etichetele,comen-
tariile si macro-urile (daca exista).
Daca utilizati doar instructiuni din setul 8086,functiile si progra-
mele generate vor putea fi rulate practic pe orice calculator modern.
Daca utilizati instructiuni din ultimele seturi implementate,atunci este
posibil ca programele sa nu poata rula pe o serie intrega de calculatoare
din generatiile anterioare.In plus,exista si procesoare cu alt tip de ar-
hitectura interna,incompatibile cu seria 60x86(consultati prospectul).
Este bine sa cunoasteti toata documentatia procesorului cu care
lucrati,dar sa aveti in vedere si arhitectura procesoarelor pe care se va
implementa programul proiectat.Daca lucrati relativ frecvent in assembler
este bine sa aveti un tabel sinoptic cu toate instructiunile,grupate pe
categorii,astfel incat alegerea lor sa fie cat mai usoara.Este important
de stiut daca accesul la memoria stiva se poate face aleator sau doar
secvential (LIFO),daca adresele de segment se pot utiliza pentru a face
calcule si operatii cu adresele de memorie,daca si ce tip de nivele de
intrerupere sunt acceptate de catre sistemul de operare,etc.
Acest manual va cuprinde doar informatii si exemple elementare.Pentru
orice nelamurire sau problema specifica,consultati literatura de specia-
litate sau articolele referitoare la subiect,editate prin Internet.
-12-
Procesorul 8086 a fost inclus intr-o capsula cu 40 de pini(contacte
electrice).La ora actuala,poarta numele de microprocesor si este inclus
in aceeasi categorie cu procesorul Z80 (cel inclus in aproape toate ti-
purile de tastatura).In prezent,este utilizat mai ales pentru scopuri
didactice (minicircuite de automatizare).Are urmatoarea schema electrica:
__________ __________
| |___| |
GND_| 1 40 |_Vcc
| |
<--> AD14_| 2 39 |_AD15 <-->
| |
<--> AD13_| 3 38 |_AD16/S3 -->
| |
<--> AD12_| 4 37 |_A17/S4 -->
| |
<--> AD11_| 5 36 |_A18/S5 -->
| |
<--> AD10_| 6 35 |_A19/S6 -->
| |
<--> AD9_| 7 34 |_BHE/S7 -->
| |
<--> AD8_| 8 33 |_MN/MX <--
| |
<--> AD7_| 9 32 |_RD -->
| |
<--> AD6_| 10 31 |_RQ/GTO,HOLD <-->
| |
<--> AD5_| 11 30 |_RQ/GT1,HOLD <-->
| |
<--> AD4_| 12 29 |_LOCK,WR -->
| |
<--> AD3_| 13 28 |_S2,M/IO -->
| |
<--> AD2_| 14 27 |_S1,DT/R -->
| |
<--> AD1_| 15 26 |_S0,DEN -->
| |
<--> AD0_| 16 25 |_QSO,ALE -->
| |
--> NMI_| 17 24 |_QS1,INTA -->
| |
--> INTR_| 18 23 |_TEST <--
| |
--> CLK_| 19 22 |_READY <--
| |
--> GND_| 20 21 |_RESET <--
| |
|________________________|
Observati cele 16 linii de adresa I/O (notate cu AD0...AD15).Sagetile de
tip <--> si --> sau <-- indica intrarile si/sau respectiv iesirile.
-13-
Setul original de instructiuni 8086 este urmatorul (in limba engleza):
MNEMONIC ODITSZAPC(flags) DESCRIPTION
AAA ?---??*?* ASCII Adjust for Add in AX
AAD ?---**?*? ASCII Adjust for Divide in AX
AAM ?---**?*? ASCII Adjust for Multiply in AX
AAS ?---??*?* ASCII Adjust for Substract in AX
ADC d,s *---***** Add with Carry
ADD d,s *---***** Add
Dostları ilə paylaş: |