Перейти к содержанию
СофтФорум - всё о компьютерах и не только

“Архітектура ЕОМ та "Асемблер”


Рекомендуемые сообщения

:( Привет помогите пожалуста с програмкой!!!

И обьясните как? :(

ТЕМА 2. РОБОТА З ЕКРАНОМ ТА КЛАВІАТУРОЮ.

Завдання: Написати програму, що виводить в центр екрана вміст командної строки програми. (см. префікс програмного сегмента - PSP). Добавити в програму обробку стрілок та клавіші esc, так, щоб стрічка символів переміщалась по екрану в залежності від нажатої стрілки (з урахуванням розміру екрана – тобто стрічка не має виходити за розміри екрану). ESC – для виходу з програми.

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

Умовно, лабораторну роботу можна розділити на дві частини. Перша, вивід вмісту командної строки в центр екрана з попередньою очисткою. Друга, обробка натиску клавіш переміщення курсору («стрілок»).

В префіксі програмного сегменту PSP (див. електронний довідник) по зміщенню 80h знаходиться інформація про кількість введених в командній стрічці символів.

Наприклад: При запуску вашої програми

D:\821…\>laba2.com abdc

все, що написано після laba2.com разом з першим після імені програми пробілом потрапляє в префікс програмного сегменту, причому кількість цих символів - по зміщенню 80h від початку PSP, а по зміщенню 81h –вміст командної строки ( abdc). Сам префікс починається по нульовому зміщенню від початку сегмента кодів, тобто адреса сегмента кодів співпадає з адресою PSP.

Насамперед, необхідно визначитися з тим, якою функцією якого переривання виводити строкову інформацію на екран, бо від цього залежить послідовність подальших дій при написанні програми. Для виводу можна користуватися можливостями DOS або BIOS переривань. (Див. int 10h BIOS, int 21h DOS)

Для того щоб взяти данні в ОП по зміщенню Х від початку сегмента, можна користуватися безпосередньою, індексною або базовою адресацією:

mov регістр, [Х]; , де Х – базовий (bx, bp) або індексний регістр (si, di) або численна константа.

Наприклад,

mov ax, [bх], означає, помістити в регістр ах вміст ОП по зміщенню від початку поточного сегмента. Значення зміщення, знаходиться в регістрі bх.

ЗАУВАЖЕННЯ! В реальному режимі роботи МП в якості базового регістра могуть використовуватися тільки bx, bp.

Аналогічно й навпаки:

mov [X], data; де data – може прийняти значення регістра або константи – як численної, так і строкової. Строкова константа має вид: ‘A’, де A – літера або другий символ, В ТОМУ ЧИСЛІ й СИМВОЛ ЦИФРИ!

Як що побудувати аналогію між оперативною пам’яттю (ОП) та матрицею, то можна сказати, що ОП - це одномірний масив біт, в якому адресуються (індексуються) байти. Тобто під індексом матриці розуміється номер байта в ОП (його адреса), а під вмістом матриці по даному індексу (A) – значення в ОП, яке знаходиться за даною адресою.

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

Вміст довідки по PSP в електроннім довіднику:

Коли програма починає виконання, DS:0000 та ES:0000 вказує на початок PSP цієї програми. Інформація в PSP дозволяє виділити імена файлів та опції з строки команд, взнати об’єм доступної пам’яті, визначити оточення та т.д.

Зміщ. Довж. Вміст

▀▀▀ ▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

┌───────┐

+0 2 │INT 20H │ EXE-програми можуть робити сюди JMP або RET для виходу

├───┴───┤

+2 2 │MemTop │ вершина доступної пам’яті системи в параграфах

├───┼───┘

+4 1 │ │ (резервується)

├───┼───────┬───────┐

+5 5 │CALL зміщ. Сегмент │ FAR CALL до диспетчера функцій DOS

└───┼───┴───┼───┴───┘

+6 │ Avail │ доступні байти в програмнім сегменті

┌───┴───┼───┼───┐ (тільки для файлу COM)

+0aH 4 │ зміщ. сегмент │ Адреса завершення. Див. INT 22H

├───┴───┼───┴───┤

+0eH 4 │ зміщ. сегмент │ Адреса обробки Ctrl-Break. Див. INT 23H

├───┴───┼───┴───┤

+12H 4 │ зміщ. сегмент │ Обробник критич. помилок. Див. INT 24H

├───┴───┴───────┴ ─ ─────┐

+16H 16H │ Резервна область DOS │

├───┴───┼───┴───┴ ─ ─┴───┘

+2cH 2 │EnvSeg │ Сегментний адрес оточення DOS

├───┴───┴──────── ─ ─────┐

+2eH 2eH │ Резервна область DOS │

├───┴───┴───┴───┴ ─ ─┴───┤

+5cH 10H │ форматов. обл. парам.1 │ як в FCB для 1-го параметра команди

├───┴───┴───┴───┴ ─ ─┴───┤

+6cH 14H │ форматов. обл. парам.2 │ як в FCB для 2-го параметра команди

├───┼───┴───┴───┴ ─ ─┴───┘

+80H 1 │ len │ довжина області UPA (с адреса 81H)

├───┴──────────── ─ ─────┐ також зміщення DTA, що вмовчується

+81H 7fH │ неформатов. обл. парам. │ символи з командної строки DOS

└───┴───┴───┴───┴ ─ ─┴───┘ (виключаючи директиви перенаправлення)

100H Розмір префікса програмного сегменту

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

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

Для цього можна використовувати функцію 0сh переривання int 21h. Необхідним додатковим параметром якої є номер функції, що має бути викликана після неї.

mov ah, 0ch ; завдання номера функції 21го переривання для очистки

;буфера клавіатури

mov al, 08h ; завдання номера функції 21го переривання,

; яку буде визвано наступною

int 21h ;наказ до виконання (виклик 21го переривання)

Ця (08h переривання int 21h) функція виконує читання символу з клавіатури і містить його в регістр al.

Стрілки на клавіатурі відносяться до «керуючих символів», як і F1…F12. Такі клавіші при вводі в регістр al передають 0h при першому визові функції 08h переривання int 21h, і лише при другому читанні в цім регістрі буде скан-код:

mov ah, 0ch ; завдання номеру функції 21го переривання

mov al, 08h ; завдання номеру функції 21го переривання,

; яку буде визвано наступною

int 21h ;наказ до виконання (виклик 21го переривання)

mov ah,08h ; завдання номеру функції 21го переривання

int 21h

Скан-коди клавіш є в електронному довіднику. Порівнюючи вміст регістра al з потрібним кодом, можна керувати ходом програми:

cmp al, 48h ; порівняння al з 48h

je мітка ; Якщо рівно – перехід на мітку

; інакше виконання наступного оператора.

Розглянемо приклад роботи з даними.

Припустимо, що в області даних програми описано наступне байтове поле:

ім’я поля директива розміру вміст

a db ‘байтове поле’

;Далі йде текст програми…

….

Наступні два оператори роблять, з точки зору програми, однакові дії: в регістр bx мітиться адрес початку байтового поля.

1) mov bx, offset a ;

2) lea bx, a ;

