РЕЖИМЫ АДРЕСАЦИИ
Под адресацией данных подразумевают способы описания соответствующих адресов хранения операндов, используемых в программе. Различают основные способы описания операндов (и соответствующие формы адресации):
1. Операнды-регистры;
2. Непосредственные операнды;
3. Операнды в памяти.
Режим адресации Формат адреса сегментный регистр
=============== ============= =================
Регистровая регистр Нет
Непосредственная данные Нет
Косвенная регистровая [BX] DS
[BP] SS
[DI] DS
[SI] DS
По базе со смещением метка [BX] DS
метка [BP] SS
Прямая метка [DI] DS
с индексированием метка [SI] DS
По базе метка [BX + SI] DS
с индексированием метка [BX + DI] DS
метка [BP + SI] SS
метка [BP + DI] SS
Строковые команды исходный адрес DS:SI
адрес приемника ES:DI
* Метка […] может быть заменена на [смещение + …].
Следовательно, запись [24 + BX] будет означать
адрес 24+ВХ.
===========================================================
Примечание: Многие строковые команды используют ES:DI как место назначения, а DS:SI как адрес источника.
Эта таблица приводит количество временных тактов, требуемых для вычисления исполнительного адреса на микропроцессоре 8088. Микропроцессор 80*8* производит эти вычисления быстрее, так что эта таблица содержит «самые медленные» данные.
—————————————————————
Способы адресации Такты для 8088 Пример
—————————————————————
Смещение 6 MOV AX,ADDR
Косвенная регистровая 5 MOV AX,[BX]
BX, SI, DI
По базе или с индек- 9 MOV AX,ADDR[BP]
сированием
+ смещение
BX+смещение, BP+смещение
SI+смещение, DI+смещение
По базе или с индексиро-
ванием (без смещения)
BP+DI, BX+SI 7 MOV AX,[BP+DI]
BP+SI, BX+DI 8 MOV AX,[BX+DI]
По базе с индексирова-
нием + смещение
BP+DI+смещение 11 MOV AX,ADDR[BP+DI]
BX+SI+смещение
BP+SI+смещение 12 MOV AX,ADDR[BP+SI]
BX+DI+смещение
—————————————————————
Примечание: Прибавьте 2 такта в случае вычисления исполнительного адреса из другого сегмента.
Каждое обращение к памяти занимает дополнительные 4 такта. Поле обращений в описаниях команд содержит информацию о количестве обращений к памяти для каждой команды.
ИСПОЛЬЗОВАНИЕ ПРЕРЫВАНИЙ
1. Векторы прерываний.
Работа компьютеров семейства IBM PC , собранных на базе микропроцессоров Intel 8086, управляется главным образом с помощью использования прерываний, которые могут генерироваться как аппаратно, так и программно.
Когда возникает прерывание, управление компьютера передается программе обработки прерывания, которая обычно хранится в системной ROM. Обработчик прерывания вызывается путем загрузки его адресов сегмента и смещения в регистры, которые управляют ходом выполнения программы, а именно CS и IP. Сегментные адреса, которые определяют местоположение обработчиков прерываний, называются векторами прерываний. Таблица векторов прерываний находится в самом начале RAM-памяти по адресу 0000:0000Н.
В общем случае прерывания компьютера можно разделить на шесть категорий:
— прерывания микропроцессора или логические прерывания — с 00Н по 04Н;
— аппаратные прерывания — с 08Н по 0FH и 70H по 77H;
— программные прерывания — с 10Н по 1FH и 40Н по 5FH;
— прерывания DOS — c 20Н по 3FH;
— прерывания Бейсика — 80H по F0H;
— прерывания общего назначения — с 60Н по 66Н.
2. Прерывания DOS
Пять прерываний DOS 20Н, 21Н, 25Н, 26Н, 27Н обеспечивают доступ к системным службам. К этим прерываниям можно обратится из программы с помощью команды INT. Для других четырех прерываний 22Н, 23Н, 24Н, 28Н DOS хранит адреса программ, вызываемых самой DOS, но можно заменить их своими программами, изменив значения одного из векторов прерываний. Остальные 22 прерывания, резервируемые системой DOS, не предназначены для использования в программах.
Прерывание 20Н используется для завершения и выхода из программы и передачи управления обратно системе DOS.
Прерывание 21Н — общие службы DOS. Обладает набором функций. Каждая функция имеет уникальный номер, который указывается при обращении к данному прерыванию.
Прерывание 25Н и 26Н служит для чтения и записи диска в абсолютных адресах.
Прерывание 27Н завершает работу программы, не удаляя ее из памяти. Она оставляет определенную часть программы в памяти, и она остается резидентной.
3. Некоторые функции прерывания 21Н.
01Н — ввод символа с эхопечатью
02Н — вывод символа
08Н — ввод с консоли без эхопечати
09Н — вывод строки символов
0АН — буферизированный ввод с клавиатуры
ВЫПОЛНЕНИЕ РАБОТЫ:
1. Введите программу в любом доступном редакторе и запишите на диск.
title Демонстратор некоторых функций int 21 (com)
;———————————————
codesg segment para ‘code’
assume cs:codesg, ds:codesg, ss:codesg, es:codesg
org 100h
begin: jmp start
message db ‘Hello, Tiraspol!’,’$’
start: lea dx, message ; загрузка адреса строки
mov ah, 09h ; функция вывода строки на экран
int 21h
int 20h ; выход в DOS
codesg ends
end begin
2. Оттранслируйте программу и выполните компоновку.
3. Запустите на исполнение.
4. Объясните результат и алгоритм действия программы по исходному тексту.
5. При работе с Turbo Assembler можно заменить описание сегментов специальными директивами.
title Демонстратор некоторых функций int 21 (com)
;———————————————
dosseg ; расположение сегментов в соответствии
; с соглашениями в MS DOS
.model tiny ; описание принятой модели памяти
; в этой модели код программы, данные и
; стек расположены в одном сегменте
.code ; начало сегмента кода
org 100h
begin: jmp start
message db ‘Hello, Tiraspol!’,’$’
start: lea dx, message ; загрузка адреса строки
mov ah, 09h ; функция вывода строки на экран
mov cx,18
int 21h
int 20h ; выход в DOS
end begin
6. Введите следующую программу
title Демонстратор некоторых функций int 21 (com)
;———————————————
codesg segment para ‘code’
assume cs:codesg, ds:codesg, ss:codesg, es:codesg
org 100h
begin:
call start
message db ‘Введите Ваше имя: ‘, ‘$’
string label byte ;Список параметров
symb db 19 ;Максимальная длина
real db ? ;Реальная длина
all db 20 dup (?),’$’; Введенные символы
start proc near
mov ah, 00h ; Функция очистки экрана
mov al, 03h ; Стандартный цветной текст 80х25
int 10h
mov dh, 12 ; Установка позиции курсора
mov dl, 02
mov bh, 00
mov ah, 02h ; Вызов функции установки курсора
int 10h
mov ah, 09h ; Вызов функции вывода
lea dx, message ; Загрузка адреса строки сообщения
int 21h ; Вызов 21 прерывания DOS
lea dx, string ; Загрузка адреса списка параметров
mov ah, 0ah ; Запрос функции ввода
int 21h ; Вызов 21 прерывания DOS
mov dh, 12 ; Установка позиции курсора
mov dl, 40
mov bh, 00
mov ah, 02h ; Вызов функции установки курсора
int 10h
mov bl,real ; Поместить указатель на конец строки
mov bh,00
mov all[bx],07 ; Установка ограничителя
mov all[bx+1],’$’
lea dx, string
mov ah, 09h
int 21h ; Вызов 21 прерывания DOS
mov ax,4ch ; Выход в DOS в 21 прерывании
int 21h
start endp
codesg ends
end begin
7. Оттранслируйте введенную программу и выполните компоновку.
8. Объясните результат и алгоритм действия программы по исходному тексту. В случае затруднений обратитесь к TD.
9. Выполните индивидуальное задание. (Для выполнения индивидуального задания обращайтесь к электронному справочнику help.exe).
ИНДИВИДУАЛЬНЫЕ ЗАДАНИЯ.
1. Напишите программу ввода пароля, и вывода его на экран, внизу экрана. Выполните ее трассировку.
2. Напишите программу, запрашивающую у оператора строку, а затем выводящую ее на экран. Выполните трассировку программы.
3. Напишите программу, запрашивающую у оператора строку, а затем выводящую ее на экран в рамке. Выполните трассировку программы.
4. Напишите программу, запрашивающую у оператора строку, а затем выводящую ее на экран, предварительно изменив заглавные буквы на строчные. Выполните трассировку программы.
5. Напишите программу, запрашивающую у оператора строку, а затем выводящую ее на экран, предварительно изменив строчные буквы на заглавные. Выполните трассировку программы.
6. Напишите программу, запрашивающую у оператора строку, а затем выводящую символы введенной строки на экран в обратном порядке. Выполните трассировку программы.
7. Напишите программу, выводящую строку запроса и ожидающую ответ. В зависимости от ответа ‘Y’ или ‘N’ вывести на экран ту или иную строку.
8. Напишите программу, запрашивающую у оператора строку, а затем выводящую ее на экран, предварительно изменив строчные буквы каждого слова на заглавные. Выполните трассировку программы.
9. Напишите программу, запрашивающую у оператора строку из русских букв, а затем выводящую ее на экран, предварительно изменив строчные буквы на заглавные, а заглавные — на строчные. Выполните трассировку программы.
10. Напишите программу, запрашивающую у оператора строку из русских букв, а затем выводящую ее на экран, предварительно изменив строчные буквы на заглавные. Выполните трассировку программы.
11. Напишите программу, запрашивающую у оператора строку из русских букв, а затем выводящую ее на экран, предварительно изменив заглавные буквы на строчные. Выполните трассировку программы.
12. Напишите программу, запрашивающую у оператора строку. Количество вводимых букв ограничьте. Выполните трассировку программы.
13. Напишите программу, запрашивающую у оператора строку, а затем выводящую на экран каждое слово строки в отдельной строке. Выполните трассировку программы.
ВОПРОСЫ К ЗАЩИТЕ ЛАБОРАТОРНОЙ РАБОТЫ
1. Способы адресации данных, используемые в языке Ассемблер.
2. Что такое прерывание? Вектор прерывания?
3. Какие бывают прерывания?
4. Основные прерывания DOS.
5. Ввод символа с клавиатуры в программу.
6. Вывод символа на экран.
7. Ввод строки с клавиатуры в программу.
8. Вывод строки на экран.
9. Выход из программы в DOS.
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ:
1. Абель П. «Язык Ассемблера для IBM PC и программирования» М.: Высшая школа, 1992 — 447 c.
2. Джордейн Р. «Справочник программиста персональных компьютеров типа IBM PC, XT и AT» М.: Финансы и статистика, 1992. — 544 с.
3. П.Нортон, Р.Уилтон «IBM PC и PS/2. Руководство по программированию» М.: Радио и связь, 1994г. — 336 с.
4. Г.В.Майко «Ассемблер для IBM PC» Одесса, 1996г.
