Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Створення програми мовою Асемблер для мікропроцесора Intel 8086

КонтрольнаДопомога в написанніДізнатися вартістьмоєї роботи

У зв’язку з тим, що в базовій моделі використовується найпростіший двоступінчастий конвеєр команд (I ступінь — вибірка команди; II ступінь — інші фази (етапи) виконання команди, до яких відносяться: декодування команди (визначення типу), формування адрес операндів, вибірка операндів, виконання операції в АЛП, запис результату), фактично вміст регістра IP, який входить в блок попередньої вибірки… Читати ще >

Створення програми мовою Асемблер для мікропроцесора Intel 8086 (реферат, курсова, диплом, контрольна)

ВВЕДЕННЯ Тема даної роботи «Створення програми мовою Асемблер для мікропроцесора Intel 8086». Тематика може здатися не актуальною, так як цей процесор розроблений більше тридцяти років тому, але архітектурні рішення, прийняті при його створенні все ще широко використовуються в сучасних мікропроцесорах. Поява даного процесора дозволило зробити прорив в комп’ютерній індустрії. Швидкість його роботи в десять разів перевищувала продуктивність попередньої моделі.

Висока продуктивність у порівнянні з іншими, існувавшими на той час процесорами, досягалася за рахунок збільшення об'єму регістрів з 8 до 16 біт. Крім того розмір інформаційних шин був збільшений до 16 розрядів, що дозволило збільшити швидкість передачі інформації в мікропроцесор і з нього в два рази. Розмір його адресної шини також був істотно розширений — до 20 біт, за рахунок чого i8086 міг контролювати 1Мб оперативної пам’яті.

Як прямий нащадок 8080, процесор 8086 успадкував більшу частину безлічі його мікрокоманд. Регістри нового процесора були розроблені таким чином, що вони могли обробляти як 16-ти бітні значення так і 8-ми бітні - також як це робив 8080.

