Смекни!
smekni.com

Мова програмування Assembler (стр. 20 из 21)

1 0 червоний бузковий

1 1 коричневий білий

Для вибору кольору палітри і фону використовується INT 10H. Таким чином, якщо, наприклад, обраний фон жовтого кольору і палітра 0, то можливі наступні кольори крапки: жовтий, зелений, червоний і коричневий. Байт, що містить значення 10101010, відповідає червоним крапкам. Якщо вибрати колір фону - синій і палітру 1, то можливі кольори: синій, блакитний, бузковий і білий. Байт, що містить значення 00011011, відображає синю, блакитну, бузкову і білу крапки. Переривання BIOS INT 10H для графіка Функція AH=00 команди INT 10H встановлює графічний режим. Функція AH=11 команди INT 10H дозволяє вибрати колір палітри і вивести на екран графічний символ. Код у регіст- рі AH визначає функцію: AH=00: Установка режиму. Нульове значення в регістрі AH і 04 у pегістрі AL установлюють стандартний кольоровий графічний режим:

MOV AH,00 ;Функція установки режиму

MOV AL,04 ;Дозвіл 320х200

INT 10H

Установка графічного режиму приводить до зникнення курсору з екрана. Подробиці по установці режиму приведені у главі 9.

AH=0BH: Установка колірної палітри. Число в регістрі BH визначає призначення регістра BL: BH=00 вибирає колір фону і бордюру відповідно до змісту pегістра BL. Колір фону від 1 до 16 відповідає тичина значенням oт 0 до F;

BH=01 вибирає палітру відповідно вмісту регістра BL (0 чи 1):

MOV AH,0BH ;Функція установки кольору

MOV BH,01 ;Вибір палітри

MOV BL,00 ; 0 (зелений, червоний, корич.)

INT 10H ;Викликати BIOS

Палітра, встановлена один раз, зберігається, поки не буде скасована іншою командою. При зміні палітри весь екран змінює колірну комбінацію. При використанні функції AH=0BH у текстовому режимі, значення, установлене для кольору 0 у палітрі, визначає колір бордюру.

AH=0CH: Виведення крапки на екран. Використання коду 0C у регістрі AH дозволяє вивести на екран крапку в обраному кольорі (фон і палітра). Наприклад, для дозволу 320х200 завантажимо в регістр DX вертикальну координату (від 0 до 199), а в регістр CX - горизонтальну координату (від 0 до 319). У регістр AL помістимо колір крапки (від 0 до 3):

MOV AH,0CH ;Функція висновку крапки

MOV AL,колір ;Колір крапки

MOV CX,стовпець ;Горизонтальна координата

MOV DX,рядок ;Вертикалькая координата

INT 10H ;Викликати BIOS

AH=0DH: Читання крапки з екрана. Дана функція дозволяє прочитати крапку для визначення її кольору. У регістр DX повинна бути завантажена вертикальна координата (від 0 до 199), а в регістр CX - горизонтальна (від 0 до 319). У регістрі AH повинне бути значення 0D. Функція повертає колір крапки в регістрі AL.

Лекція 11

1. Поняття "середовища години виконання програми" та "системні змінні"

2. PSP та отримання доступу до командної стрічки

3. Доступ до системних змінних з програми

1. Поняття "середовища години виконання програми" та "системні змінні"

Середовищем години виконання називається адресний проміжок, у який завантажується сама програма, адресний проміжок, який виділяється їй для динамічних змінних, а також набір та значення системних змінних.

Системною змінною називається такий спеціальний іменований параметр, який існує в операційній системі протягом її роботи, і який задає певне значення, критичне для її роботи, або роботи якоїсь програми.

2. PSP та отримання доступу до командної стрічки

Префікс програмного сегмента (PSP) займає 256 (тичина 100) байт і завжди передує в пам'яті кожної COM- чи EXE-програмі, що повинна бути виконана. PSP містить наступні поля:

00 Команда INT 20H (тичина.CD20).

02 Загальний розмір доступної пам'яті у форматі хххх0. Наприклад, 512K вказується як 8000 замість 80000.

04 Зарезервовано.

05 Довгий виклик диспетчера функцій DOS.

OA Адреса підпрограми завершення.

OE Адреса підпрограми реакції на Ctrl/Break.

12 Адреса підпрограми реакції на фатальну помилку.

16 Зарезервовано.

2C Сегментна адреса середовища для збереження ASCIIZ рядків.

50 Виклик функцій DOS (INT 21H і RETF).

5C Параметрична область 1, форматована як стандартний невідкритий блок керування файлів (FCB№1).

6C Параметрична область 2, форматована як стандартний невідкритий блок керування файлім (FCB№2); перекривається, якщо блок FCB№1 відкритий.

80-FF Буфер передачі даних (DTA).

Буфер передачі даних DTA

Дана частина PSP починається за адресою тичина.80 і являє собою буферну область уведення-висновку для поточного дисковода. Вона містить у першому байті число, що вказує скільки разів були натиснуті клавіші на клавіатурі безпосередньо після введення імені програми. Починаючи з другого байта, знаходяться введені символи (якщо такі існують). Далі випливає всіляке "сміття", що залишилося в пам'яті після роботи попередньої програми. Наступні приклади демонструють призначення буфера DTA:

Приклад 1. Команда без операндів. Припустимо, що ви визвали програму CALCIT.EXE для виконання за допомогою команди CALCIT [return]. Після того, як DOS побудує PSP для цієї програми, він установить у буфері за адресою тичина.80 значення тичина.000D. Перший байт містить число символів, уведених із клавіатури після імені CALCIT, крім символу "повернення каретки". Оскільки крім клавіші Return не було натиснуто ні однієї, то число символів дорівнює нулю. Другий байт містить символ повернення каретки, тичина.0D. Таким чином, по адресах тичина.80 і 81 на ходятся 000D.

