- •Таганрог 1997 Методическая разработка к лабораторным работам Программирование на языке ассемблера пэвм ibm pc
- •Введение
- •Структура описания лабораторной работы
- •Выполнение работы
- •Разработка и отладка программ на языке ассемблера
- •2.2. Обработка программ в dos
- •Трансляция программы
- •Компоновка программы
- •Запуск программы
- •2.3. Использование отладчика td
- •Как запустить программу под отладчиком
- •Что умеет и чего не умеет отладчик td
- •Меню View Окно Module
- •Окно cpu
- •Окно Watches
- •Окно Dump
- •Экран пользователя
- •Команда Instruction Trace
- •Команда Program Reset
- •3. Пример выполнения работы
- •4. Контрольные вопросы
- •2.2. Режимы адресации
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Циклические и разветвляющиеся программы1. Цель работы
- •2. Основные сведения
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Логические команды1. Цель работы
- •2. Основные сведения
- •2.1. Логические команды
- •2.2. Примеры использования логических команд
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Символьная обработка1. Цель работы
- •2. Основные сведения
- •2.1. Программные прерывания и системные вызовы
- •2.2. Функции dos для ввода с клавиатуры
- •2.3. Функции dos для вывода на экран
- •3. Пример выполнения работы
- •Inpstr db 80, ?, 82 dup( ? ) ; буфер ввода
- •Inc count[si] ;увеличиваем соответств. Счетчик
- •Xor si, si ;Счетчик цифр
- •Int 21h ; строки
- •Inc si ;Счетчик очередной цифры
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Десятичная арифметика
- •2.3. Команды десятичной коррекции неупакованных чисел
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Подпрограммы1. Цель работы
- •2. Основные сведения
- •2.1. Описание подпрограмм
- •2.2. Вызов подпрограмм
- •2.3. Передача параметров
- •2.4. Сохранение регистров
- •2.5. Локальные переменные
- •2.6. Директивы описания сегментов и модели памяти Модели памяти
- •Директивы определения сегментов
- •Макрокоманды начала и завершения программы
- •2.7. Расширенные директивы описания процедур
- •2.8. Область действия имен
- •2.9. Итоги
- •3. Пример выполнения работы
- •Int 21h ;Приглашение к вводу строки
- •Int 21h ;Ввод строки
- •Int 21h ; позиции удаления
- •Int 21h ;Ввод строки числа
- •Int 21h ; числа удаляемых
- •Int 21h ;Ввод строки числа удаляемых
- •Int 21h ;Заголовок вывода
- •Inc bx ;Сдвиг по строке
- •Int 21h ; Вывод результата
- •Inc bx ;Сдвиг по строке
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа 8 Использование подпрограмм на языке ассемблера в программах на языках c и pascal1. Цель работы
- •2. Основные сведения
- •2.1. Введение
- •2.2. ТерминЫ и сокращения
- •2.3. Соглашения о связях
- •Преобразование имен
- •Передача и возврат управления и данных
- •Сохранение регистров
- •Трансляция и компоновка
- •Преобразование данных
- •Трансляция и компоновка
- •3. Пример выполнения работы
- •3.1. Интерфейс Pascal
- •Inc si ;указатель на входную строку
- •Inc cx ;нет, увеличиваем счетчик символов
- •Inc dx ;да, увеличиваем счетчик строк
- •Inc dx ;нет, будем увеличивать счетчик строк
- •4. Варианты заданий
- •5. Контрольные вопросы
- •БиблиографИя
- •Содержание
- •Заметки
- •Дроздов Сергей Николаевич Калачев Дмитрий Петрович
3. Пример выполнения работы
Дана формула: X = 3A + (B + 5)/2 – C – 1 .
A, B, C, X - целые знаковые числа, занимающие слово. Написать программу, реализующую данную формулу.
Распишем формулу по отдельным операциям:
AX A |
значение А в регистр AX |
AX 2*(AX) |
2A в AX |
AX (AX) + A |
3A в AX |
BX B |
B в BX |
BX 5 + (BX) |
B+5 в BX |
BX (BX)/2 |
(B+5)/2 в BX |
AX (BX) + (AX) |
3A+(B+5)/2 в AX |
AX (AX) – C |
3A+(B+5)/2–C в AX |
AX (AX) – 1 |
3A+(B+5)/2–C–1 в AX |
X (AX) |
3A+(B+5)/2–C–1 в X |
Текст программы:
model SMALL
stack 100h
dataseg
A dw 10
B dw 20
C dw 5
X dw ?
codeseg
startupcode
mov AX, A ;значение А в регистрAX
sal AX, 1 ; 2A вAX
add AX, A ; 3A вAX
mov BX, B ; B вBX
add BX, 5 ; B+5 вBX
sar BX, 1 ; (B+5)/2 вBX
add AX, BX ; 3A+(B+5)/2 вAX
sub AX, C ; 3A+(B+5)/2-C вAX
dec AX ; 3A+(B+5)/2-C-1 вAX
mov X, AX ; 3A+(B+5)/2-C-1 вX
;Конец работы
QUIT: exitcode 0
end
Предсказать результат и проверить совпадает ли он с полученным. Попробовать другие варианты данных. Данные изменять непосредственно в отладчике, используя окна Watch или Dump.
4. Варианты заданий
Разработать программу, реализующую указанную формулу, исполнить программу с несколькими наборами исходных данных, проверить правильность результатов.
X = –4A + ( B + C )/ 4 + 2
X = (A – B) / 4 – 2C + 5
X = (A/2 + B) / 4 + C – 1
X = (7A – 2B – 100) / 2 + C
X = – (C + 2A + 4B + 8 )
X = –A/2 + 4( B + 1 ) – 3C
X = A – 5( B – 2C ) + 2
X = 6C + ( B – C + 1)/2
5. Контрольные вопросы
Из каких полей состоит строка программы на ассемблере ?
Какие поля обязательны, а какие можно опустить ?
Назначение директив stack, dataseg и codeseg.
Назначение макрокоманд startupcode, exitcode.
Назначение директив db, dw.
Назначение оператора dup в директивах db, dw.
Назначение директивы end.
В чем различие между командами: mov AX, BX; mov AX, [BX]; mov [AX], BX ?
Какая директива завершает текст программы ?
В чем различие между командой mov A, 1 и директивой A dw 1 ?
Пусть имя файла исходной программы – LAB.ASM . Что будут содержать файлы: LAB.OBJ, LAB.LST, LAB.EXE ?
Для чего используется отладчик ?
Как изменится содержимое AL и флагов после выполнения команд shr AL, 1 ; sar AL, 1 ; shl AL, 1 ; sal AL, 1 , если AL = F2h ?
3
Лабораторная работа
Циклические и разветвляющиеся программы1. Цель работы
Цель настоящей работы – выработка навыков разработки простых циклических программ на языке ассемблера.
2. Основные сведения
Программирование разветвляющихся вычислений на языке ассемблера связано с использованием команд условного перехода. Каждая из этих команд проверяет некоторый код условия или их комбинацию, и в случае выполнения условия выполняет переход по указанному адресу. При невыполнении условия управление передается следующей команде программы.
Для выработки кода условия можно воспользоваться командами cmp, test. Кроме того, коды условия вырабатываются арифметическими и логическими командами.
Для организации циклических вычислений можно также использовать команды условного перехода, однако в случае организации цикла по счетчику удобнее воспользоваться командами цикла loop.
Одно из важнейших применений циклов – обработка массивов. В языке ассемблера существует возможность описывать только одномерные массивы. Для этого используют директивы описания данных db, dw, dd и др. При выполнении цикла часто требуется при каждом новом повторении обращаться к следующему элементу массива. Фактически это означает необходимость увеличения адреса текущего элемента. Очевидно, это можно сделать, если для обращения к элементу массива применять индексный или базовый режим адресации.
Важным моментом при программировании циклов является проверка условия окончания цикла. Есть несколько возможных вариантов организации такой проверки. Если число повторений заранее известно, то можно в одном из регистров (лучше в CX) вести счетчик повторений, тогда условием окончания будет достижение счетчиком заданного значения. Иногда вместо счетчика удобнее использовать значение адреса обрабатываемого элемента массива, в этом случае за условие окончания следует принять выход адреса за пределы массива.
Следует очень внимательно относиться к выбору конкретного значения счетчика или адреса, при котором заканчивается цикл. Практика программирования показывает, что одним из самых распространенных типов ошибок в программах является выполнение на одно повторение цикла больше или меньше, чем нужно.