Пам’ять i8086 була доопрацьована спеціальним чином. Весь мегабайт оперативної пам’яті не представлявся єдиним полем, а був розділений на 16 сегментів величиною по 64Кб. Таким чином, пам’ять МП можна було представити як об `єднання разом пам’яті кількох 8080. Процесор i8086 працював з кожним сегментом окремо, не дозволяючи великим інформаційним структурам переходити через границі сегментів.

Технологічні нововведення, реалізовані в i8086 значно випередили свій час.

1. ПОСТАНОВКА ЗАДАЧІ

Реалізувати програму на мові асемблера для МП i8086, згідно із завданням, представленим далі. Програма повинна робити ряд арифметичних і логічних обчислень, і виводити результати на екран.

Завдання складається з трьох підзадач: розрахунок арифметико-логічних виразів, реалізація циклічної структури, і написання процедури виведення результатів роботи на екран.

Завдання 1:

— визначити дані:

— a (1) > 12; a (2) > 6; a (3) > 17; c1 > 23; c2 > 16;

— занести в регістри процесора такі дані:

— AX > a (1) + a (3) — a (2); BX > a (1)/a (2); CX > c1 + c2;

DX > .

Завдання 2. Організувати цикл, послідовно зменшуючи число у регістрі CX на 6. У циклі збільшувати число, яке знаходиться в регістрі BX, на величину в регістрі AX та зменшувати на величину, що знаходиться в регістрі СХ доки значення числа в регістрі СX не буде менше ніж 5.

Завдання 3. Реалізувати процедуру виведення на екран результатів завдання № 1 і № 2.

2. ПРОГРАМНА МОДЕЛЬ МІКРОПРОЦЕСОРА i8086

2.1 Загальне представлення асемблер регістр арифметичний апаратний Регістрова структура процесора включає в себе 14 16-розрядних програмно-доступних регістрів і може бути представлена в наступному вигляді (рис. 2.1):

Рисунок 1. Регістрова структура процесора Програмно-доступні регістри поділяються на наступні:

— регістри загального призначення (GPR — General Purpose Registers), група включає вісім регістрів;

— сегментні регістри (SR — Segment Registers), група включає чотири регістри;

— регістр прапорів (Flags);

— вказівник команд (Instruction Pointer).

2.2 Регістри загального призначення У відношенні функціонального призначення регістрів, що утворюють внутрішню регістрову пам’ять процесорів, існують два протилежні підходи, що реалізуються в архітектурі ЕОМ:

1. повна спеціалізація регістрів, тобто кожен регістр використовується тільки за одним конкретном призначенням;

2. повна універсалізація регістрів, тобто кожен регістр може використовуватися за будь-яким призначенням.

У процесорах фірми Intel використовується проміжний підхід, що поєднує в собі часткову спеціалізацію і часткову універсалізацію регістрів. Це означає, що за замовчуванням будь-кий регістр використовується як спеціалізований для певної мети, і в той же час його можна використовувати і для інших цілей як універсальний регістр.

Використання будь-якого регістра за його прямим призначенням скорочує довжину об'єктного коду програми, так як використання регістра за призначенням, як правило, передбачає його неявну адресацію (адреса регістра не задається, але мається на увазі).

Функціональна спеціалізація РЗП відбивається в їх найменуваннях:

— АХ — accumulator (регістр-акумулятор) — за замовчуванням використовується для завдання одного з операндів команди і для представлення результату;

— СХ — counter (лічильник) — за замовчуванням використовується, по-перше, як лічильник числа повтореннь циклів в команді «організація циклу» (LOOP); подруге, для завдання кількості розрядів для команд здвигів (його молодший байт — CL), по-третє, для завдання числа елементів оброблюваних рядків в командах обробки рядків (MOVS, CMPS і т. д.);

— DX — Data (регістр даних) — за замовчуванням використовується як розширення акумулятора з боку старших розрядів у командах множення і ділення;

— ВХ — Base (базовий регістр) — за замовчуванням використовується як базова компонента ефективної адреси операнда, що знаходится у пам’яті (у термінології фірми Intel під ефективним адресою — Effective Address (ЕА) — розуміється адреса операнда, формований програмою).

Для отримання фізичної адреси комірки пам’яті, в якій знаходиться операнд, здійснюється перетворення ЕА на основі найпростішої моделі сегментованої пам’яті (механізмусегментації);

— SP — Stack Pointer (покажчик стека) — за замовчуванням використовується для адресації вершини стека. Вершина стека вказує на адресу останнього елемента, записаного в стек.

Стек являє собою сегмент пам’яті. Стек зростає в область молодших адрес. Це означає, що при записі (включенні в стек), наприклад, по команде PUSH, спочатку здійснює декремент SP на два, а потім запис в пам’ять за новим значенням SP як адреси. При читанні зі стека, наприклад, по команді POP, спочатку проводиться читання слова за адресою з SP, а потім інкремент вмісту SP на два. Робота зі стеком реалізується на рівні слів, але не байтів;

— ВР — Base Pointer (покажчик бази) — за замовчуванням використовується як базова компонента ефективного адреси операнда в пам’яті за аналогією з ВХ.

Відмінність у використанні вмісту регістрів ВХ і ВР як базових компонент ЕА полягає в тому, що при використанні ВХ мається на увазі звернення до сегменту даних, а при використанні ВР — до сегменту стека (але не через його вершину).

Подібний спосіб роботи зі стеком не через його вершину використовується в програмах на ASSEMBLER для звернення до параметрів процедури, переданим через стек;

— SI — Source Index (індекс джерела) — за замовчуванням використовується для завдання індексної компоненти ЕА, а також для адресації елементів строк в командах обробки рядків;

— DI — Distination Index (індекс приймача) — за замовчуванням використовується аналогічно SI для завдання індексної компоненти ЕА, а також для адресації елементів рядка-приймача в командах обробки рядків.

Групу з восьми РОН прийнято ділити на дві частини:

— група HL (High — Low);

— група PI (Pointer — Index).

Групу HL іноді називають регістрами даних, маючи на увазі її переважне використання для операндів і результатів команд.

Регістри групи HL можуть використовуватися в командах в двухбайтному (повному) та байтному (неповному) варіантах.

Окремі байти цих регістрів використовують ту ж назву, що і повний регістр (A, C, D, B) з додаванням приставки L — молодший, Н — старший, для відповідних байтів регістру.

Група PI або група покажчиків-індексів може використовуватися тільки в двухбайтному варіанті.

Для адресації РЗП, як повних, так і не повних, в машинній команді використовуються три двійкових розряди.

Двійкові адреси повних РЗП наведені на рисунку 2.1 зліва, а їх окремих байт — в дужках.

2.3. Сегментні регістри Сегментні регістри використовуються для апаратної підтримки найпростішої моделі сегментованої пам’яті, прийнятої в процесорі 8086. Їх вміст визначає базові (початкові) адреси відповідних сегментів у фізичній пам’яті.

CS — Code Segment — сегмент коду (машинної програми).SS — Stack Segment — сегмент стека.

DS — Data Segment — сегмент даних.

ES — Extra Segment — додатковий сегмент.

Використання чотирьох сегментних регістрів припускає, що в будь-який момент часу програма може працювати (мати доступ) з чотирма сегментами пам’яті. З урахуванням того, що довжина кожного сегмента становить 216 байт = 64 Кбайт (16-розрядна адреса) фізичний адресний простір, доступний програмі, становить 256 Кбайт.

Шина адреси процесора Intel 8086 є 20-розрядною, що забезпечує ємність адресного простору 220 байт = 1 Мбайт. При формуванні 20-розрядної фізичної адреси, вміст відповідного сегментного регістра зміщується в бік старших розрядів шляхом зсуву на чотири розряди вліво. Таким чином, вміст сегментних регістрів являє собою не саму фізичну початкову адресу сегменту, а його значення, зменшене на 16.

Вміст одного із сегментних регістрів залучається за замовчуванням кожен раз при звертанні процесора до пам’яті для формування фізичної адреси, який і виставляється на шину адреси. Наприклад, на етапі вибірки команди за замовчуванням залучається регістр CS, при зверненні до стеку — регістр SS. При зверненні за операндом або при записі результату — регістр DS.

2.4 Регістр прапорців У регістрі прапорців актуальними є тільки дев’ять бітів, шість з яких представляють собою арифметичні прапори (прапори станів) і три — прапори управління. Решта бітів є незадіяними (позначаються Х). Струтура даного регістра представлена таблиці нижче.

Таблиця 1. Структура регістру флагів

xxxx

OF

DF

IF

TF

SF

ZF

X

AF

X

PF

X

CF

15 12

Арифметичні прапорці формуються в основному арифметичними командами, визначаючи результат арифметичних операцій (точніше, вони є ознаками результату). Крім того, на арифметичні прапори впливають логічні команди і команди зсуву. Прапори управління впливають на процес виконання програми. До арифметичних прапорців відносяться наступні:

— CF — Carry Flag (прапор переносу). У ньому фіксується перенос зі старшого розряду при додаванні і заєм у старший розряд при відніманні. При множенні, значення прапора CF визначає можливість (CF = 0) або неможливість (CF = 1) подання результату (твори) в тому ж форматі, що і співмножники.

За допомогою прапора перенесення фіксується переповнення при додаванні беззнакових чисел;

— PF — Parity Flag — прапор паритету (парності). Він встановлюється за наявності парного числа одиниць в молодшому байті результату, в іншому випадку — скидається. Цей прапор використовується як апаратна підтримка контролю по парності (непарності);

— AF — Аuxiliary Carry Flag (прапор допоміжного переносу). У цьому прапорі фіксується міжтетрадне перенесення при додаванні і міжтетрадний заєм при відніманні. Значення цього прапора використовується командами десяткової і ASCII корекції додавання і віднімання. Цей прапор можна розглядати як апаратну підтримку операцій над десятковими числами;

— ZF — Zero Flag (прапор нуля). Він встановлюється при нульовому результаті операції, в іншому випадку (ненульовий результат) — скидається;

— SF — Sign Flag (прапор знаку). У нього копіюється старший (крайній лівий) біт результату, інтерпретується як знак;

— OF — Overflow Flag (прапор переповнення). Він встановлюється в командах додавання і віднімання у разі, якщо результат операції не поміщається у форматі операндів. При цьому як операнди, так і результат інтерпретуються як знакові цілі числа. У апаратну установку цього прапора покладено принцип фіксації переповнення в порівнянні переносів з двох старших розрядів при додаванні або займів у два старших розряди при відніманні. Якщо один із займів має місце, а інший відсутній, то відбувається переповнювання формату (розрядної сітки). У командах множення прапор OF виконує ту ж функцію, що і прапор CF (їх значення збігаються).

До прапорів управління відносяться:

— TF — Trace (Trap) Flag (прапор трасування (пастки)). При установці прапора TF процесор переводиться в так званий налагоджувальний (покомандний, покроковий) режим роботи. У цьому режимі завершення виконання будь-якої команди супроводжується виходом на переривання спеціального типу (стандартний тип 1 — переривання по налагодженню);

— DF — Direction Flag (прапор напрямку). Його значення використовується командами обробки рядків (ланцюжків) і визначає напрямок обробки: від менших адрес до великих (зліва на право) при DF = 0 або від великих адрес до менших (справа на ліво) при DF = 1;

— IF — Interrupt Flag (прапор переривань). За допомогою цього прапора вирішуються (IF = 1) або забороняються (IF = 0) зовнішні переривання, запити яких надходять на спеціальний вхід INTR (Interrupt Requester). Цей вхід зазвичай пов’язаний з мікросхемою PIC (Programmable Interrupt Controller) — програмований контролер переривань.

2.5 Регістр IP

Вмістом регістра IP є так звана просунута адреса команди. Це означає, що в момент виконання якої-небудь команди регістр IP вказує на адресу наступної команди.

В якості адреси команди фігурує адрес її молодшого байта.

У зв’язку з тим, що в базовій моделі використовується найпростіший двоступінчастий конвеєр команд (I ступінь — вибірка команди; II ступінь — інші фази (етапи) виконання команди, до яких відносяться: декодування команди (визначення типу), формування адрес операндів, вибірка операндів, виконання операції в АЛП, запис результату), фактично вміст регістра IP, який входить в блок попередньої вибірки команд, вказує на черговий байт команди, вибраний з пам’яті і поміщається в спеціальний буфер, який називається чергою команд (IQ — Instruction Queue). Не дивлячись на цей факт, для виконуваної програми IP містить адресу наступної команди. Фактично, на апаратному рівні при необхідності використання IP (наприклад, для його збереження як адреси повернення) здійснюється відповідна корекція його вмісту з урахуванням числа байт, обраних в IQ.

Конвеєр команд служить одним з найважливіших засобів збільшення продуктивності комп’ютера. З його допомогою реалізується паралелізм на рівні машинних команд. Це означає, що в будь-який момент часу в процесорі на стадії одночасного виконання знаходиться декілька послідовних машинних команд (по зростанню адрес). Блоки конвеєра можуть функціонувати паралельно в часі незалежно один від одного. При використанні класичного шестиступінчастого конвеєра команд (по числу фаз виконання команди) та умови, що кожна фаза вимагає однаковий час реалізації, повне завантаження конвеєра команд в принципі забезпечує шестиразове збільшення продуктивності в порівнянні з послідовним (бесконвейерним) процесором.

3. СИСТЕМА КОМАНД Система команд процесора i8086 складається з 98 команд (і більше 3800 їх варіацій): 19 команд передачі даних, 38 команд їх обробки, 24 команди переходу і 17 команд управління процесором. Можливо 7 режимів адресації. Мікропроцесор не містив команди для роботи з числами з дійсними числами. Дана можливість реалізовувалася окремою мікросхемою, так званим математичним співпроцесором, який встановлювався на материнській платі. Співпроцесор зовсім не обов’язково повинен бути розроблений Intel (модель i8087), наприклад, деякі виробники мікросхем, такі як Weitek, випускали більш продуктивні співпроцесори, ніж Intel.

Система команд процесора i8086 включає в себе кілька дуже потужних рядкових інструкцій. Якщо інструкція має префікс REP (повтор), то процесор буде виконувати операції з блоками — переміщення блоку даних, порівняння блоків даних, присвоєння певного значення блоку даних певної величини, і т.д., тобто, одна інструкція 8086 з префіксом REP може виконувати 4−5 інструкцій, виконуваних на деяких інших процесорах. Але слід згадати, що подібні прийоми були реалізовані і в інших процесорах — Zilog Z80 мав інструкції переміщення і пошуку блоків, а Motorola 68 000 може виконувати операції з блоками, використовуючи всього дві команди.

У мікропроцесорі i8086 була використана примітивна форма конвеєрної обробки. Блок інтерфейсу з шиною подавав потік команд до виконавчого пристрою через 6-байтову чергу команд. Таким чином, вибірка та виконання нових команд могли відбуватися одночасно. Це значно збільшувало пропускну здатність процесора і позбавляло необхідності чекати зчитування команди з пам’яті при зайнятому іншими операціями інтерфейсі мікросхеми (в той час швидкість пам’яті значно випереджала швидкість процесора).

4. ПРАКТИЧНА ЧАСТИНА

4.1 Опис роботи програми Програма починається з визначення необхідних даних. Змінні taskn використовуються для представлення зручного для читання виводу на екран.

Змінні msgn використовуються для зручного виведення змінних циклу. Змінні tempax, tempbx, tempcx, tempdx використовуються для збереження значень відповідних регістрів в програмі. Програма містить процедуру printdec, що виводить в десятковому вигляді значення регістра ax зі знаком, оскільки в циклічній частині програми в з’являються негативні числа. Головна програма розділена на ділянки, що відповідають пунктам завдання.

У другій частині програми, де необхідно реалізувати циклічну структуру, порівняння сх. з п`ятьома відбувається в циклі після виведення значень регістрів і відновлення їх значень. Якщо сх становить значення менш п`яти, цикл завершується. Інакше до регістра bx додається значення регістра ax і відіймається значення регістру сх, а регістр cx зменшується на п`ять. Після цих маніпуляцій регістри зберігаються і цикл продовжується. Після завершення циклу організовується затримка результату на екрані за допомогою функції 1 переривання MS-DOS 21h.