В випадку роботи з байтовим полем як з масивом допускається індексація: a[0], a[1], a[bx], a[si] та т.д., причому індекс 1го елемента – 0!

mov a[6],’і’

mov a[11],’я’

В результаті виконання цих операторів поле а буде містити: «байтові поля».

При роботі з даними без використання імен необхідно застосувати зміщення відносно початку сегменту. Якщо програма пишеться апріорі як *.com, то данні та код містяться всередині одного й того ж сегменту, Якщо ж - *.exe, то код програми міститься в сегменті коду (CS), а данні – в сегменті даних (DS) (див. додаток Б). Для явної вказівки відносно початку якого сегмента береться зміщення, використовують префікс зміни сегмента (ds:):

mov ds:[bx+81h],’$’

В наданому прикладі показано, що в якості базового сегменту береться ds. В квадратних скобках показано засіб використання базової адресації із зміщенням, тобто в результаті виконання цієї команди в область пам’яті по зміщенню bx+81h від початку ds поміщується символ $.

Література.

В якості необхідних для самостійного вивчення розділів пропонується [4]:

РОЗДІЛ 6 Програми в COM-файлах.

РОЗДІЛ 7 Логіка та Організація Програми

РОЗДІЛ 8. Робота з екраном I: Основні можливості.

РОЗДІЛ 22 Програмний завантажувач.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...