- •Щемелева т.К.
- •Архитектура и программирование реального режима микропроцессоров фирмы intel
- •Учебное пособие
- •Пермь 2001
- •Содержание
- •1.2.Переводы между позиционными системами счисления
- •1.3.Система кодирования символов ascii
- •1.4. Преобразование строки ascii-кодов в двоичное и шестнадцатеричное число
- •1.5. Применение систем счисления в эвм
- •1.6. Контрольные вопросы и задания
- •Тема 2. Представление данных на языке ассемблера и их хранение в памяти пк
- •2.1. Биты, байты и слова
- •2.3. Размещение различных типов данных в памяти пк
- •2.4. Отрицательные числа
- •2.5. Контрольные вопросы и задания
- •Тема 3. Элементы архитектуры персонального компьютера: сегментная память и регистровая структура микропроцессора
- •3.1. Понятие сегмента
- •3.2. Способ адресации ячеек сегментированной памяти
- •3.4. Программистская модель мп i8086. Назначение регистров.
- •Регистры общего назначения
- •Регистры сегментов и указатель команд
- •3.5. Контрольные вопросы и задания
- •Тема 4. Создание программы в ехе-формате
- •4.1. Программы на языке транслятораMasm.
- •4.1.1. Определение сегментов и данных.
- •4.1.2. Структура программы.
- •4.2. Программы на языке транслятораTasm.
- •4.2.1. Особенности транслятора.
- •4.2.2. Определение сегментов и данных .
- •4.2.3. Директива model.
- •4.2.4. Директивы упрощенного описания сегментов.
- •4.2.5. Структура программы.
- •4.2.6. Директивы startupcode и exitcode.
- •4.3. Контрольные вопросы и задания
- •Тема 5. Способы адресации данных в командах языка ассемблер
- •5.1. Регистровая адресация
- •5.2. Непосредственная адресация.
- •5.3. Прямая адресация.
- •5.4. Косвенная регистровая.
- •5.5. Адресация по базе.
- •5.6. Индексная адресация.
- •5.7. Адресация по базе с индексированием.
- •5.8. Контрольные задания.
- •Тема 6. Основные команды языка Ассемблер
- •6.1. Команды пересылки.
- •1) Пересылка данных
- •2) Пересылка адресов
- •4) Пересылка в стек и из стека
- •6.2. Арифметические операции.
- •2) Арифметические операции над двоичными кодами.
- •3) Команда сравнения:
- •6.3. Команды корректировки.
- •6.4. Команды логических операций.
- •1) Поразрядные логические операции:
- •2) Команды сдвига
- •6.5. Команды передачи управления.
- •6.6. Команды организации цикла.
- •6.7. Команды вызова процедур и возврата из них.
- •6.8. Команды прерываний и возврата из них.
- •6.8.1. Функции ввода/выводаDos.
- •6.8.2. ФункцииBios управления экраном.
- •Тема 7. Стек
- •7.1.Стек и сегмент стека
- •7.2.Стековые команды
- •7.3. Доступ к элементам стека
- •Тема 8. Практическая работа на пк.
- •Тема 9. Создание линейных программ
- •9.1 Создание линейной программы.
- •9.1.1. Составление текста программы.
- •9.1.2 Трансляция.
- •9.1.3. Создание исполняемого файла
- •9.1.4.Отладка программы в turbo debugger’е
- •9.2. Контрольные вопросы и задания
- •Тема 10. Организация ветвлений.
- •10.1.Флаги и их назначение.
- •10.2 Команда безусловного перехода jmp
- •10.3 Команды условных переходов
- •10.4. Создание разветвленной программы.
- •10.4.1. Составление текста программы.
- •10.4.2.Трансляция.
- •10.4.3. Создание исполняемого файла.
- •10.5. Контрольные вопросы и задания
- •Тема 11. Организация циклов
- •11.1. Команды управления циклом
- •11.2.Создание циклической программы.
- •11.2.1.Составление текста программы.
- •11.2.2.Трансляция.
- •11.2.3.Создание исполняемого файла
- •11.2.4.Отладка программы в turbo debugger’е
- •11.3. Контрольные вопросы и задания
- •Тема 12. Циклическая разветвленная программа
- •12.1.Создание программы.
- •12.1.1.Составление программы
- •12.1.2.Трансляция.
- •12.1.3.Создание исполняемого файла.
- •12.1.4. Отладка программы в turbo debugger’е
- •12.2.Контрольные вопросы
- •12.3. Контрольные задания
- •Тема 13. Связь ассемблера с языкомPascal.
- •13.1 Общие положения
- •13.2 Организация связи
- •13.3 Передача аргументов (и возврат результата в случае функции)
- •13.4 ДирективаArg
- •13.5 Использование операндов директивыmodel
- •13.6 Передача данных остальных типовPascal
- •13.7 Возврат значения в программу наPascal
- •13.8 КомандыEnter иLeave
- •13.9 Итоги
- •Листинг 1.2. Ассемблерное представление.
- •Тема 16. Рекомдации начинающему программисту
- •Тема 17. Контрольная работа
- •Список литературы
- •Приложение 1 Инструкция по работе с программой Turbo Debugger.
- •Приложение 2 Практическая работа на пк
- •Приложение 3 ключи командной строкиtasmиtlink
13.6 Передача данных остальных типовPascal
Что касается ответа на первый вопрос, то необходимо вспомнить о том, что в языке Pascal существуют два способа передачи аргументов в процедуру: по ссылке и по значению.
Тип аргументов, передаваемых по ссылке, совпадает с типом ассемблера dword и с типом pointer в Pascal. По сути, это указатель из четырех байт на некоторый объект. Структура указателя обычная: два младших байта - смещение, два старших байта - значение сегментной составляющей адреса. С помощью такого указателя в программу на ассемблере передаются адреса следующих объектов:
всех аргументов, объявленных при описании в программе на Pascal: как var,
независимо от их типа;
аргументов pointer и longint;
строк string;
множеств;
массивов и 'записей, имеющих размер более четырех байтов. Аргументы по значению передаются следующим образом:
для типов char и byte - как байт;
для типа boolean - как байт со значением 0 или 1;
для перечисляемых типов со значением 0...255 - как байт; более 255 - как два байта;
для типов integer и word - как два байта (слово);
для типа real - как шесть байтов (три слова);
массивы и записи, длина которых не превышает четырех байтов, передаются
«как есть».
Заметим, что аргументы таких типов, как single, double, extended и comp, передаются через стек сопроцессора.
13.7 Возврат значения в программу наPascal
Что касается ответа на второй вопрос, то мы рассмотрим его на конкретном примере листингов 6 и 7. Помните, что мы рассматриваем вызов из программы на Pascal внешней процедуры на ассемблере. Понятно, что вызов ради вызова вряд ли нужен - вызываемая процедура должна иметь возможность вернуть данные в вызывающую программу. Поэтому такую вызываемую процедуру правильнее рассматривать как функцию. В связке Pascal - ассемблер для того, чтобы возвратить результат, процедура на ассемблере должна поместить его значение в строго определенное место.
Возврат результата из процедуры на ассемблере в программу на Pascal: | |
Тип возвращаемого значения |
Куда записать результат? |
Байт |
AL |
Слово |
AX |
Двойное слово |
DX:AX (старшее слово: младшее слово) |
Указатель |
DX:AX (сегмент: смещение) |
В листинге 6 приведен текст вызывающего модуля на Pascal, а в листинге 7 - код вызываемого модуля на ассемблере. Программа на Pascal инициализирует две переменные valuel и va1ue2, после чего вызывает функцию на ассемблере AddAsm для их сложения. Результат возвращается в программу на Pascal и присваивается переменной rez.
Вызывающая программа на Pascal (листинг 6).
{prg6.pas}
program prg6;
{внешние объявления}
function AddAsm:word; external;
{$L prg7.obj}
var
valuel: word; {здесь как внешние}
va1ue2: word;
rez: word;
begin
va1uel:=2;
va1ue2:=3;
{вызов функции}
rez:=AddAsm;
write1n( "Результат:",rez);
end.
Вызываемая процедура на ассемблере (листинг 7);
;prg7.asm
MASM
MODEL small
data segment word public ;сегмент данных
;объявление внешних переменных
extrn va1uel:WORD
extrn va1ue2:WORD
data ends ;конец сегмента данных
.code
assume ds:data ;привязка ds к сегменту
;данных программы на Pascal
main:
AddAsm proc near
PUBLIC AddAsm ;внешняя
mov cx,ds:va1uel ;va1uel в cx
mov dx,ds:va1ue2 ;va1ue2 в dx
add cx,dx ;сложение
mov ax,cx ;результат в ax, так как - слово
ret ;возврат из функции
AddAsm endp ;конец функции
end main ;конец программы
Как вы, наверное, обратили внимание, здесь была использована еще одна возможность доступа к разделяемым данным — использование сегментов типа public. Совместное использование сегментов данных стало возможным благодаря тому, что компилятор Pascal создает внутреннее представление программы в виде сегментов, как и положено для программ, выполняющихся на микропроцессоре Intel. Сегмент данных в этом представлении тоже имеет название data, и директива segment для него выглядит так: data segment word public и т. д.