Виведення на екран здійснено із застосуванням переривання MS-DOS 21h і функції переривання 9. Ця функція по перериванню виводить блок ASCII-тексту на екран, поки у вихідних даних не зустрінеться символ «$», що позначає в даному випадку кінець рядка.

Виведення символів в функції виведення числа printdec реалізований за допомогою функції 2 переривання MS-DOS 21h. Результат виконання програми наведений на рисунку 2.

Лістинг і блок-схема програми представлена в додатках, А і Б відповідно.

Рисунок 2. Результат виконання програми.

ВИСНОВОК У процесі виконання роботи отримані відомості про програмну модель та систему команд мікропроцесора Intel 8086. Розроблена програма, що містить обчислювальну частину, логічну — реалізація циклу і структурну — процедури конвертації двійкового представлення даних в шістнадцяткове, і виведення на екран результатів. Висновок можливий із застосуванням трьох різних методів: безпосередній запис даних в комірки пам’яті відеоадаптера, з використанням переривань BIOS і переривань ОС MS-DOS. Останній спосіб вважається найпростішим. Даним методом реалізований вивід у створеній програмі. Програма розроблялася в емуляторі Emu8086.

Emu8086 являє собою інтерактивну систему для вивчення мови програмування Асемблер, комп’ютерної архітектури і принципів розробки програмного забезпечення. Програма складається з редактора коду, Асемблера і емулятора мікропроцесора (віртуальний PC). Емулятор управляє програмами подібно реальному мікропроцесору в покроковому режимі. Показує регістри, пам’ять, стек, змінні і прапорці.

