|
Ассемблер методичка. Программа представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
озврат значения в функциях языков высокого уровня осуществляется через регистр AX (AL, DX:AX), в зависимости от размера возвращаемого значения.
Приведем пример функции, складывающей значения параметров и возвращающей результат через AX:
Sum PROC NEAR
PUSH BP
MOV BP, SP
MOV AX, SS:[BP+8]
ADD AX, SS:[BP+6]
POP BP
RET
Sum ENDP
Заметим, что все, что было записано в стек внутри под-программы, должно быть извлечено из него, так как в противном случае команда RET возвратит управление не в ту точку, откуда была вызвана подпрограмма. Практическая часть Практическая часть работы включает выполнение следующих действий: Правильность разработки и выполнения контролируется путем ручной трассировки составленного алгоритма с последующим сравнением результатов работы программы с результатами ручной трассировки. Варианты заданий Для всех заданий входные данные передаются в подпрограмму через стек, а результат возвращается через регистр AL. Для массивов входными данными являются адрес массива и число элементов в нем.
Найти НОД 2 заданных чисел.
Найти максимум в заданном массиве.
Найти минимум в заданном массиве.
Найти сумму четных элементов массива.
Найти сумму нечетных элементов массива.
Подсчитать число ненулевых элементов массива.
Найти индекс минимального элемента в массиве.
Найти индекс максимального элемента в массиве.
Вычислить i-е число Фибоначчи.
Вычислить значение функции F(x)=x2+5x+7
Вернуть 1, если числа являются сторонами треугольника Пифагора, иначе вернуть 0.
Вернуть 1, если точка лежит внутри окружности и 0 иначе.
Порядок выполнения работы
Сформировать исходные данные в соответствии с вариантом.
Составить алгоритм подпрограммы и основной программы для решения поставленной задачи.
Провести трассировку заданного алгоритма с использова-нием заданных исходных данных.
Составить программу заданного алгоритма в мнемокодах.
Оформить отчет по лабораторной работе.
В учебной лаборатории проверить результаты выполнения программы в программе-отладчике, сравнивая их с результатами ручной трассировки алгоритма.
Содержание отчета
Титульный лист.
Текст задания.
Алгоритм программы.
Текст программы на ассемблере с комментариями.
Таблица трассировки программы.
Библиографический список
Пильщиков В.Н. Программирование на языке ассемблера IBM PC. М.: «Диалог – МИФИ», 1999. – 288 с.
Михальчук В.М., Ровдо А.А., Рыжиков С.В. Микропроцессоры 80х86, Pentium. Архитектура, функци-онирование, программирование, оптимизация кода. Минск: БИТРИКС, 1994.
Скэнлон Л. Персональные ЭВМ IBM PC и XT. Программирование на языке ассемблера: Пер. с англ. М: Радио и связь, 1991. – 336 с.
Абель П. Язык Ассемблера для IBM PC и программирования: Пер. с англ. М: Высшая школа, 1992. – 477 с.
СОДЕРЖАНИЕ
Введение
| 1
| 1. Микропроцессор Intel 8086
| 1
| 1.1. Общие принципы работы МП 8086 при выполнении прикладных программ
|
1
| 1.2. Регистры процессора
| 4
| 1.3. Способы адресации МП Intel 8086
| 7
| 1.4. Указание размера операнда
| 12
| 2. СТРУКТУРА ПРОГРАММЫ НА ЯЗЫКЕ АССЕМБЛЕРА
| 13
| 2.1.Основные понятия языка ассемблера
| 13
| 2.2. Написание сегмента данных
| 14
| 2.3. Написание сегмента стека
| 15
| 2.4. Написание сегмента кода
| 16
| 2.5. Написание головной программы
| 17
| 2.6. Подготовка программы к выполнению
| 19
| 2.7. Отладка программ в Turbo Debugger
| 20
| 3. ЛАБОРАТОРНЫЙ ПРАКТИКУМ
| 21
| Библиографический список
| 37
| ПРИЛОЖЕНИЕ
| 38
|
ПРИЛОЖЕНИЕ Основные команды МП 8086
Таблица П.1
Команда
| Действие
| Z
| S
| C
| O
| MOV Оп1, Оп2
| Оп1Оп2
| -
| -
| -
| -
| XCHG Оп1, Оп2
| Оп1↔ Оп2
| -
| -
| -
| -
| NEG Оп1
| Оп1:=-Оп1
|
|
|
|
| ADD Оп1, Оп2
| Оп1:= Оп1+Оп2
| *
| *
| *
| *
| ADC Оп1, Оп2
| Оп1:= Оп1+Оп2+Флаг C
| *
| *
| *
| *
| SUB Оп1, Оп2
| Оп1:= Оп1-Оп2
| *
| *
| *
| *
| SBC Оп1, Оп2
| Оп1:= Оп1-Оп2-Флаг C
| *
| *
| *
| *
| INC Оп
| Оп1:= Оп1+1
| *
| *
| -
| *
| DEC Оп
| Оп1:= Оп1-1
| *
| *
| -
| *
| MUL Оп,
IMUL Оп
| DX:AX = AX*Оп
| *
| -
| *
| *
| AX = AL*Оп
| *
| *
| *
| *
| DIV Оп,
IDIV Оп
| AX = DX:AX div Оп;
DX = DX:AX mod Оп
| *
| -
| *
| *
| AL = AX div Оп;
AH = AX mod Оп
| *
| *
| *
| *
| CMP Оп1, Оп2
| Оп1-Оп2 без сохранения результата
| *
| *
| *
| *
| NOT Оп1
| Оп1:= ⌐Оп1
|
|
|
|
| AND Оп1, Оп2
| Оп1:= Оп1 ^ Оп2
| *
| *
| 0
| 0
| OR Оп1, Оп2
| Оп1:= Оп1∨Оп2
| *
| *
| 0
| 0
| XOR Оп1, Оп2
| Оп1:= Оп1⊕ Оп2
| *
| *
| 0
| 0
| TEST Оп1, Оп2
| Оп1 ^ Оп2 без сохранения результата
| *
| *
| 0
| 0
| SHL Оп1,1
SHL Оп1,CL
| Логический сдвиг влево на 1 или CL бит
| *
| *
| *
| *
| SHR Оп1,1
SHR Оп1,CL
| Логический сдвиг вправо на 1 или CL бит
| *
| *
| *
| *
|
|
Продолжение табл. П.1
| Команда
| Действие
| Z
| S
| C
| O
| SAR Оп1,1
SAR Оп1,CL
| Арифметический сдвиг вправо на 1 или CL бит
| *
| *
| *
| 0
| JMP метка
| Переход на метку
| -
| -
| -
| -
| JC метка
JB метка
| Переход, если C=1 (если Оп1 в CMP<Оп2 и Оп1 и Оп2 - беззнаковые)
| -
| -
| -
| -
| JNC метка
JNB метка
JAE метка
| Переход, если C=0 (если Оп1 в CMP>=Оп2 и Оп1 и Оп2 - беззнаковые)
| -
| -
| -
| -
| JZ метка
| Переход, если Z=1 (если Оп1 в CMP=Оп2 или если результат нулевой)
| -
| -
| -
| -
| JNZ метка
| Переход, если Z=0 (если Оп1 в CMP<>Оп2 или если результат ненулевой)
| -
| -
| -
| -
| JS метка
| Переход, если S=1 (если результат отрицательный)
| -
| -
| -
| -
| JNS метка
| Переход, если S=0 (если результат положительный)
| -
| -
| -
| -
| JBE метка
JNA метка
| Переход, если C∨Z=1 (если Оп1 в CMP<=Оп2 и Оп1, Оп2 – беззнаковые)
| -
| -
| -
| -
| JA метка
| Переход, если C=0 и Z=0 (если Оп1>Оп2 и Оп1, Оп2 – беззнаковые)
| -
| -
| -
| -
| JL метка
| Переход, если O⊕S = 1 (если Оп1 в CMP<Оп2 и Оп1 и Оп2 – знаковые)
| -
| -
| -
| -
| JNL метка
JGE метка
| Переход, если O⊕S = 0 (если Оп1 в CMP>=Оп2 и Оп1 и Оп2 – знаковые)
| -
| -
| -
| -
|
| Продолжение табл. П.1
| Команда
| Действие
| Z
| S
| C
| O
| JLE метка
JNG метка
| Переход, если O⊕S = 1 и C=1 (если Оп1 в CMP<=Оп2 и Оп1 и Оп2 – знаковые)
| -
| -
| -
| -
| JG метка
| Переход, если O⊕S = 0 и Z=0 (если Оп1 в CMP>Оп2 и Оп1 и Оп2 – знаковые)
| -
| -
| -
| -
| JO метка
| Переход, если O=1
| -
| -
| -
| -
| JNO метка
| Переход, если О=0
| -
| -
| -
| -
| LOOP метка
| CX := CX-1, переход, если CX<>0
| -
| -
| -
| -
| CALL метка
| Вызов подпрограммы
| -
| -
| -
| -
| RET
| Возврат из подпрограммы
| -
| -
| -
| -
| PUSH регистр
| Запись регистра в стек
| -
| -
| -
| -
| POP регистр
| Восстановление из стека
| -
| -
| -
| -
| PUSHF
| Запись регистра FLAGS в стек
| -
| -
| -
| -
| POPF
| Восстановление FLAGS из стека
| -
| -
| -
| -
| CLC
| Сброс C
| -
| -
| 0
| -
| STC
| Установка C
| -
| -
| 1
| -
| CBW
| Заполняет AX знаковым битом AL
|
|
|
|
| CWD
| Заполняет DX знаковым битом AX
|
|
|
|
|
|
|
|