- •Таганрог 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. Соглашения о связях
- •Преобразование имен
- •Передача и возврат управления и данных
- •Сохранение регистров
- •Трансляция и компоновка
- •Преобразование данных
- •Трансляция и компоновка
- •Inc si ;указатель на входную строку
- •3. Пример выполнения работы
- •3.1. Интерфейс Pascal
- •Inc cx ;нет, увеличиваем счетчик символов
- •Inc dx ;да, увеличиваем счетчик строк
- •Inc dx ;нет, будем увеличивать счетчик строк
- •4. Варианты заданий
- •5. Контрольные вопросы
- •БиблиографИя
- •Содержание
- •Заметки
- •Дроздов Сергей Николаевич Калачев Дмитрий Петрович
2.8. Область действия имен
Если для аргументов и локальных переменных, а также меток операторов в подпрограмме, не заданы имена с предшествующим префиксом локального идентификатора, все аргументы, заданные в заголовке процедуры, определены ли они с помощью директивы arg или local и метки имеют глобальную область действия.
Идентификаторы с локальной областью действия разрешает директива locals (не путать с директивой local).
Например:
locals __ TST1 proc arg __A: word, __B: word, __C: byte local __X: word, __Y: dword...
В этом примере директива locals __ определяет двойной символ подчеркивания как префикс локальных имен. Это означает, что все имена, начинающиеся с данной пары символов, будут считаться локальными в пределах подпрограммы.
2.9. Итоги
Соединив все, что было сказано в предыдущих параграфах, можно предложить следующий шаблон подпрограммы:
locals __
... Func proc near arg __p1: word, __p2: word, ... = __ArgSize local __v1: byte, __v2: word, ... = __LocSize;Действие: ... ;Входные параметры: ... ;Выходные параметры: ... ;Возвращает: ... ;Обращение: ... ;Замечания: ; регистры не модифицирует ; стек чистит от параметров push BP ;+ BP - указатель mov BP, SP ;- кадра стека sub SP, __LocSize ;выделение памяти для лок. переменных push SI, DI ;сохранение регистров ... mov SI, __p1 ;доступ к параметру ... mov __v2, SI ;доступ к локальной переменной ... pop DI, SI ;восстановление регистров mov SP, BP ;чистка стека от лок. переменных pop BP ;восстановлениеBP ret __ArgSize ;возврат и чистка стека от параметров Func endp
3. Пример выполнения работы
Разработать подпрограмму, которая удаляет, начиная с заданной позиции строки, указанное число символов. Разработать программу, которая вводит с клавиатуры строку, вводит позицию и длину удаляемой части строки и удаляет эту часть.
Текст программы:
locals __
model small
stack 100h
dataseg
MESS1 db 0dh,0ah,0dh,0ah,"Введите строку:",0dh,0ah,"$"
MESS2 db 0dh,0ah,"Введите позицию: $"
MESS3 db 0dh,0ah,"Введите число удаляемых символов: $"
MESS4 db 0dh,0ah,0dh,0ah,"Строка после удаления:",0dh,0ah,"$"
S_BUFLEN db 80 ; Макс. длина строки
S_FACTLEN db ? ; Длина фактически введенной строки
S_INPBUF db 80 dup (?) ; Введенная строка
N_BUFLEN db 3 ; Макс. длина числа при вводе
N_FACTLEN db ? ; Фактическая длина
N_INPBUF db 3 dup (?) ; Строка представления числа
POSDEL dw ? ; Позиция, начиная с которой удаляем
LENDEL dw ? ; Сколько символов удалить
codeseg
startupcode
; Ввод строки
MLOOP: lea DX, MESS1
mov AH, 09h
Int 21h ;Приглашение к вводу строки
lea DX, S_BUFLEN
mov AH, 0Ah
Int 21h ;Ввод строки
mov BL, S_FACTLEN
cmp BL, 0 ;Строка пустая?
jne LLL0 ;Нет - продолжать
jmp QUIT ;Закончить работу
LLL0: mov BH, 0 ;Дополнить длину до слова
add BX, 2 ; и получить адрес позиции
add BX, DX ; сразу после конца строки
mov byte ptr[BX],0;Записать признак конца строки
; Ввод позиции удаления
LLL1: lea DX, MESS2 ;Приглашение
mov AH, 09h ; к вводу