ПЕРЕЛІК ВИКОРИСТАНИХ ДЖЕРЕЛ

1. Бойко В. И. и др. Схемотехника электронных систем. Микропроцессоры и микроконтроллеры. — СПб.: БХВ-Петербург, 2004. ;

2. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT и AT. — М.: Финансы и статистика, 1992;

3. Зубков С. В. Assembler для DOS, Windows и UNIX. — М.: ДМК Пресс, 2000;

4. Кулаков В. Программирование на аппаратном уровне. Специальный справочник. — СПб: Питер, 2001;

5. Мячев А. А., Степанов В. Н. Персональные ЭВМ и микроЭВМ. Основы организации: Справочник / Под ред.А. А. Мячева. — М.: Радио и связь, 1991;

6. Фролов А. В., Фролов Г. В. Операционная система MS DOS. — М.: «Диалог-МИФИ», 1992;

7. Юров В. И. Assembler. — СПб: Питер, 2000.

ДОДАТКИ Додаток, А Лістинг програми

.model tiny

.code

org 100h

start:

jmp MAIN

a DW 12,6,17 ;вихідні дані

c1 DW 23

c2 DW 16

task1 DB 'AX = a (1)+a (3)-a (2) = 12+17−6 = $'

task2 DB 13,10,'BX = a (1)/a (2) = 12/6 = $'

