- •Щемелева т.К.
- •Архитектура и программирование реального режима микропроцессоров фирмы 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.5 Использование операндов директивыmodel
Есть еще одна возможность организации данных Pascal - ассемблер - использование операндов директивы model. Вы помните, что она позволяет задать модель памяти и учесть соглашения языков высокого уровня о вызове процедур. Для связи Pascal - ассемблер ее можно задавать в виде:
MODEL large, pascal
Задание в таком виде директивы model позволяет
описать аргументы процедуры непосредственно в директиве ргос:
asmproc ргос near ch:byte,x:word,y:word,kol:word
автоматически сгенерировать код пролога и эпилога в процедуре на ассемблере;
для доступа к аргументам, объявленным в ргос, использовать их имена. В этом отношении данный вариант является аналогом предыдущего варианта с директивой arg.
Листинг 4 демонстрирует, как отразились особенности данного варианта на тексте процедуры ассемблера. Обратите внимание, что пролога уже нет, так как он формируется транслятором автоматически; вместо эпилога обязательно нужно задавать только ret без операндов. Интересно изучить текст листинга 5, который получится в результате трансляции листинга 6. В нем видны сформированные транслятором коды пролога и эпилога. Кроме того, транслятор заместил команду ret без операндов командой ret 0008, которая, в соответствии с требованиями к взаимодействию с программами на Pascal, удалит из стека аргументы, переданные вызываемой процедуре.
Использование директивы MODEL (листинг 4).
prg4.pas
{Программа на Pascal, вызывающая процедуру на ассемблере, полностью совпадает с листингом 1}
;prg4.asm
MASM
MODEL large, pascal
STACK 256
.code
main:
asmproc proc near chr:BYTE,x:WORD,y:WORD,kol:WORD
PUBLIC asmproc
mov dh, byte ptr y ; y в dh
mov dl, byte ptr x ; x в dl
mov ah, 02h ; номер службы BIOS
int 10h ; вызов прерывания BIOS
mov ah, 09h ; номер службы BIOS
mov al, chr ; символ - в al
mov bl, 07h ; маска вывода символа
xor bh, bh
mov cx, kol ; kol в cx
int 10h ; вызов прерывания BIOS
ret
asmproc end ; конец процедуры
end main ; конец программы
Результат трансляции листинга 4 (листинг 5).
1 prg5.asm
2 MASM
3 0000 MODEL large,pascal
4 0000 STACK 256
5 0000 .code
6 0000 main:
7 0000 asmproc proc near chr:BYTE,x:WORD,y:WORD,kol:WORD
8 PUBLIC asmproc
1 9 0000 55 PUSH BP
1 10 0001 8В EC MOV BP, SP
1 11 0003 8А 76 06 mov dh, byte ptr у ;y в dh
12 0006 8А 56 08 mov dl, byte ptr x ;х в d1
13 0009 В4 02 mov ah, 02h ; номер службы BIOS
14 OOOB CD 10 int lOh ;вызов прерывания BIOS
15 OOOD B4 09 mov ah,09h ;номер службы BIOS
16 OOOF 8A 46 OA mov a1chr ;символ - в а1
17 0012 ВЗ 07 mov bl, 07h ;маска вывода символа
18 0014 32 FF xor bh, bh
19 0016 8В 4Е 04 mov cx.kol ;ko1 в сх
20 0019 CD 10 int lOh ;вызов прерывания BIOS.
1 21 001В 5D POP BP
1 22 001С С2 0008 RET 00008h
23 001F asmproc endp ;конец.процедуры
24 end main ;конец программы
Таким образом, можно считать, что мы разобрались со стандартными способами вызова ассемблерных процедур из программ на Pascal и передачи им аргументов. Эти способы будут работать всегда, но компилятор может предоставлять и более удобные средства. Их мы рассматривать не будем, так как читатель, наверное, уже понимает, что они будут сводиться, в конечном счете, к разобранной нами процедуре. Остались открытыми два вопроса:
1. Как быть с передачей данных остальных типов Pascal - ведь мы рассмотрели только данные размером в байт и слово?
2. Как возвратить значение в программу на Pascal?