- •Таганрог 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. Контрольные вопросы
- •БиблиографИя
- •Содержание
- •Заметки
- •Дроздов Сергей Николаевич Калачев Дмитрий Петрович
2.2. Вызов подпрограмм
Вызов подпрограммы выполняется командой call. Вызов также бывает ближний или дальний. При ближнем вызове в стеке запоминается текущее значение регистра IP, используемое затем командой ret (ближней) для возврата в точку вызова. При дальнем вызове в стек заносится также значение сегментного регистра CS, что позволяет команде ret (дальней) выполнить возврат в другой сегмент.
Тип вызова определяется типом операнда команды. Если в качестве операнда указано имя подпрограммы, то тип FAR или NEAR выбирается в зависимости от описания подпрограммы. Если в качестве операнда используется слово или двойное слово памяти, то выполняется косвенный, соответственно ближний или дальний вызов подпрограммы по адресу, хранящемуся в памяти. При этом в двойном слове младшее слово содержит смещение, старшее слово - сегмент из адреса подпрограммы.
Например. Пусть в сегменте данных описаны переменные:
FADDR dd ? NADDR dw ?
а в сегменте кода описаны подпрограммы:
FPROC proc FAR . . . FPROC endp NPROC proc . . . NPROC endp
Рассмотрим следующие примеры команд вызова:
call FPROC ;Дальний прямой вызов п/пFPROC call NPROC ;Ближний прямой вызов п/пNPROC call FADDR ;Дальний прямой вызов п/п, чей адрес - вFADDR call NADDR ;Ближний прямой вызов п/п, чей адрес - вNADDR call BX ;Ближний косвенный вызов п/п, чей адрес - в рег.BX call word ptr [BX] ;Ближний косвенный вызов п/п, чей адрес - ; в слове, адрес которого - вBX call dword ptr [BX] ;Дальний косвенный вызов п/п, чей адрес - ; в двойном слове, адрес которого - вBX
2.3. Передача параметров
Программист имеет полную свободу в выборе способа передачи входных параметров в подпрограмму и выходных – из подпрограммы, важно лишь, чтобы обработка параметров в подпрограмме была согласована с заданием параметров в вызывающей программе.
Чаще всего применяется передача параметров через регистры или через стек.
При передаче через регистры программа перед вызовом заносит входные параметры в некоторые регистры процессора, а после возврата выбирает из регистров значения результатов.
При передаче через стек программа перед вызовом заносит параметры в стек с помощью команды push. Обычно при этом считается, что подпрограмма имеет только входные параметры (как функция в языке Си). Чтобы подпрограмма могла изменять значения параметров, следует передавать ей не сами значения, а адреса параметров.
Для доступа к параметрам, переданным в стеке, в начале подпрограммы обычно выполняются команды:
push BP mov BP, SP
После этого можно адресовать величины в стеке, указывая их смещения относительно верхушки стека, адрес которой – в регистре BP. При подсчете смещения нужно учитывать, что команда call, как отмечалось выше, помещает в стек адрес возврата (одно или два слова). Удобно для адресации параметров описать соответствующую структуру данных.
Можно применять смешанные способы передачи параметров. В частности, для подпрограмм-функций удобно возвращать результат в регистре, даже если входные параметры получены в стеке.
Рассмотрим пример. Пусть подпрограмма типа near имеет два словных параметра, передаваемых через стек. В этом случае после вызова подпрограммы, сохранения и загрузки регистра BP (см. выше), стек будет выглядеть, как показано ниже:
|
|
BP |
SP сохраненное значение BP |
IP |
адрес возврата |
2-й параметр |
параметр, занесенный в стек вторым |
1-й параметр |
параметр, занесенный в стек первым |
. . . |
|
Если описать следующую структуру:
__arg struc
__saveBP dw ?
__retAddr dw ?
__Param2 dw ?
__Param1 dw ?
__arg ends,
то доступ к параметрам можно осуществить с помощью команд:
mov AX, __Param1[BP]; загрузить вAX значение первого параметра mov BX, __Param2[BP]; загрузить вBX значение второго параметра
Для облегчения чистки стека от переданных параметров используется разновидность команды ret с операндом – числом байтов, которые нужно убрать из стека сразу после возврата. Это позволяет вызывающей программе не заботиться об удалении параметров из стека. Для нашего примера команда возврата из подпрограммы может выглядеть следующим образом:
ret 4