task3 DB 13,10,'CX = c1+c2 = 23+16 = $'

task4 DB 13,10,'DX = a (1) ror 4 = $'

msg1 db 13,10,'AX = $'

msg2 db ' BX = $'

msg3 db ' CX = $'

msg4 db ' DX = $'

tempaxdw 0

tempbxdw 0

tempcxdw 0

tempdxdw 0

MAIN:mov ah, 9;функція виведення повідомлення на екран

lea dx, task1;виведене повідомлення

int 21h;виводимо на екран

mov ax, a;a (1)

add ax, a+4;a (1)+a (3)

sub ax, a+2;ax=a (1)+a (3)-a (2)

mov tempax, ax;зберігаємо результат

call printdec ;виводимо результат

mov ah, 9;функція виведення повідомлення на екран

lea dx, task2;виведене повідомлення

int 21h;виводимо на екран

mov ax, a;a (1)

xor dx, dx;очистка старшої частини діленого

div a+2;a (1)/a (2)

mov bx, ax;bx=a (1)/a (2)

mov tempbx, bx;зберігаємо результат

call printdec ;виводимо результат

mov ah, 9;функція виведення повідомлення на екран

lea dx, task3;виведене повідомлення

int 21h;виводимо на екран

mov cx, c1;c1

add cx, c2;cx=c1+c2

