- •Содержание
- •Введение
- •Архитектура микропроцессоров Intel 8086
- •Общие принципы работы мп 8086 при выполнении прикладных программ
- •Регистры
- •Адресация
- •Непосредственная адресация
- •Прямая адресация
- •Регистровая адресация
- •Косвенная регистровая адресация
- •Адресация no базе
- •Индексная адресация
- •Индексная адресация со смещением
- •Система команд
- •Команды пересылки данных
- •Арифметические команды
- •Битовые команды
- •Строковые команды
- •Команды передачи управления
- •Команды перехода
- •Условные
- •Безусловные
- •Команды условного перехода
- •Команды управления циклом
- •Тело цикла
- •Команды прерываний
- •Структура программы на языке ассемблера
- •Основные понятия языка ассемблера
- •Написание сегмента данных
- •Написание сегмента стека
- •Написание сегмента кода
- •Написание головной подпрограммы
- •Подготовка программ к выполнению
- •Отладка программ в Turbo Debugger
- •Специфика встроенного ассемблера
- •Оператор asm
- •Синтаксис ассемблерных команд
- •Коды инструкций
- •Операнды
- •Константы
- •Выражения
- •Операции
- •Бинарная операция -
- •Побитовые операции not, and, or, xor
- •Директивы ассемблера
-
Написание головной подпрограммы
Главная подпрограмма вызывается системой, однако в стек адрес возврата не записывается. Чтобы вернуться в операционную систему, нужно выполнить команду, находящуюся в самом начале так называемого программного префикса. Программным префиксом (PSP) называется область памяти размером 256 байт, используемая для хранения переменных окружения, командной строки, некоторых других данных и предшествующая в памяти сегменту кода:
Номер сегмента PSP система записывает в регистр DS. Смещение первой его команды всегда равно нулю.
В начале работы главной подпрограммы необходимо записать в стек адрес первой команды PSP: сначала DS, а затем ноль. Тогда команда RET в конце головной подпрограммы извлечет этот адрес из стека и следующей выполнится команда возврата в операционную систему.
Поскольку при старте программы в DS находится номер сегмента PSP, в DS необходимо явно записать номер сегмента данных. Это делают так:
MOV AX, Dseg
MOV DS, AX
Поэтому головную процедуру пишут обычно так:
Main PROC FAR
PUSH DS ; Занесение DS в стек
MOV AX, 0 ; Обнуление AX
PUSH AX ; Занесение нуля в стек
MOV AX, Dseg ; Настройка DS на сегмент данных
MOV DS, AX
…
RET
Main ENDP
Пример программы на ассемблере
Приведем пример программы, вычисляющей сумму трех чисел: X,Y,Z и записывающей результат в переменную RES.
; Сегменты не более 64 килобайт
.MODEL SMALL
; Сегмент стека
Sseg SEGMENT STACK ‘stack’
DB 256 DUP (?)
Sseg ENDS
; Сегмент данных
Dseg SEGMENT ‘data’
X DB 3
Y DB 5
Z DB 7
RES DB ?
Dseg ENDS
; Сегмент кода
Cseg SEGMENT ‘code’
ASSUME CS:Cseg, DS:Dseg, SS:Sseg
; Процедура добавления Z к сумме X и Y в AL и записи результата в RES
Sumres PROC NEAR
ADD AL, Z
MOV RES, AL
RET
Sumres ENDP
; Головная подпрограмма
Main PROC FAR
; Подготовимся к возврату в операционную систему
PUSH DS
MOV AX, 0
PUSH AX
; Настроим DS на наш сегмент данных
MOV AX, Dseg
MOV DS, AX
; Делаем вычисления
MOV AL, X
ADD AL, Y
CALL Sumres
; Передача управления первому оператору в PSP
RET
Main ENDP
Cseg ENDS
END Main
-
Подготовка программ к выполнению
Программы на ассемблере подготавливаются к выполнению в 2 этапа: ассемблирование и компоновка. Ассемблирование выполняется программой tasm.exe с помощью команды DOS:
Tasm имя_файла.asm
Выходным файлом является файл с расширением obj. На этапе компоновки к нему обычно присоединяются различные библиотеки, однако для учебных программ это не нужно и компоновка выполняется командой:
Tlink имя_файла.obj
Результатом является exe-файл, который доступен для запуска и отладки.
-
Отладка программ в Turbo Debugger
Для отладки полученного exe-файла необходимо выполнить команду DOS:
Td имя_файла.exe
Произойдет запуск отладчика и загрузка exe-файла в него. На сообщение об отсутствии дополнительной отладочной информации следует нажать ОК. Рассмотрим области окна отладчика (рис.4.1):
Окно кода В нем отображаются команды, их адреса и машинные коды. |
Окно значений регистров |
Окно значений битов регистра FLAGS |
Окно данных Отображает содержимое сегмента данных. |
Окно стека Отображает содержимое стека |
Рис. 4.1. Структура окна отладчика Turbo Debugger
При открытии окна отладчика окно данных отображает начало PSP, так как DS в этот момент указывает именно туда. Но при перенастройке DS в команде MOV DS, AX это окно не меняет содержимого. Чтобы отобразить в нем сегмент данных после выполнения этой команды, необходимо перейти в это окно (с помощью мыши или клавиши Tab), нажать комбинацию клавиш Ctrl+G, в появившемся окне ввести ds:0 и нажать Enter.
Для выполнения программы по шагам предназначены клавиши F7 и F8. Разница между ними заключается в обработке команды CALL. Нажатие F7 приводит к переходу на первую команду вызываемой подпрограммы, а нажатие F8 – к переходу к следующей за CALL команды вызывающей подпрограммы. Комбинация клавиш Ctrl+F2 позволяет заново начать выполнение программы с ее первой команды. Клавиша F4 позволяет выполнить программу до текущей строки.
В соответствующих окнах также можно просматривать содержимое регистров и стека.