Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра САПР
Розрахунково-графічна робота
Виконав:
студент групи КН-24
Прийняв:
Мазур В. В.
Львів – 2007
Варіант № 15
Теоретичне завдання №1
Опис та застосування процедур
Сегмент коду містить виконувані команди програми. Крім того цей сегмент також включає одну або декілька процедур, визначених директивою PROC. Сегмент, що містить тільки одну процедуру має наступний вигляд:
імя-сегмента SEGMENT PARA
імя-процедури PROC FAR Сегмент
. коду
. з
. одній
RET процедурою
імя-процедури ENDP
імя-сегмента ENDS
Ім'я процедури повинне бути обов'язково присутнім, бути унікальним і задовольняти угодам по іменах в асемблері. Директива ENDP визначає кінець процедури і має ім'я, аналогічне імені в директиві PROC. Команда RET завершує виконання програми і в даному випадку повертає управління в DOS.
Операнд FAR інформує систему про те, що дана адреса є точкою входу для виконання, а директива ENDP визначає кінець процедури. Кодовий сегмент, проте, може містити будь-яку кількість процедур які розділяються директивами PROC і ENDP.
CODESG SEGMENT PARA
BEGIN PROC FAR
.
.
CALL B10
CALL C10
RET
BEGIN ENDP
B10 PROC NEAR
.
.
RET
B10 ENDP
C10 PROC NEAR
.
.
RET
C10 ENDP
CODESG ENDS
END BEGIN
- Директиви PROC по мітках B10 і C10 мають операнд NEAR для вказівки того, що ці процедури знаходяться в поточному кодовому сегменті. У багатьох подальших прикладах цей операнд опущений, оскільки за умовчанням асемблер приймає тип NEAR.
- Кожна процедура має унікальне ім'я і містить власну директиву ENDP для вказівки кінця процедури.
- Для передачі управління в процедурі BEGIN є дві команди:
CALL 10 і CALL C10. В результаті першої команди CALL управління передається процедурі B10 і починається її виконання. Досягнувши команди RET, управління повертається на команду безпосередньо наступну за CALL B10. Друга команда CALL діє аналогічно - передає управління в процедуру C10, виконує її команди і повертає управління по команді RET.
- Команда RET завжди виконує повернення в програму. Програма BEGIN викликає процедури B10 і C10, які повертають управління назад в BEGIN. Для виконання самої програми BEGIN операційна система DOS викликає її і в кінці виконання команда RET повертає управління в DOS. Якщо процедура B10 не містить завершуючої команди RET, те виконання команд продовжиться з B10 безпосередньо у процедурі C10. Якщо процедура C10 не містить команди RET, то виконуватимуться команди, що опинилися за процедурою C10 з непередбачуваним результатом.
Використання процедур дає хорошу можливість організувати логічну структуру програми. Крім того, операнди для команди CALL можуть мати значення, що виходять за межу від -128 до +127 байт.
Технічно управління в процедуру типу NEAR може бути передане за допомогою команд переходу або навіть звичайним відрядковим кодуванням. Але в більшості випадків рекомендується використовувати команду CALL для передачі управління в процедуру і команду RET для повернення.
Теоретичне завдання №2
Файлова система ОС (MS DOS, Windows, Unix)
Файлова система MS-DOS
Файл (по-англійськи file – тека, швидкозшивач) – це пойменована область пам'яті на якому-небудь фізичному носієві, призначена для зберігання інформації.
Сукупність засобів MS-DOS, що забезпечують доступ до інформації на зовнішніх носіях, називається системою управління файлами, або файловою системою.
Одне з понять файлової системи MS-DOS – логічний диск. У деякому наближенні можна вважати, що з погляду MS-DOS кожен логічний диск – це окремий магнітний диск. Кожен логічний диск має своє унікальне ім'я.
Як ім'я логічного диска використовуються букви англійського алфавіту від A до Z (включно).
Таким чином, кількість логічних дисків, може бути не більше 26.
Букви A і B – відведені строго під наявних в IBM РС дисководи.
Починаючи з букви C іменуються логічні диски (розділи) жорсткого диска (мал. 1.3).
У випадку, якщо даний IBM РС має тільки один FDD, буква B пропускається (див. мал. 1.4).
Як правило, тільки логічні диски A і C можуть бути системними.
Мал. 1.3. Розділення на логічні диски в системі з двома дисководами.
Мал. 1.4. Розділення на логічні диски в системі з одним дисководом.
Unix
Поняття файлу є одним з найбільш важливих для ОС UNIX. Всі файли, з якими можуть маніпулювати користувачі, розташовуються у файловій системі, що є деревом, проміжні вершини якого відповідають каталогам, і листям, - файлам і порожнім каталогам. Зразкова структура файлової системи ОС UNIX показана на малюнку 2.1. Реально на кожному логічному диску (розділі фізичного дискового пакету) розташовується окрема ієрархія каталогів і файлів. Для отримання загального дерева в динаміці використовується "монтування" окремих ієрархій до фіксованої кореневої файлової системи.
Зауваження: в світі ОС UNIX по історичних причинах термін "файлова система" є переобтяженою, позначаючи одночасно ієрархію каталогів і файлів і частину ядра, яка управляє каталогами і файлами. Мабуть, було б правильніше називати ієрархію каталогів і файлів архівом файлів, а термін "файлова система" використовувати тільки в другому сенсі. Проте, слідуючи традиції ОС UNIX, ми використовуватимемо цей термін в двох сенсах, розрізняючи значення по контексту.
Кожен каталог і файл файлової системи має унікальне повне ім'я (у ОС UNIX це ім'я прийнято називати full pathname - ім'я, задаюче повний шлях, оскільки воно дійсно задає повний шлях від кореня файлової системи через ланцюжок каталогів до відповідного каталога або файлу; ми використовуватимемо термін "повне ім'я", оскільки для pathname відсутній благозвучний російський аналог). Каталог, що є коренем файлової системи (кореневий каталог), в будь-якій файловій системі має зумовлене ім'я "/" (слеш). Повне ім'я файлу, наприклад, /bin/sh означає, що в кореневому каталозі повинне міститися ім'я каталога bin, а в каталозі bin повинне міститися ім'я файлу sh. Коротким або відносним ім'ям файлу (relative pathname) називається ім'я (можливо, складене), задаюче шлях до файлу від поточного робочого каталога (існує команда і відповідний системний виклик, що дозволяють встановити поточний робочий каталог).
У кожному каталозі містяться два спеціальні імена, ім'я ".", що іменує сам цей каталог, і ім'я "..", що іменує "батьківський" каталог даного каталога, тобто каталог, безпосередньо передуючий даному в ієрархії каталогів.
UNIX підтримує численні утиліти, що дозволяють працювати з файловою системою і доступні як команди командного інтерпретатора. Ось деякі з них (найбільш споживані): cp имя1 имя2 - копіювання файлу имя1 у файл имя2
rm імя1 - знищення файлу имя1
mv імя1 імя2 - перейменування файлу имя1 у файл имя2
mkdir ім'я - створення нового каталога ім'я
rmdir ім'я - знищення каталога ім'я
ls ім'я - видача вмісту каталога ім'я
cat ім'я - видача на екран вмісту файлу ім'я
chown ім'я режим - зміна режиму доступу до файлу
Структура файлової системи
Файлова система зазвичай розміщується на дисках або інших пристроях зовнішньої пам'яті, що мають блокову структуру. Окрім блоків, що зберігають каталоги і файли, в зовнішній пам'яті підтримується ще декілька службових областей.
В світі UNIX існує декілька різних видів файлових систем з своєю структурою зовнішньої пам'яті. Найбільш відомі традиційна файлова система UNIX System V (s5) і файлова система сімейства UNIX BSD (ufs). Файлова система s5 складається з чотирьох секцій (малюнок 2.2,a). У файловій системі ufs на логічному диску (розділі реального диска) знаходиться послідовність секцій файлової системи .
Стисло опишемо суть і призначення кожної області диска.
Boot-блок містить програму розкручування, яке служить для первинного запуску ОС UNIX. У файлових системах s5 реально використовується boot-блок тільки кореневої файлової системи. У додаткових файлових системах ця область присутня, але не використовується.
Суперблок - це найбільш відповідальна область файлової системи, що містить інформацію, яка необхідна для роботи з файловою системою в цілому. Суперблок містить список вільних блоків і вільні i-вузли (information nodes - інформаційні вузли). У файлових системах ufs для підвищення стійкості підтримується декілька копій суперблоку. Кожна копія суперблоку має розмір 8196 байт, і лише одна копія суперблоку використовується при монтуванні файлової системи. Проте, якщо при монтуванні встановлюється, що первинна копія суперблоку пошкоджена або не задовольняє критеріям цілісності інформації, використовується резервна копія.
Блок групициліндрів містить число i-вузлів, специфікованих в списку i-вузлів для даної групи циліндрів, і число блоків даних, які пов'язані з цими i-вузлами. Розмір блоку групи циліндрів залежить від розміру файлової системи. Для підвищення ефективності файлова система ufs прагне розміщувати i-вузли і блоки даних в одній і тій же групі циліндрів.
Список i-вузлів (ilist) містить список i-вузлів, відповідних файлам даної файлової системи. Максимальне число файлів, які можуть бути створені у файловій системі, визначається числом доступних i-вузлів. У i-вузлі зберігається інформація, що описує файл: режими доступу до файлу, час створення і останньої модифікації, ідентифікатор користувача і ідентифікатор групи творця файлу, опис блокової структури файлу і т.д.
Блоки даних - в цій частині файлової системи зберігаються реальні дані файлів. У разі файлової системи ufs всі блоки даних одного файлу намагаються розмістити в одній групі циліндрів. Розмір блоку даних визначається приформатуванні файлової системи командою mkfs і може бути встановлений в 512, 1024, 2048, 4096 або 8192 байтів.
Вмонтовувані файлові системи
Файли будь-якої файлової системи стають доступними тільки після "монтування" цієї файлової системи. Файли "не змонтованої" файлової системи не є видимими операційною системою.
Для монтування файлової системи використовується системний виклик mount. Монтування файлової системи означає наступне. У дереві каталогів і файлів, що є до моменту монтування, повинні бути листовий вузол - порожній каталог (у термінології UNIX такий каталог, використовуваний для монтування файлової системи, називається directory mount point - точка монтування). У будь-якій файловій системі є кореневий каталог. Під час виконання системного виклику mount кореневий каталог вмонтовуваної файлової системи поєднується з каталогом - точкою монтування, внаслідок чого утворюється нова ієрархія з повними іменами каталогів і файлів.
Змонтована файлова система згодом може бути від'єднана від загальної ієрархії з використанням системного виклику umount. Для успішного виконання цього системного виклику потрібний, щоб від'єднувана файлова система до цього моменту не знаходилася у використанні (т.е. жоден файл з цієї файлової системи не був відкритий). Коренева файлова система завжди є змонтованою, і до неї не застосуємо системний виклик umount.
Як ми відзначали вище, окрема файлова система зазвичай розташовується на логічному диску, тобто на розділі фізичного диска. Для ініціалізації файлової системи не підтримуються які-небудь спеціальні системні виклики. Нова файлова система утворюється на диску, що відформатував, з використанням утиліти (команди) mkfs. Знов створена файлова система ініціалізувалася в стан, відповідний наявності всього лише одного порожнього кореневого каталога. Команда mkfs виконує ініціалізацію шляхом прямого запису відповідних даних на диск.
Інтерфейс з файловою системою
Ядро ОС UNIX підтримує для роботи з файлами декілька системних викликів. Серед них найбільш важливими є open, creat, read, write, lseek і close.
Важливо відзначити, що хоча усередині підсистеми управління файлами звичайний файл представляється у вигляді набору блоків зовнішньої пам'яті, для користувачів забезпечується представлення файлу у вигляді лінійної послідовності байтів. Таке уявлення дозволяє використовувати абстракцію файлу при роботі в зовнішніми пристроями, при організації межпроцессних взаємодій і т.д.
Файл в системних викликах, що забезпечують реальний доступ до даним, ідентифікується своїм дескриптором (цілим значенням). Дескриптор файлу видається системними викликами open (відкрити файл) і creat (створити файл). Основним параметром операцій відкриття і створення файлу є повне або відносне ім'я файлу. Крім того, при відкритті файлу указується також режим відкриття (тільки читання, тільки запис, запис і читання і т.д.) і характеристика, що визначає можливості доступу до файлу:
open(pathname, oflag [,mode])
Однією з ознак, які можуть брати участь в параметрі oflag, є ознака O_CREAT, наявність якої указує на необхідність створення файлу, якщо при виконанні системного виклику open файл з вказаним ім'ям не існує (параметр mode має сенс тільки за наявності цієї ознаки). Проте по історичних причинах і для забезпечення сумісності з попередніми версіями ОС UNIX окремо підтримується системний виклик creat, що виконує практично ті ж функції.
Відкритий файл може використовуватися для читання і запису послідовностей байтів. Для цього підтримуються два системні виклики:
read(fd, buffer, count) і write(fd, buffer, count)
Тут fd - дескриптор файлу (отриманий при раніше виконаному системному виклику open або creat), buffer - покажчик символьного масиву і count - число байтів, які повинні бути прочитані з файлу або в нього записані. Значення функції read або write - ціле число, яке співпадає із значенням count, якщо операція закінчується успішно, рівно нулю досягши кінця файлу і негативно при виникненні помилок.
У кожному відкритому файлі існує поточна позиція. Відразу після відкриття файл позиціонується на перший байт. Іншими словами, якщо відразу після відкриття файлу виконується системний виклик read (або write), то будуть прочитані (або записані) перші count байтів вмісту файлу (звичайно, вони будуть успішно прочитані тільки в тому випадку, якщо файл реально містить принаймні count байтів). Після виконання системного виклику read (або write) покажчик читання/запису файлу буде встановлений в позицію count+1 і т.д.
Такий, чисто послідовний стиль роботи, виявляється у багатьох випадках достатнім, але часто буває необхідно читати або змінювати файл з довільної позиції (наприклад, як без такої можливості зберігати у файлі прямо індексовані масиви даних?). Для явного позиціонування файлу служить системний виклик
lseek(fd, offset, origin)
Як і раніше, тут fd - дескриптор раніше відкритого файлу. Параметр offset задає значення відносного зсуву покажчика читання/запису, а параметр origin указує, щодо якої позиції повинен застосовуватися зсув. Можливі три значення параметра origin. Значення 0 указує, що значення offset повинне розглядатися як зсув відносний початки файлу. Значення 1 означає, що значення offset є зсувом щодо поточної позиції файлу. Нарешті, значення 2 говорить про те, що задається зсув щодо кінця файлу. Відмітимо, що типом даних параметра offset є long int. Це означає, що, по-перше, можуть задаватися достатньо довгі зсуви і, по-друге, зсуви можуть бути позитивними і негативними.
Наприклад, після виконання системного виклику
lseek(fd, 0, 0)
покажчик читання/запису відповідного файлу буде встановлений на початок (на перший байт) файлу. Системний виклик
lseek(fd, 0, 2)
встановить покажчик на кінець файлу. Нарешті, виконання системного виклику
lseek(fd, 10, 1)
приведе до збільшення поточного значення покажчика на 10.
Природно, системний виклик успішно завершується тільки у тому випадку, коли наново сформоване значення покажчика не виходить за межі існуючих розмірів файлу.
Файлова система Windows XP
При установці Windows XP вам буде запропоновано відформатувати існуючий розділ, на який встановлюється ОС, у файлову систему NTFS. Так що ж це таке?
Файлова система NTFS забезпечує таке поєднання продуктивності, надійності і ефективності, яке неможливо отримати за допомогою FAT. Основними цілями розробки NTFS були забезпечення швидкісного виконання стандартних операцій над файлами, таких як читання, запис, пошук, і надання додаткових можливостей, включаявосстановленіє пошкодженої файлової системи на надзвичайно великих дисках.
Файлова система NTFS є "своєю" файловою системою для Windows NT, а як відоме WINXP, є своєрідним продовженням цієї лінійки ОС. Але якщо ви збираєтеся використовувати на одному комп'ютері декілька операційних систем таких, як Windows 9x і Windows XP, то завантажувальний том не можна форматувати в NTFS, оскільки лінійки Windows 95(98) "розуміють" тільки FAT, і дисків, отформатірованних в NTFS для цих ОС просто не існує. Файли знаходяться на дисках NTFS можна побачити тільки використовуючи програми сторонніх виробників. Якщо ж під час установки ви не відформатували розділ в NTFS, то це можна зробити і після неї.У командному рядку WINDOWSXP необхідно набрати
"Convert (ім'я диска) /FS:NTFS" без лапок.
Нижче приводиться порівняльна таблиця фалових систем FAT і NTFS
Обмеження NTFS FAT і FAT 32
Розміри тому Мінімальний розмір тому складає приблизно 10 Мб. FAT підтримує різні розміри томів - від об'єму дискет і до 4 Гб.
На практиці рекомендується створювати томи, розміри яких не перевищують 2 Тб. FAT 32 підтримує томи об'ємом від 2 гб. до 2 Тб. Працюючи під управлінням Windows XP для Fat 32 можна відформатувати томи, розмір яких не перевищує 32 Гб.
За допомогою NTFS не можна форматувати дискети. Не підтримуються диски розміри яких менше 512 Мб.
Розміри файлів Теорітічеськи розмір файлу може складати 16 екзабайт. FAT підутримує файли розміром не більше 2 Гб. FAT 32 подержіваєт файли розміром не більше 4 Гб.
NTFS володіє характеристиками захищеності, підтримуючи контроль доступу до даним і привілеї власника, що грають виключно важливу роль в забезпеченні цілісності важливих даних. Теки і файли NTFS можуть мати призначені їм права доступу незалежно від того, чи являютя вони що розділяються чи ні.
NTFS - єдина файлова система в Windows, яка дозволяє призначати права доступу до різних файлів. Встановлюючи користувачам певні дозволи для файлів і каталогів, користувач може захищати конфіденційну інформацію від несанкціонованого доступу. Дозволи користувача на доступ до об'єктів файлової системи працюють за принципом доповнення. Це означає, що дозволи, що діють, тобто ті дозволи, які користувач реально має відносно конкретного каталога або файлу, утворюються зі всіх прямих або непрямих дозволів, призначених ползователю для даного об'екта за допомогою логічної функції "Або". Наприклад, якщо користувач має правоназначенноє дозвіл для каталога на читання, а побічно через членство в групах йому дано право на запис, то в результаті користувач зможе читати інформацію у файлах каталога і записувати в них дані.
Для призначення користувачеві або групі дозволу на доступ до определенномук файлу необхідно: 1. Вказати файл мишею і натиснути праву кнопку. Вибрати пункт Properties (Властивості) контексного меню. У вікні властивостей файлу перейти на вкладку Security, що з'явилося (Безпека). За умовчанням даної вкладки там немає, щоб вона з'явилася необхідно у властивостях теки прибрати галочку Simple File Sharing (використовувати простій загальний доступ до файлів).
2. У групі Name (Ім'я) показаний список користувачів і груп, яким вже надані дозволи для цього файлу. Для того, щоб додати або видалити користувачів або нові групи, натиснути кнопку Add/Remove (Добавить/Удалить) З'явиться вікно діалогу Select Users, Groups (Вибрати користувачів, групи).В поле Enter the object names to select (Ввеліте імена вибираних об'єктів) написати ім'я користувача, кнопка Check Names (Перевірити імена) дозволяє перевірити правильність написання імені.
3. У групі Permissions (Дозволи)
встановлюються дозволи. Присутні покажчики Deny (заборонити) і Allow (Вирішити). Встановлюються прапорці для наступних параметрів: Full Control (повний контроль) - користувач дістає неограніченниєй доступ до файлу, Modify (Зміна) - користувач може змінювати файл, Read & execute (Читання і виконання), Read (Читання) - користувач може тільки читати файл, Write (Запис) - користувач може записувати у файл.
Для тоншої настройки дозволів необхідно натиснути кнопку Advanced. З'являється діалогове вікно Advanced Security Settings for (Додаткові параметри безпеки). Тут можна додатково вказати додаткові дозволи, набудувати політику аудиту, змінити (переглянути) інформацію про владельцце файлу і додати / видалити користувачів, що можуть дістати доступ до файлу.
Наступне, дуже корисна властивість файлової системи NTFS - це можливість введення квот. Це властивість, як правило необхідно системним адміністраторам, великих компаній, де працює велика кількість користувачів, у яких немає звички стежити за актуальністю інформації, і які зберігають непотрібні файли, тим самим займаючи дисковий простір. Оскільки адміністратор не може простежити за всім цим, він може ввести квоту на використання диска певному користувачеві. Після установки квот користувач може зберігати на томі обмежений об'єм даних, тоді як на цьому диску може залишатися вільний простір. Якщо користувач перевищить видану йому квоту, до журналу подій буде внесений відповідний запис. Щоб включити квоти на диску потрібно перш за все, щоб він був у форматі NTFS, потім у властивостях теки Tools-Folder Options-View прибрати прапорець Simple File Sharing. Це потрібно для тогощоб у властивостях диска з'явилася вкладка Quota. Вней необхідно встановити прапорець на Enable quota managment (Активізувати управління квотами). Це буде встановлене м'яке квотування, яке видасть попередження, що користувач, якщо так трапиться, перевищив квоту, але право на запис у нього буде. Щоб у разі перевищення квоти користувачеві було відмовлено в доступі до цього тому необхідно встановити прапорець на Deny disk space to users exceeding quota limit (Заборонити запис на диск користувачам, що перевищили розмір дискового простору). На цій же вкладці можна встановити розмір квоти (Limit disk space to), що виділяється, і поріг, перевищення якого викликає запис попередження в журналі подій (Set Warning level to) - Встановити поріг видачі повідомлення. Ці параметри встановлюються за умовчанням для всіх користувачів. У вікні ж Quota Entries можна змінити параметри квоти, що задається для конкретного користувача. Для цього слід виділити обліковий запис, що конфігурується, з помощью контексного меню вибрати властивості і конфігурувати квоту.
І ще одне новвоведеніє NTFS 5 - точки монтування. Користувач може визначити різні, не пов'язані з собою теки і навіть диски в системі як один диск або тека. Це має велику важливість для визначення в одному місці різнорідної інформації, що знаходиться в системі. Файли і теки таким чином створені мають унікальний ідентифікаційний номер, що гарантує їх правильне знаходження в системі, навіть якщо тека або файл був перенесений.
Задача №1
Написати і оформити згідно вимог програму на Асемблері для рисування вказаним кольором прямокутника заданого розміру у певній точці екрану (задані координати лівої верхньої вершини) з використанням циклів.
Ширина 10
Висота 55
Колір 4
X 10
Y 45
Текст програми
title Prog_1
sseg segment stack
db 100h dup(0)
sseg ends
dseg segment 'data'
er db 'Error !!!!!!!!!!$'
s2 db 'sd$'
dseg ends
code segment 'code'
assume ss:sseg,ds:dseg,cs:code
jmp main
main proc far
mov ax,dseg
mov ds,ax
mov ah,0Fh
int 10h
push ax
call vgaint
call rac
mov ah,10h
int 16h
pop ax
mov ah,00h
int 10h
ex: mov ax,4c00h
int 21h
error: mov ah,09h
mov dx,offset er
int 21h
jmp ex
main endp
vgaint proc near
mov ah,00h
mov al,12h
int 10h
mov ah,0bh
mov bx,00001h
int 10h
ret
vgaint endp
rac proc near
mov cx,55
c1: mov ah,0ch
mov bh,0
mov dx,45
mov al,4h
int 10h
mov dx,140
int 10h
inc cx
cmp cx,10
jne c1
mov dx,45
c2: mov ah,0ch
mov bh,0
mov cx,55
mov al,4h
int 10h
mov cx,10
int 10h
inc dx
cmp dx,140
jne c2
ret
rac endp
code ends
end
Задача №2
Написати простий редактор тексту у буфері
sseg segment stack
db 100h dup (0)
sseg ends
dseg segment 'data'
beat db 20,9,8,7,6,5,4,3,2
frequency dw 2280,2031,1809,1709
dw 1521,1353,1207,1139
melody db 1,2,3,4,5,6,7,8,0FFH
dseg ends
code segment 'code'
assume ss:sseg,ds:dseg,cs:code
jmp main
main proc far
push ax
mov ax,dseg
mov ds,ax
port_b equ 61h
command_reg equ 43h
latch2 equ 42h
in al,port_b
or al,00000011b
out port_b,al
mov si,0
mov al,0B6h
out command_reg,al
next_note: lea bx,melody
mov al,[bx][si]
cmp al,0FFh
je no_more
mov bx,offset frequency
dec ax
shl ax,1
mov di,ax
mov dx,[bx][di]
mov al,dl
out latch2,al
mov al,dh
out latch2,al
mov ah,0
int 1Ah
mov bx,offset beat
mov cl,[bx][si]
mov ch,0
mov bx,dx
add bx,cx
still_sound:
int 1Ah
cmp dx,bx
jne still_sound
inc si
jmp next_note
no_more:
in al,port_b
and al,0FCH
out 61h,al
mov ax,4c00h
int 21h
main endp
code ends
end