mov tempcx, cx;зберігаємо результат

mov ax, cx;помістити результат в ax

call printdec ;виводимо результат

mov ah, 9;функція виведення повідомлення на екран

lea dx, task4;виведене повідомлення

int 21h;виводимо на екран

mov dx, a;a (1)

mov cl, 4;кількість біт що ссуваються

ror dx, cl;циклічно ссунути dx

mov tempdx, dx;зберігаємо результат

mov ax, dx;помістити результат в ax

call printdec ;виводимо результат

lp:mov ah, 9;функція виведення повідомлення на екран

lea dx, msg1;виведене повідомлення

int 21h;виводимо на екран

mov ax, tempax;значення регістра ax

call printdec;виводимо на екран

mov ah, 9;функція виведення повідомлення на екран

lea dx, msg2;виведене повідомлення

int 21h;виводимо на екран

mov ax, tempbx ;значення регістра bx

call printdec ;виводимо на екран

mov ah, 9;функція виведення повідомлення на екран

lea dx, msg3;виведене повідомлення

int 21h;виводимо на екран

mov ax, tempcx;значення регістра cx

call printdec ;виводимо на екран

mov ah, 9;функція виведення повідомлення на екран

lea dx, msg4;виведене повідомлення

int 21h;виводимо на екран

mov ax, tempdx ;значення регістра dx

call printdec ;виводимо на екран

mov ax, tempax;відновити регістри

mov bx, tempbx

mov cx, tempcx

mov dx, tempdx

cmp cx, 5

jl fin;якщо cx < 5, то закінчити цикл

add bx, ax;збільшувати число, яке знаходиться в регістрі BX, на величину в регістрі AX

sub bx, cx;та зменшувати на величину в регістрі СX

sub cx, 5;зменшувати число в регістрі СХ на 5

mov tempax, ax;зберегти регістри

mov tempbx, bx

mov tempcx, cx

mov tempdx, dx

jmp lp;продовжити цикл

fin:mov ah, 1;очікування натискання будь-якої клавіші

int 21h

ret ;вихід з програми

;перетворення числа із ах в десяткову систему числення і вивід на екран

;ax — число

printdec proc

mov si, ax;запам'ятовуємо число

mov bx, 10;основа системи числення

xor cx, cx;в сх буде кількість цифр у десятковому числі

test ax, ax;якщо число позитивне

jns @@m1a;то пропускаємо

neg ax;якщо негативне, то міняємо знак

@@m1a:xor dx, dx;очистити старшу частина діленого

div bx;ділимо число на ступеня 10

push dx;і зберігаємо залишок від ділення (коефіцієнти при ступенях) в стек

inc cx;збільшуємо кількість десяткових цифр числа

test ax, ax;після ділення залишився 0?

jnz @@m1a;якщо ні, продовжуємо

test si, si;число негативне?

jns @@m3a;якщо ні, пропустити

push -3;інакше дописати перед числом мінус

inc cx;збільшити кількість цифр числа

@@m3a:mov ah, 2 ;ф-я виведення символу

@@m2a:pop dx;взяти з стека цифру числа

add dl,'0';перетворюємо цифру в ASCII символ

int 21h;вивести на екран

loop @@m2a;всі цифри

ret;вихід з підпрограми

printdec endp

end start

Додаток Б Блок-схема програми

Показати весь текст
Заповнити форму поточною роботою