- •Дәрістік сабақ конспектілері Дәріс №1. Деректердің берілуі
- •1 Сурет. Адрестік кеңістікті тарату кестесі
- •3 Сурет. .Com программаларының жадыда орналасуы
- •Дәріс №3. Микропроцессордың пайдаланушы регистрлері
- •Жалпы міндетті регистрлер
- •Сегменттік регистрлер
- •Басқару және күйлер регистрлері
- •Күйлер белгісі
- •Жүйелік белгілер
- •Дәріс №4. Микропроцессордың жүйелік регистрлері
- •Жүйелік адрес регистрлері
- •Жөндеу регистрлері
- •Дәріс №5. Операндтарды адресациялау әдістері
- •Дәріс №7. І80х86 микропроцессор командалар жүйесіне шолу. Арифметикалық командалар Екілік сандарды қосу
- •Екілік сандарды азайту
- •Сандарды көбейту
- •Imul операнд
- •Екілік –ондық сандармен орындалатын арифметикалық операциялар
- •Жинақталған bcd-сандармен орындалатын арифметикалық операциялар Жинақталған bcd-сандарды қосу
- •Жинақталған bcd-сандарды азайту
- •Бүтінсан операцияларын орындау үшін қосымшы командалар
- •Типті ауыстыру командалары
- •Дәріс №8. Екілік разрядтармен жұмыс командалары
- •Көпмодулдік программаларды ұйымдастыру
- •Макродирективалар
- •While және rept директивалары
- •Irp директивасы
- •Irpc директивасы
- •Шартқа байланысты компиляция директивалары
- •Шартқа байланысты компиляция директиваларының жалпы синтаксисі келесі құрамдағы синтаксистік конструкцияда берілген:
- •Дәріс № 14. Wіndows операциялық жүйесінде программалау негіздері
- •Дәріс № 15. Консольды қолданба
Екілік –ондық сандармен орындалатын арифметикалық операциялар
BCD- сандарды қосу, азайту, көбейту және бөлудің бөлек командалары жоқ. Екілік-ондық сандарды қосуды және азайтуды жинақталған және жинақталмаған формада орындауға болады, ал көбейту мен бөлу командаларын жанақталмаған BCD-сандарман орындау керек.
Жинақталмаған BCD-сандарды қосу
Екі бірмәнді жинақталмаған BCD-сандарды қосу үшін микропроцессор командалар жүйесінде қосу операциясын қалпына келтіретін арнайы команда бар
AAA (ASCII Adjust for Addition) — командасы қосу нәтижесін символдық түрде беру үшін қалпына келтіреді. Ол тек AL регистрімен ғана жұмыс істейді, және оның кіші тетрадасын тексереді:
- егер бұл мән 9 кіші болса, онда CF белгісі 0-ге орнатылады да келесі кездесетін командаға ауысу орындалады;
Егер бұл мән 9 үлкен болса, онда келесі әрекеттер жасалады:
- AL кіші тетрада құрамына (регистрдің құрамы емес!) 6 қосылады, оның арқасында ондың мәнің нәтижесі дұрыс түрге қалыптастырылады;
- CF белгісі 1-ге орнатылады, келесі әрекеттер кезінде оны ескеріп отыру үшін разрядтың үлкен бөлігіне тасымал болады.
Екі жинақталмаған BCD-сндарды қосуға мысал келтірейік:
; Жинақталмаған BCD-сандарды қосу
len equ 2 ; сан разрядтылығы
b db 1, 7 ; жанақталмағын 71 саны
c db 4, 5 ; жинақталмағын 54 саны
sum db 3 dup (0)
...
xor bx, bx
mov cx, len
m1:
mov al, b[bx]
adс al, c[bx]
aaa
mov sum[bx], al
Мысалдағы BCD-сандардың енгізу тәртібі қалыпты түрге келтірілген, яғни кіші разряд сандары кіші адреске орналасқан. Бірақ бұл бірнеше келесі себептерге байланысты:
біріншіден, мұндай тәртіп Intel микропроцессорларындағы жалпы деректерді беру принципін қанағаттандырады;
екіншіден, бұл жинақталмаған BCD-сандарды разрядтан өңдеу үшін ыңғайлы, өйткені олардың әрбірі бір байт орын алады.
Жинақталмаған BCD-сандарды азайту
AAS (ASCII Adjust for Substraction) — командасы азайту нәтижесін символдық түрде беру үшін қалпына келтіреді. AAS командасыныңда операндтары болмайды және ол да AL регистрімен ғана жұмыс істейді, және оның кіші тетрадасын тексереді:
- Егер бұл мән 9 кіші болса, онда CF белгісі 0-ге орнатылады да келесі кездесетін командаға ауысу орындалады;
Егер бұл мән 9 үлкен болса, онда AAS командасы келесі әрекеттерді жасайды:
- AL кіші тетрада құрамынан 6 алады;
- AL регистрінің үлкен тетрадасын нөлдейді;
- CF белгісі 1-ге орнатылады, оларқылы үлкен разрядтан болатын несиені қадағалайды.
AAS командасы негізгі SUB және SBB азайту командаларымен біоге қолданылады.
b db 1, 7 ; жинақталмаған 71 саны
c db 4, 5 ; жинақталмаған 54 саны
subs db 2 dup (0)
len equ 2 ; сандар разрядтылығы
…
xor ax, ax ; ax тазалау
xor bx, bx
mov cx, len ; cx санауыш циклын жүктемелеу
m1:
mov al, b[bx]
sbb al, c[bx]
aas
mov subs[bx], al
inc bx
loop m1
jc m2 ; несие белгісінің анализі
Жинақталмаған BCD-сандарды көбейту
Өлшемі анықталмаған сандарды көбейту үшін, көбейту процесін өзіңіз таратуыңыз керек, мысалы “қатар қатармен” алгоритімін пайдалануға болады. Екі бірразрядты BCD-сандарды көбейту үшін, керек:
- көбейткіштердің бірін AL регистріне орналастыру (MUL командасы сұрап тұрғандай);
- ал екінші операндты регистрге немесе жады ұяшығына, алдын –ала қалдырылған орны болады;
- көбейткіштерді MUL командасымен көбейтеміз (нәтиже AX регистрінде болады);
- нәтиже әрине екілік кодта болады, сондықтан оны қалпына келтіреміз.
AAM (ASCII Adjust for Multiplication) — командасы көбейту нәтижесін символдық түрде беру үшін қалпына келтіреді. Бұл команданың операндтары болмайды және ол AХ регистрімен келесі түрде жұмыс істейді:
- AL –ді 10 бөледі;
- нәтижені былай жазады: бөлінді AL, қалдық AH.
Нәтижеде AAM командасы орындалғаннан кейін AL және AH регистрлерінде дұрыс екілік-ондық екі санның көбейтіндісі орналасады.
AAM командасын AL регистрінде берілген жинақталмаған BCD-санды екілік санға ауыстыру үшін қолдануға болады, ол сосын АХ регистріне орналастырылады: санның үлкен нәтижесі AH регистріне, ал кіші нәтижесі — Al регистріне. Бізге белгілі екілік сандар 0...99 диапазонында болуы керек.
Жинақталмаған BCD-сандарды бөлу
Екі жинақталмаған BCD-сандарды бөлу процесі басқаларға қарағанда бірнеше ерекшеліктері бар. Мұнда қалыпқа келтіруді орындау керек, бірақ олар негізгі бөлу операнциясына дейін орындалуы керек. Алдын-ала AX регистріне бөлінгіштің екі жинақталмаған BCD-сандарын алуымыз керек. Ары қарай AAD командасын орындаймыз:
AAD (ASCII Adjust for Division) — командасы бөлу нәтижесін символдық түрде беру үшін қалпына келтіреді. Бұл команданың операндтары болмайды және жинақталмаған екімәнді BCD-санды AХ регистрімен екілік санға ауыстырады. Бұл екілік сан бөлу операциясы кезінде бөлінді ролін атқарады. Ауыстырудан басқа, AAD командасы алынған екілік санды AL регистріне орналастырады. Бөлінгіш, әрине екілік сан болады ол 0...99 диапазонынан алынады.
AAD командасының ауысуды орындау алгоритмі келесі түрде болады:
- берілген BCD-санының үлкен санын AX-та 10 –ға көбейту (AH құрамын);
- AH + AL қосуын орындау, нәтижесін (екілік сан) AL регистріне орналастыру;
- AH регистрінің құрамын нөлдеу.
AAD ; бөлуден бұрын орындалатын қалыпқа келтіру
DIV C
AAD командасын 0...99 диапазонында берілген жинақталмаған BCD-санды екілік санға ауыстыру үшін қолдануға болады.