Приклад 2. Команда з текстовим операндом. Припустимо, що після команди був зазначений текст (але не ім'я файлу), наприклад, COLOR BY, що позначає виклик програми COLOR і передачу цій програмі параметра "BY" для установки блакитного кольору на жовтому фоні. У цьому випадку, починаючи з адреси тичина.80, DOS установить наступні значення байтів:

80:03 20 42 59 0D

Ці байти позначають довжину 3, пробіл, "BY" і повернення каретки.

Приклад 3. Команда з ім'ям файлу в операнде. Програми типу DEL (видалення файлу) припускають після імені програми введення імені файлу як параметр. Якщо буде введено, наприклад, DEL B:CALCIT.OBJ [return], то PSP, починаючи з адрес тичина.5C і тичина.80, буде містити:

5C: 02 43 41 4C 43 49 54 20 20 4F 42 4A

C A L C I TO B J

80: 0D 20 42 3A 43 41 4C 43 49 54 2E 4F 42 4A 0DB : CALCIT . 0 BJ

Починаючи з адреси 5C, знаходиться невідкритий блок FCB, що містить ім'я файлу, що був зазначений у параметрі, CALCIT.OBJ, але не ім'я виконуваної програми. Перший символ вказує номер дисковода (02=B у даному випадку). Слідом за CALCIT знаходяться два пробіли, що доповнюють ім'я файлу до восьми символів, і тип файлу, OBJ. Якщо ввести два параметри, наприклад:

prognameA:FILEA,B:FILEB

тоді DOS побудує FCB для FILEA по зсуві тичина 5C і FCB для FILEB по зсуві тичина.6C. Починаючи з адреси 80 у цьому випадку міститься число введених символів (довжина параметрів) - 16, пробіл (тичина.20) A:FILEA,B:FILEB і символ повернення каретки (OD).

Оскільки PSP безпосередньо передує вашій програмі, то можливий доступ до області PSP для обробки зазначених чи файлів або для виконання визначених дій. Для локалізації буфера DTA COM-програма може просто помістити тичину.80 у регістр SI і одержати доступ у такий спосіб:

MOVSI,80H;Адреса DTA

CMP BYTE PTR [SI],0;У буфері нуль?

JE EXIT

Для EXE-програми не можна з упевненістю затверджувати, що кодовий сегмент безпосередньо розташовується після PSP. Однак, тут при ініціалізації регістри DS і ES містять адреса PSP, так що можна зберегти вміст регістра ES після завантаження регістра DS:

MOV AX,DSEG

MOV DS,AX

MOV SAVEPSP,ES

Пізніше можна використовувати збережена адреса для доступу до буфера PSP:

MOV SI,SAVEPSP

CMP BYTE PTR [SI+ 80H],0;У буфері нуль?

JE EXIT

DOS версії 3.0 і страше містить команду INT 62H, завантажую щую в регістр BX адреса поточного PSP, якому можна использо вать для доступу до даних у PSP.

3. Доступ до системних змінних з програми

Спеціалізованої функції для доступу до змінних середовища не існує. Однак, аналізуючи слово в PSP під адресою 2c (вказівник на сегмент з копією стану середовища), можна вийти на масив системних змінних, і таким чином дістати потрібну змінну.

Кожна з системних змінних зберігається у вигляді стрічки, що закінчується нулем, саме так, як їх було визначено в config.sys чи autoexec.bat. Використовуючи мнемоніку асемблера, можемо написати так:

db ‘PATH=C:\Windows’,0

db ‘PROMPT=$p$g’,0

Використовуючи вже відомі команди для роботи з ланцюжками, можна легко виділити імена та значення системних змінних, і використати їх у роботі.

Лекція 12

Системні змінні BIOS та робота з ними за допомогою прямих посилань

Відеопрограма BIOS керує роботою двох дисплейних адаптерів, що можуть бути встановлені в IBM PC. Ми залишили її для розгляду в останню чергу, тому що вона найбільша і складна з усіх програм, що входять у базову систему введення висновку.

Поля дані відеопрограми

Секція поля даних BIOS, має заголовок VIDEO DISPLAY DATA AREA і починається із зсуву 49H, містить змінну, яка використовується відеопрограмою. Усі ці осередки даних містять значення, які використовуються для роботи з дисплейним адаптером у даний момент часу. Багато хто з цих значень копіюють дані, що знаходяться в регістрах дисплейних адаптерів, з яких заборонене читання. Відеопрограма BIOS повинна знати поточне значення таких змінних, як CRT_MODE_SET і CRT_PALETTE при модифікаці регістра. На відміну від порту висновку на системній платі (порт 61H), BIOS не може прочитати ці регістри перед їхньою зміною. Це означає, що BIOS повинен підтримувати в пам'яті образ регістра.

Усі поля даних мають змістовні коментарі, що пояснюють призначення даних під час вашої роботи з текстом BIOS. Окремого коментаря заслуговує поле CURSOR_POSN. Оскільки кольоровий графічний адаптер може підтримувати більше однієї сторінки зображення в текстовому режимі, тому на кожній сторінці існує своє місце для курсору. Контролер CRT 6845 обслуговує тільки курсор поточної сторінки. Коли BIOS переключається зі сторінки на сторінку, контролер запам'ятовує положення курсора на відповідній сторінці. Оскільки кольорова плата може містити максимум вісім сторінок у 40-символьному режимі, тому існує вісім осередків для збереження поточного положення курсору на кожній сторінці.

Функції відеопрограми

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