- •Конспект лекций по дисциплине «Программные средства аппаратно-программных комплексов»
- •Содержание
- •Архитектура пэвм
- •Пользовательские регистры
- •Организация памяти (реальный режим)
- •Элементы синтаксиса Ассемблера
- •Операторы
- •Директивы сегментации
- •Модели памяти
- •Идентификаторы, создаваемые директивой Model:
- •Этапы создания программы на ассемблере
- •2. Создание объектного модуля (трансляция программы)
- •1 ;Программа преобразования двузначного шестнадцатеричного числа
- •3. Создание загрузочного модуля (компоновка программы)
- •4. Отладка программы
- •Определение простых типов данных:
- •Способы адресации Регистровая адресация
- •Непосредственная адресация
- •Способы адресации памяти
- •Переопределение сегмента
- •Особенности пересылки данных
- •Xch ax, bx ; команда двунаправленного обмена
- •Команды работы с адресами и указателями
- •Команды сдвига
- •Команды линейного сдвига
- •Команды циклического сдвига
- •Команды сдвига двойной точности
- •Примеры работы с битовыми полями
- •Команды преобразования данных
- •Xor ax, ax ; очистка регистра ax
- •Int 21h ;ожидание вода с клавиатуры
- •Команды обработки строк
- •Команды пересылки строк
- •Команды сравнения строк
- •Пример.
- •Сканирование строки
- •Загрузка элемента строки в аккумулятор
- •Перенос элемента из аккумулятора в строку
- •Ввод элемента цепочки из порта в строку
- •Вывод элемента цепочки в порт
- •Пример использования вложенных циклов
- •Массивы
- •Логические команды
- •Xor операнд1,операнд2
- •Логические команды поиска
- •Структуры
- •Описание шаблона структуры:
- •Заполнение шаблона:
- •Работа с полями структуры
- •Пример:
- •Шаблон записи:
- •Xor bl, mask i2 ; обнуление
- •Команды передачи управления
- •Безусловные переходы
- •Межсегментные переходы
- •Второй сегмент
- •Команды условного перехода
- •Команды условного перехода и флаги
- •Процедуры
- •Вызов процедуры
- •Ret [число]
- •Способы вызова процедуры
- •Прямой ближний вызов
- •Прямой дальний вызов
- •Косвенный ближний вызов
- •Косвенный дальний вызов процедуры
- •Организация интерфейса между процедурами, расположенными в разных модулях
- •Передачи параметров в процедуру через регистры
- •Передача параметров в процедуру через общую память
- •Макрокоманды и макроопределения
- •Особенности трансляции при получении объектного модуля
- •Где можно разместить макроопределение?
- •СвязьAssemblerс языками высокого уровня
- •Использование директивыmodelдля организации взаимодействия программ
- •Int 10h; вывод символа
- •Возврат данных в вызывающую программу
- •Пример взаимодействия программ
- •Особенностиcom-программы
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы
- •Запись адреса резидентной программы в область межзадачных связей
- •Iret ;возврат из процедуры
- •Int 27h ; оставляем программу резидентной
- •Вызов резидентной программы через область межзадачных связей
- •Передача параметров в резидентную программу
- •Замена существующего вектора прерывания
- •Динамическое распределение памяти
- •Пример выделения и освобождения блока памяти
- •Int 21h ;блока памяти
- •Дочерние процессы
- •Особенности структуры материнской программы
- •Активизация дочернего процесса
- •Пример материнской программы
- •Программируемый контроллер прерываний
- •Прохождение запроса на прерывание через контроллер
- •Программирование контроллера прерываний
- •Формат приказов icw
- •Формат приказов ocw
- •И fспользование таймера в программах на Assembler
- •Формирование задержки
- •Использование прерываний 8h для управления запуском программ
- •Программирование коммуникационного порта (com)
- •Микросхема uart 8250
- •Инициализация порта
- •Пример программы инициализации порта
- •Регистр статуса линии (порта)
- •Работа порта без использования механизма прерываний
- •Получение данных
- •Передача данных
- •Алгоритм работы программы приема /передачи без прерываний
- •Текст программы
- •РаботаCom– порта в режиме прерываний
- •Регистр разрешения прерываний
- •Регистр идентификации прерывания
- •Вызов обработчика прерывания
- •; Инициализация регистра разрешения прерывания (прием/передача)
- •Пример установления связи через порт и модем
- •Защищенный режим микропроцессора
- •Структура дескрипторных таблиц
- •Локальная дескрипторная таблица (ldt)
- •Структура дескриптора:
- •Структура байта ar
- •Обработкапрерываний в защищенном режиме
- •Особенности обработки ловушек
- •Шлюз задачи
- •Дескриптор tss
- •Структура шлюза вызова
1 ;Программа преобразования двузначного шестнадцатеричного числа
2 ;из символьного представления в двоичное
3 ;Результат преобразования будет в регистре bl
4 ;Вводить цифры или прописные буквы: A,B,C,D,E,F !!!
5
6 0000 data segment para public 'data' ;Определяем сегмент данных
7 0000 82 A2 A5 A4 A8 E2 A5+ mes1 db 'Введите первую цифру $'
8 20 AF A5 E0 A2 E3 EE+
9 20 E6 A8 E4 E0 E3 20+
10 20 24
11 0017 82 A2 A5 A4 A8 E2 A5+ mes2 db 'Введите вторую цифру $'
12 20 A2 E2 AE E0 E3 EE+
13 20 E6 A8 E4 E0 E3 20+
14 20 24
15 002E data ends
16
17 0000 stk segment stack 'stack' ; Определяем сегмент стека
18 0000 0100*(3F) db 256 dup('?')
19 0100 stk ends
20
21 0000 code segment 'code' ;Начало сегмента кода
22 0000 main proc
23 assume cs:code, ds:data, ss:stk
24 0000 B8 0000s mov ax,data
25 0003 8E D8 mov ds,ax
26 0005 B4 09 mov ah,9h ;Выводим на экран
27 0007 BA 0000r mov dx,offset mes1 ;строку
28 000A CD 21 int 21h ; mes1
29 000C 33 C0 xor ax,ax ;Очистим регистры ax
30 000E 33 DB xor bx,bx ; и bx
31 0010 B4 01 mov ah,1h ;Ввод с клавиатуры
32 0012 CD 21 int 21h ;первой цифры (загружается в регистр al)
33
34 0014 2C 30 sub al,30h ;Вычитаем из al число 30h
35 0016 3C 09 cmp al,9h ;Сравниваем результат с 9h
36 0018 7E 02 jle m1 ;Если меньше или равно, то на метку m1
37 001A 2C 07 sub al,7h ;Иначе - вычитаем из al число 7h
38 001C m1:
39 001C 02 1E 0000 add bl,a1 ; Загружаем в bl первое число
**Error** Prog.asm(33) Undefined symbol: A1
40 0020 D1 E3 D1 E3 D1 E3 D1+ shl bx,4h ;Сдвигаем содержимое bx на 4
; разряда влево
41 E3
42
43 0028 B4 09 mov ah,9h ; Выводим на экран
44 002A BA 0017r mov dx,offset mes2 ; строку
45 002D CD 21 int 21h ; mes2
46
47 002F B4 01 mov ah,1h ;Ввод с клавиатуры
48 0031 CD 21 int 21h ;второй цифры
49
50 0033 2C 00 sub al,300h ;Повторение
**Error** Prog.asm(43) Constant too large
51 0035 3C 09 cmp al,9h ;проверки
52 0037 7E C7 jle m2 ;кода
**Error** Prog.asm(45) Undefined symbol: M2
53 0039 2C 07 sub al,7h ;ASCII
54 003B m22:
55 003B 02 D8 add bl,al ;Загружаем в bl второе число
56
57 003D B8 4C00 mov ax, 4c00h ;Выход
58 0040 CD 21 int 21h ; в систему
59 0042 main endp
60 0042 code ends ;Окончание сегмента кода
61 end main
Symbol Name Type Value Cref (defined at #)
??DATE Text "13/09/09"
??FILENAME Text "Prog "
??TIME Text "15:10:55"
??VERSION Number 030A
@CPU Text 0101H
@CURSEG Text CODE #6 #17 #21
@FILENAME Text PROG
@WORDSIZE Text 2 #6 #17 #21
M1 Near CODE:001C 36 #38
M22 Near CODE:003B #54
MAIN Near CODE:0000 #22 61
MES1 Byte DATA:0000 #7 27
MES2 Byte DATA:0017 #11 44
Groups & Segments Bit Size Align Combine Class Cref (defined at #)
CODE 16 0042 Para none CODE #21 23
DATA 16 002E Para Public DATA #6 23 24
STK 16 0100 Para Stack STACK #17 23
**Error** Prog.asm(33) Undefined symbol: A1
**Error** Prog.asm(43) Constant too large
**Error** Prog.asm(45) Undefined symbol: M2
Файл листинга содержит, в частности, код ассемблера исходной программы. Но в листинге приводится расширенная информация об этом коде. Для каждой команды ассемблера указываются её машинный (объектный) код и смещение в кодовом сегменте.
Кроме того, в конце листинга TASM формирует таблицы, которые содержат информацию о метках и сегментах, используемых в программе, а также информацию о размерах и других параметрах сегментов кода, данных и стека.
Если есть ошибки или сомнительные участки кода, то TASM включает в конец листинга сообщение о них. Если сравнивать их с сообщениями TASM, выводимыми на экран, то видно, что они совпадают. Кроме того, что очень удобно, эти же сообщения включаются в текст листинга после ошибочной строки.
Строки в файле листинга имеют следующий формат:
<глубина_вложенности> <номер_строки> <смещение> <машинный_код> <исходный код>
Здесь:
<глубина_вложенности> - уровень вложенности включаемых файлов или макрокоманд в файле;
<номер_строки> - номер строки в файле листинга. Этим номера используются для локализации ошибок и форматирования таблицы перекрестных ссылок. Помните, что эти номера могут не соответствовать номерам строк в исходном файле.
В добавлении к вышесказанному нужно отметить, что ассемблер имеет директиву INCLUDE, которая позволяет включить в данный файл строки другого файла. Нумерация при этом как и в случае макрокоманд, будет последовательная для строк обоих файлов. Факт вложенности кода одного файла в другой фиксируется увеличением значения <глубина_вложенности> на единицу. Это замечание касается и использования макрокоманд;
<смещение> - смещение в байтах текущей команды относительно начала сегмента кода. Это смещение называют также счетчиком адреса. Смещение вычисляет транслятор для адресации в сегменте кода;
<машинный_код> - машинное представление команд ассемблера,
<исходный_код> - строка кода из исходного файла.
Дальнейшие действия зависят от характера ошибки.
Исправлять ошибки следует в исходном файле с расширением asm. Исправив несколько первых ошибок (если они есть), перетранслируйте программу и приступайте к устранению следующих ошибок. Возможно, что это делать не придётся, так как после исправления одной ошибки могут исчезнуть и последующие (так называемые наведенные ошибки).
О нормальном окончании процесса трансляции можно судить по сообщению TASM, в котором отсутствуют строки с сообщениями об ошибках и предупреждениях.
Изучая внимательно файл листинга, вы, наверное, заметили, что не все строки исходной программы имеют соответствующий <машинный_код>. Это обстоятельство обусловлено тем, что исходный файл на ассемблере в общем случае может содержать конструкции следующих типов:
команды ассемблера — конструкции, которым соответствуют машинные команды;
директивы ассемблера — конструкции, которые не генерируют машинных команд, а являются указаниями транслятору на выполнение некоторых действий или служат для задания режима его работы;
макрокоманды — конструкции, которые, будучи представлены одной строкой в исходном файле программы, после обработки транслятором генерируют в объектном модуле последовательность команд, директив или макрокоманд ассемблера.
Формат листинга и его полнота не являются жестко регламентированными. Их можно изменить, задавая в исходном файле программы директивы управления листингом.
