
- •Программирование на языке Ассемблер
- •Классификация языков программирования
- •Поколения мп
- •Структура мп 8086
- •Регистры мп
- •Регистры общего назначения
- •Сегментные регистры
- •Регистры смещений
- •Регистр флагов
- •Структура и организация памяти
- •Сегментация памяти и формирование адреса
- •Особенности машинных команд
- •Основные команды мп
- •1.2 Перестановка (exchange):
- •1.3 Загрузка исполнительного адреса (load effective address):
- •3.1 Команды умножения
- •3.2 Команды деления
- •Переходы. Циклы
- •Команды сравнения и условного перехода
- •Команды условного перехода
- •3. Команды управления циклом
- •Язык Ассемблера ibm pc. Структура операторов и директив. Метки, переменные и их атрибуты
- •Команды
- •Директивы
- •Директивы определения данных
- •Конструкция повторения dup
- •Директива dd (define double word, определить двойное слово)
- •Директивы эквивалентности и присваивания
- •Структура программы. Логические сегменты
- •Побитовая обработка и ее основные виды
- •2. Команды сдвига
- •2.1. Логические сдвиги
- •2.2. Арифметические сдвиги
- •2.3. Циклические сдвиги
- •Стек и сегмент стека
- •Стековые команды
- •Пример использования стека
- •Модульное программирование
- •Типы объединения модулей
- •Связь Паскаль-Ассемблер
- •Параметры-значения
- •Параметры-переменные
- •Способы адресации
- •Команды строковых примитивов
- •Сканирование строки: scasb, scasw
- •Приемы обработки структурированной информации
- •Inc si ; к следующей оценке
- •Inc dx ; учет отличника
- •Составление и оформление программ на ассемблере
- •Префикс программного сегмента. Com- и exe-программы
- •Команда прерывания
- •Функции прерывания 21h
- •Процесс разработки программы на языке ассемблера
- •Трансляция программы
- •Компоновка программы
- •Макроповторения
- •Макрооператоры
- •Директива local
- •Директивы условного ассемблирования
- •Директивы if и ife
- •Директивы ifidn и ifdif
Inc si ; к следующей оценке
LOOP M2
Inc dx ; учет отличника
NEXT: MOV CX, AX
ADD BX, TYPE STUD ; на начало информации о следующем студенте
LOOP M1
Составление и оформление программ на ассемблере
Логические сегменты отражают разработку программы в виде отличающихся друг от друга областей кода (собственно программы), данных и стека.
Каждый логический (программный) сегмент должен начинаться с директивы SEGMENT (сегмент) и заканчиваться директивой ENDS (конец сегмента):
<имя> SEGMENT [<список атрибутов>]
……
<имя> ENDS
Логические сегменты как средство языка ассемблера взаимосвязаны с физическими сегментами, представляющими собой особенности архитектуры микропроцессора.
Каждый логический сегмент в ассемблерной программе определяет наименованную область памяти, которая адресуется с неизменным содержимым одного из сегментных регистров.
Пример:
DATA SEGMENT
key db ?
ind dw 10
addr dd ?
poly dw 1
DATA ENDS
Необходимая ассемблеру информация о содержимом сегментных регистров сообщается в директиве ASSUME, имеющей следующий формат:
ASSUME <SR: базовое значение>, [<SR: базовое значение>]...
Поле SR содержит имя одного из сегментных регистров (CS, DS, SS, ES), а базовое значение указывает начало области памяти, адресуемой через сегментный регистр.
Одним из наиболее часто используемых типов базового значения является имя сегмента, например:
ASSUME DS: DATA
До использования сегментного регистра в формировании физических адресов памяти он должен быть инициализирован. База, соответствующая логическому сегменту, представлена именем сегмента. Следовательно, при инициализации сегментного регистра DS, определяющего основную область данных, используется имя основного сегмента данных, например:
сегмент DATA является в программе основной областью данных, тогда до любых обращений к переменным необходимо инициализировать сегментный регистр DS:
mov ax,DATA ; инициализация регистра ds
mov ds,ax ; через регистр ax
Пример объявления стекового сегмента:
sSTACK SEGMENT stack
db 100 dup(?)
sSTACK ENDS
Вызов процедуры (переход с возвратом):
CALL <имя процедуры>
Возврат из процедуры (return):
RET
Для организации процедур в языке ассемблера предназначены директивы PROC и ENDP. Директива PROC отмечает точку входа процедуры, а директива ENDP - окончание процедуры. Формат этих директив имеет следующий вид:
<имя> PROC <тип>
тело процедуры
<имя> ENDP
Справа от ключевого слова PROC указывается тип процедуры NEAR или FAR (по умолчанию принимается тип NEAR).
Префикс программного сегмента. Com- и exe-программы
При загрузке программы в память операционная система создает префикс программного сегмента (Program Segment Prefix, PSP) размером 256 байт.
Различают прикладные программы с расширением .com и .exe.
Для инициализации exe-программ программист должен прописать некие стандартные действия, заключающиеся в следующем:
Указать транслятору соответствие между логическими сегментами и сегментными регистрами.
Сохранить в стеке адрес возврата в операционную систему. Этим адресом является адрес первых двух байт префикса программного сегмента, где находится команда перехода в ОС (для корректного возврата в стек необходимо записать DS:0)
Необходимо загрузить в DS адрес сегмента данных.
push ds
mov ax,0
push ax
mov ax,Data
mov ds,ax
Первые три команды сохраняют в стеке адрес возврата в операционную систему после завершения выполнения программы, а две последние - осуществляют инициализацию сегментного регистра DS.