Поволжский Государственный Университет Телекоммуникаций и Информатики Архитектура ЭВМ и систем Отчёт по лабораторной работе №2 Изучение основ программирования на языке Ассемблера. Упрощенное оформление программ. Создание исполняемых *.com файлов. Выполнил студент группы ИТ-71 Горцунов В.В. Самара 2008 Оглавление 1. Ответы на контрольные вопросы. ..................................................................... 3 2. Выполнение работы ............................................................................................ 6 2.1. Создание hello_2s.asm ................................................................................... 6 2.2. Создание hello_2c.asm................................................................................... 7 Использованная литература ................................................................................... 8 2 1. Ответы на контрольные вопросы. 1. Команды и директивы ассемблера. Формат и отличия. Команды имеют следующий формат: [метка:] мнемоника [операнд(ы)] [;комментарий] Директивы Ассемблера позволяют управлять процессом ассемблирования и формирования листинга. Их используют для распределения памяти, обеспечения связи между программными модулями и работы с символическими именами. Часто их называют псевдокомандами. Формат директив похож на формат команд: [имя] Директива [операнд(ы)] [;комментарий] Каждая команда при трансляции генерирует машинный код команды, размер которого зависит от способов задания операндов. В отличии от команд директивы действуют только в процессе ассемблирования программы и не генерируют машинных кодов. 2. Какова цель сегментации памяти? Для того, чтобы с помощью 16-разрядных чисел адресовать любой байт памяти, предусмотрена сегментная адресация памяти, реализуемая с помощью сегментных регистров процессора. Суть сегментной адресации в следующем. Обращение к памяти осуществляется исключительно с помощью сегментов – логических преобразований, накладываемых на те или иные участки памяти. Исполнительный адрес любой ячейки памяти вычисляется процессором путем сложения начального адреса сегмента, в котором располагается эта ячейка, со смещением к ней от начала сегмента. Это смещение иногда называют относительным адресом. 3. Сколько и каких сегментов может иметь программа? Обычно программа имеет не менее 3 сегментов – сегмента данных, сегмента стека, сегмента кода. 4. В каких случаях имеет смысл использовать упрощенную сегментацию? Упрощенная сегментация или упрощенное оформление программ на ассемблере используется для создания простых программ, которые содержат по одному сегменту для данных и кода, а также для программ модули которых предполагается связывать с программами на языках высокого уровня, используя упрощенные директивы сегментации. При этом структура исходного модуля упрощается. 5. Какие директивы упрощенной сегментации используются? .model, .code, .data, .const, .data?, .stack [размер], .fardata [имя], .fardata? [имя] 3 6. Какие модели памяти используются при упрощенной сегментации? Имя Tiny Тип кода near Тип данных near Определение cs=ds=ss=dgroup Код и данные объединены в одну группу с именем dgroup. Small near near cs=_text; Код занимает один сегмент. Данные объединены в одну группу с именем dgroup. Medium far near cs=<model>_text Несколько сегментов кода. Данные объединены в одну группу с именем dgroup. Compact near far cs=_text Код в одном сегменте. Данные объединены в одну группу с именем dgroup. Large far far cs=<model>_text Код в нескольких сегментах. Данные объединены в одну группу с именем dgroup. Huge far far cs=<model>_text Tchuge far far cs=<model>_text Flat near near cs=text ds=ss=flat Назначение модели Для создания *.com программ Для небольших и средних программ (*.exe). Для программ на Ассемблере. Для больших программ с малым объемом данных. Сегмент кода 64К. Объем данных не ограничен. Размер кода и данных не ограничены. Для больших программ. Тоже, что и large. Ведена для совместимости с ЯВУ. Используется при программировании на Turbo C и Borland C++. Используется в среде OS/2. 7. Какими директивами описывается сегмент? Директива Описание: Начало или продолжение Сегмента кода .code Сегмента инициализированных данных .data Сегмента постоянных данных .const Сегмента неинициализированных данных .data? .stack [размер] Сегмента стека. Параметр задает размер стека .fardata [имя] Сегмента инициализированных данных типа far. .fardata? [имя] Сегмента неинициализированных данных типа far. 9. Как производится ассемблирование и компоновка программы при упрощенной сегментации? Так же, как и для программы с стандартной сегментацией. 10. Как выглядит типовая форма для создания *.exe приложений упрощенной сегментацией? ;Forma_1 - упрощенное оформление программ .MODEL SMALL ;модель памяти ближнего типа .STACK 100h ;определить стек размером 100h .DATA ; Открыть сегмент данных В этом сегменте определяются данные с использованием символических имен ; Открыть сегмент кодов ; Инициализировать .CODE Start: mov AX, @DATA 4 ; сегментный регистр DS mov DS, AX Здесь следуют команды, которые определяются алгоритмом решаемой задачи mov AL, 0 mov AH, 4Ch int 21h END Start ; Завершить программу ; с помощью ; DOS ; Конец исходного модуля. 11. В каких случаях используются программы *.com? Если объем программы оказывается меньше 64 Кб. 12. Как выглядит типовая форма для создания *.com приложений? ;Forma_2 - исходный модуль для создания *.com приложения .MODEL TINY ;модель памяти ближнего типа .CODE ; Открыть сегмент кодов ORG 100h ; 256 байт для PSP Begin: jmp Start ; Безусловный переход на первую команду Здесь определяются данные с использованием символических имен Start: ; Здесь следуют команды, которые определяются ; алгоритмом решаемой задачи mov AX, 4C00h int 21h END Begin ; Завершить программу ; с помощью DOS ; Конец исходного модуля. 13. Из каких сегментов состоит исходный модуль программы типа *.com? Один сегмент в котором расположены и данные и стек и код 14. Каким образом располагается программа типа *.com после загрузки в память? Все сегментные регистры указывают на начало сегмента, в котором располагается программа, фактически на начало PSP. Регистр указателя стека SP автоматически загружается числом – начальной точкой входа в стек FFFEh. 15. Каков размер области сегмента префикса программы (PSP) ? 64 Кбайт. 16. Каков размер стека в программах типа *.com? 256 байт. 17. Как производится ассемблирование и компоновка программ типа *.com? tasm /z /zi /n %1 %1 %1 tlink /t %1 5 2. Выполнение работы 2.1. Создание hello_2s.asm Содержание hello_2s.asm ; Program Hello_2s - Упрощенное оформление программ .MODEL SMALL .STACK 100h .DATA Greet DB 'Hello, My Friends !', 13, 10, '$' Greet_2 DB 'My name is Vlad', 13, 10, '$' ; Модель памяти ближнего типа ; Определить стек размером 100h ; Открыть сегмент данных ; Определить строку символов с именем Greet ; Определить строку символов с именем Greet_2 .CODE Start: mov AX, @DATA mov DS, AX mov AH, 09h mov DX, OFFSET Greet int 21h ; Открыть сегмент кода ; Инициализировать ; сегментный регистр DS через регистр AX ; Вывести строку Greet ; на экран ; с помощью DOS mov AH, 09h mov DX, OFFSET Greet_2 int 21h mov AX, 4C00h int 21h END Start ; Вывести строку Greet_2 ; на экран ; с помощью DOS ; Корректно завершить программу ; с помощью DOS ; Конец исходного модуля 6 2.2. Создание hello_2c.asm Содержание hello_2c.asm ; Program Hello_2c - исходный модуль для создания *.com файла .MODEL TINY ; Модель памяти ближнего типа .CODE ; открыть сегмент кода ORG 100h ; Отвести 256 байт под PSP Begin: jmp Start Greet DB 'Hello, My Friends !', 13, 10, '$' Greet_2 DB 'My name is Vlad', 13, 10, '$' Start: mov AH, 09h mov DX, OFFSET Greet int 21h mov AH, 09h mov DX, OFFSET Greet_2 int 21h mov AX, 4C00h int 21h END Begin ; Перейти на точку входа в программу ; Определить строку символов с именем Greet ; Определить строку символов с именем Greet_2 ; Вывести строку Greet ; на экран ; с помощью DOS ; Вывести строку Greet_2 ; на экран ; с помощью DOS ; Корректно завершить программу ; с помощью DOS ; Конец исходного модуля 7 Использованная литература Assembler. Учебник для вузов. 2-е изд. /В. И. Юров – СПб.: Питер, 2004. с.121…141. К. Г. Финогенов. Основы языка Ассемблера. – М.: Радио и связь, 2000. с. 22…31. Абель П. Язык Ассемблера для IBM PC и программирования /Пер. c англ.- М.:Высш.шк., 1992.с 51…75. 8