- •Щемелева т.К.
 - •Архитектура и программирование реального режима микропроцессоров фирмы 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.2 Организация связи
Организацию такой связи рассмотрим на примере следующей задачи: разработать программу на языке Pascal, которая выводит символ заданное количество раз, начиная с определенной позиции на экране. Все числовые аргументы определяются в программе наPascal. Вывод символа осуществляет процедура ассемблера. Очевидно, что основная проблема в этой задаче - организация взаимодействия модулей наPascalи ассемблере.
Модуль на Pascal (листинг 1).
<1> {prg1.pas}
<2> {Программа вызывающая процедуру на ассемблере}
<3> program my_pas;
<4> {$D+} {включение полной информации для отладчика}
<5> uses crt;
<6> procedure asmproc(ch:char;x,y,kol:integer);external;
<7> {процедураasmprocобъявлена как внешняя}
<8> {$L c:\bc\work\prg1.obj}
<9> BEGIN
<10> clrscr; {очистка экрана}
<11> asmproc("a",1,4,5);
<12> asmproc("s",9,2,7);
<13> END.
Модуль на ассемблере (листинг 2).
<1> ; prg2.asm
<2> ; Процедура на ассемблере, которую вызывает программа на Pascal.
<3> ; Для вывода на экран используются службыBIOS:
<4> ; 02h - позиционирование курсора.
<5> ; 09h - вывод символа заданное количество раз.
<6> MASM
<7> MODEL small
<8> STACK 256
<9> .code
<10> asmproc proc near
<11> PUBLIC asmproc ; объявлена как внешняя
<12> push bp ; пролог
<13> mov bp, sp
<14> mov dh, [bp+6] ; номер строки для вывода символаy- вdh
<15> mov dl, [bp+8] ; номер столбца для вывода символа х - в dl
<16> mov ah, 02h ; номер службы BIOS
<17> int 10h ; вызов прерывания BIOS
<18> ; вызов функции 09h прерывания BIOS 10h:
<19> ; вывод символа из alна экран
<20> movah, 09h; номер службыBIOS
<21> mov al, [bp+10] ; символ ch в al
<22> mov bl, 07h ; атрибут символа - в bl
<23> xor bh, bh
<24> mov cx, [bp+4] ; количество выводов символа - в cx
<25> int 10h ; вызов прерывания BIOS
<26> pop bp ; восстановление bp
<27> ; очистка стека и возврат из процедуры
<28> ret 8
<29> asmproc endp ; конец процедуры
<30> end
Типовая схема организации такой связи следующая:
Написать процедуру на ассемблере дальнего (far) и ближнего типа(near). Назовем ее для примераasmproc. В программе на языке ассемблера (назовем ееprg2.asm), в которую входит процедураasmproc, необходимо объявить имя этой процедуры внешним с помощью директивыPUBLIC.
PUBLIC asmproc
Для того чтобы процедура на ассемблере при компоновке с программой на Pascalвоспринималась компиляторомBorland Pascal 7.0 какfar или near, недостаточно будет просто объявить ее таковой в директивеproc.Вам нужно включить или выключить опцию компилятора, доступную через меню интегрированной среды: OptionsCompilerForce far calls. Установка данной опции заставляет компилятор генерировать дальние вызовы программ. Альтернатива данной опции - ключ в программе{$F+} или{$F-} (соответственно, включено или выключено). Это - локальные ключи, то есть в исходном тексте программы на Pascal их может быть несколько, и они могут, чередуясь друг с другом, поочередно менять форму генерируемых адресов перехода - для одних подпрограмм - дальние вызовы, для других - ближние.
Произвести компиляцию программы prg1.pas, которая будет вызывать внешнюю процедуру на ассемблере, следует вставить директиву компилятора
{$L \путь\prg1.obj}. Эта директива заставит компилятор в процессе компиляции программыprg1.pas загрузить с диска объектный модуль программыprg1.obj.В программеprg1.pasнеобходимо объявить процедуруasmprocкак внешнюю. В итоге последние два объявления в программе наPascalбудут выглядеть так:
{$L my_asm}
procedure asmproc(ch:char;kol,x,y:integer);external;
если вы собираетесь исследовать в отладчике работу программы, то необходимо потребовать, чтобы компилятор включил отладочную информацию в генерируемый им исполняемый модуль. Для этого есть две возможности. Первая заключается в использовании глобального ключа {$D+}. Этот ключ должен быть установлен сразу после заголовка программы на Pascal.Вторая, альтернативная возможность заключается в установке опции компилятора: OptionsCompiler Debug Information;
выполнить компиляцию программы на Pascal. Для компиляции удобно использовать интегрированную среду. Для изучения особенностей связки Pascal - ассемблер удобно прямо в интегрированной среде перейти к работе в отладчике через меню ToolsTurbo Debugger (или клавишами Shift+F4). Будет загружен отладчик. Его среда вам хорошо знакома; в данном случае в окне Module вы увидите текст программы на Pascal. Нажимая клавишу F7, вы в пошаговом режиме будете исполнять программу на Pascal. Когда очередь дойдет до вызова процедуры на ассемблере, отладчик откроет окно с текстом программы на ассемблере. Но наш совет вам - не ждать этого момента, так как вы уже пропустили некоторые интересные вещи. Дело в том, что отладчик скрывает от вас момент перехода из программы на Pascal в процедуру на ассемблере. Поэтому лучше всего исполнять программу при открытом окне CPU отладчика. И тогда вы станете свидетелями тех процессов, которые мы будем обсуждать ниже.
