Файл: Структура программы на Ассемблере. Вывод текстовой информации на монитор.docx
Добавлен: 10.11.2023
Просмотров: 278
Скачиваний: 26
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»(СПбГУТ)_______________________________________________________________________ОТЧЕТЗа лабораторную работу № 3Тема: «Структура программы на Ассемблере. Вывод текстовой информации на монитор»Дисциплина «Вычислительные машины и системы»Выполнил: студент группы ИБ-92вп, Кадамов Ш.Ф.«» ______ 2022 г. ___________/ Кадамов Ш.Ф.Принял: П.А. Волынкин«» ______ 2022 г. ___________/П.А. ВолынкинСанкт-Петербург2022ЦельЦелью настоящей работы является приобретение навыков работы:- с простейшими командами ввода/вывода на уровне DOS;- с системой программирования "Турбо Aссемблер";- с отладчиком TD для ассемблера;Задача1. Запустить DOSBOX. Смонтировать виртуальный диск к папке C:\TASM2. Войти в виртуальный диск.3. Запустить NC4. Создать файл с расширением asm5. Набрать исходный текст программы (варианты 1 и 3 из п.3) во встроенном текстовом редакторе NC, сохранить в файле. Текст выводимого сообщения для каждой бригады должен быть свой – содержать имена и фамилии студентов в бригаде (латинскими и русскими буквами в кодировке 866), а также номер группы и номер бригады.6. Произвести компиляцию и линковку программы.6.1. Компиляцияtasm *.asm à *.obj6.2. Линковка (связывание)tlink *.obj à *.exe7. Запустить программу на выполнение.8. Написать программу вывода того же самого сообщения в консольном режиме на одном из языков высокого уровня (Delphi 1.0, Turbo Pascal, Turbo C, С++ и т.д.).9. С помощью программы TD просмотреть и распечатать ассемблерный текст для всех программ. Разобраться с тем, в каком блоке интерфейса этой программы, какая содержится информация.10. Сравнить результаты выполнения трех-четырех вариантов по размеру исходного и исполняемого файла. Сделать выводы.11. По исходному коду и информации от TD определить:- Размеры всех трех сегментов и PSP- Начальные и конечные адреса всех трех сегментов, а также префикса программы.- Информацию по начальным, конечным адресам и размеру всех сегментов и PSP
mess db 'ИБ92-вп, бригада 3: Блинов Александр, Горелова Валерия, Медведев Михаил','$' ; Текст сообщения для вывода на экран.code ; Начало сегмента кодаstart:mov dx,@stack ; через регистр dx в стековый регистр ss засылаетсяmov ss,dx ; начальный адрес сегмента стекаmov dx,@datamov ds,dxmov dx, offset messmov ah,09hint 21hmov ah,01h int 21hmov ah,4Chint 21hend start
int main()
{
setlocale(LC_ALL, "russian");
std::cout << "ИБ92-вп, Бригада №3: Блинов Александр, Горелова Валерия, Медведев Михаил";
}
7.1. Разобраться с тем, в каком блоке интерфейса этой программы, какая содержится информация:
Для нас же главными здесь являются сегменты, а именно 3 сегмента и 1 префикс:
Теперь кратко о том, что происходит, если мы будем пошагово выполнять команды с помощью горячей клавиши F8.
Например, регистру “ax” даётся значение, которое указано в ассемблерном коде, а у регистра “ip” изменилось значение на размер выполненной машинной команды (смещение).
Также регистру “ds” даётся новое значение, которое тоже взято из ассемблерного кода. В последствии будет ещё так же изменён и регистр “dx”.
После определённого количества нажатий на F8, то есть выполнения команд выводится то, что мы уже не раз видели, а именно, наш текст.
Из таблицы видно, что конечные файлы L1 и L3 программ на языке ассемблер размер меньше, чем исходный код, причем программа типа COM значительно меньше. А конечный файл L2 получился немного больше исходного.
9.1. Программа с кодом общего файла Exe
Файл L1
Графический вид L1.
0000h
9.2. Программа с кодом упрощенного варианта файла .exe на основе модели памяти small.
Файл L2
Графический вид L2.
0000h
9.3. Программа с кодом варианта com программы.
Файл L3
Графический вид L3.
0000h
Вывод:
В ходе данной лабораторной работы мы, 3-я бригада, изучили основы написания кода, компиляцию и линковку программ на базе Турбо Ассемблер. Используя программу Turbo debugger научились определять адреса сегментов памяти, их размер и порядок.
Для достижения столь недостижимой цели, нам потребовалось создать файлы с расширением .ASM. Были сравнены несколько разных типов приложений на Ассемблере, тип Exe больше возможностей, но занимает больше места на диске чем файл COM.
Файл COM имеет ограничение в размер одного стека в 64кБайт. В COM файле данные располагаются в сегменте кода, а не в сегменте данных.
представить как в табличном, так и графическом вариантах.
Ход работы:
-
Запущена виртуальная машина. Смонтирована рабочая папка. Запущен NC.
-
Используя команду F7 создали каталог, в котором используя команду SHIFT+F4 созданы файлы с расширением asm
-
Используя редактор NC и команду F4 веден исходный код в три файла.
-
В файл L1.asm введен код общего файла Exe.
-
В файл L2.asm введен код упрощенного варианта файла .exe на основе модели памяти small.
mess db 'ИБ92-вп, бригада 3: Блинов Александр, Горелова Валерия, Медведев Михаил','$' ; Текст сообщения для вывода на экран.code ; Начало сегмента кодаstart:mov dx,@stack ; через регистр dx в стековый регистр ss засылаетсяmov ss,dx ; начальный адрес сегмента стекаmov dx,@datamov ds,dxmov dx, offset messmov ah,09hint 21hmov ah,01h int 21hmov ah,4Chint 21hend start
-
В файла L3.asm введен код варианта com программы.
-
Используя команду TASM и TLINK, выполнена компиляция и линковка файлов L1.asm, L2.asm, L3.asm.
-
Компиляция и линковка файла L1
-
Компиляция и линковка файла L2
-
Компиляция и линковка файла L3
-
Запущены созданные программы.
-
Программа вывода того же самого сообщения в консольном режиме на языке С++
int main()
{
setlocale(LC_ALL, "russian");
std::cout << "ИБ92-вп, Бригада №3: Блинов Александр, Горелова Валерия, Медведев Михаил";
}
-
С помощью программы Turbo debugger (TD) просмотрен ассемблерный текст для всех программ. Используя команду TD «Имя программы».
-
Просмотрен текст L1
-
Просмотрен текст L2
-
Просмотрен текст L3
7.1. Разобраться с тем, в каком блоке интерфейса этой программы, какая содержится информация:
-
Адрес (Сегмент:смещение) -
Машинный код -
Ассемблерный код.
Для нас же главными здесь являются сегменты, а именно 3 сегмента и 1 префикс:
-
cs – сегмент кода; -
ds – сегмент данных; -
ss – сегмент стека. -
PSP – префикс программного сегмента (структура данных)
-
Окно регистров (ax, bx, cx…). -
Окно флагов. -
Окно стека -
Данные программы
Теперь кратко о том, что происходит, если мы будем пошагово выполнять команды с помощью горячей клавиши F8.
Например, регистру “ax” даётся значение, которое указано в ассемблерном коде, а у регистра “ip” изменилось значение на размер выполненной машинной команды (смещение).
Также регистру “ds” даётся новое значение, которое тоже взято из ассемблерного кода. В последствии будет ещё так же изменён и регистр “dx”.
После определённого количества нажатий на F8, то есть выполнения команд выводится то, что мы уже не раз видели, а именно, наш текст.
-
Сравнение результатов выполнения 3-х программ.
| | Исходный файл (байт) | Исполняемый файл (байт) | Процентное соотношение |
| Файл L1 | 1214 | 916 | 23% |
| Файл L2 | 611 | 658 | 16,9% |
| Файл L3 | 701 | 110 | 100% |
Из таблицы видно, что конечные файлы L1 и L3 программ на языке ассемблер размер меньше, чем исходный код, причем программа типа COM значительно меньше. А конечный файл L2 получился немного больше исходного.
-
Табличный вид:
9.1. Программа с кодом общего файла Exe
Файл L1
| | Начало | Размер (байт) | Конец |
| PSP | 0С3B0h | 256 | 0С4B0h |
| Сегмент стека | 0С4B0h | 256 | 0С5B0h |
| Сегмент данных | 0С5B0h | 72 | 0C600h |
| Сегмент кода | 0C600h | 20 | 0C644h |
Графический вид L1.
0000h
| | | |
| 0C3B0h 0С4B0h | PSP (100h = 256) | 0C3B0:0000h 0C3B0:0100h |
| 0С5B0h | Сегмент стека (100h = 256) | 0С4B0:0000h 0С4B0:0100h |
| 0C621h | Сегмент данных (71h = 113) | 0С5B0:0000h 0С5B0:0071h |
| | 15 байт | |
| 0C630h 0C644h | Сегмент кода (14h = 20) | 0C630:0000h 0C630:0014h |
| | | |
9.2. Программа с кодом упрощенного варианта файла .exe на основе модели памяти small.
Файл L2
| | Начало | Размер (байт) | Конец |
| PSP | 0С3B0h | 256 | 0С4B0h |
| Сегмент кода | 0С4B0h | 25 | 0С4С9h |
| Сегмент данных | 0С4С9h | 114 | 0C53Bh |
| Сегмент стека | 0C53Bh | 256 | 0C63Bh |
Графический вид L2.
0000h
| | | |
| 0C3B0h 0С4B0h | PSP (100h = 256) | C3B0:0000h C3B0:0100h |
| 0С4С9h | Сегмент кода (19h = 25) | С4B0:0000h С4B0:0019h |
| 0C53Bh | Сегмент данных (72h = 114) | 0С4С9:0000h 0С4С9:0072h |
| 0C63Bh | Сегмент стека (100h = 256) | 0C53B:0000h 0C53B:0100h |
| | | |
9.3. Программа с кодом варианта com программы.
Файл L3
| | Начало | Размер (байт) | Конец |
| PSP | 0C3B0h | 256 | 0C4B0h |
| Область кода | 0C4B0h | 18 | 0C4C2h |
| Область данных | 0C4C2h | 113 | 0C533h |
| Область стека | - | - | - |
Графический вид L3.
0000h
| | | |
| 0C3B0h 0С4B0h | PSP (100h = 256) | 0C3B0:0000h 0C3B0:0100h |
| 0C4C2h | Область кода (12h = 18) | 0С4B0:0000h 0С4B0:0012h |
| 0C533h | Область данных (71h = 113) | 0C4C2:0000h 0C4C2:0071h |
| | | |
Вывод:
В ходе данной лабораторной работы мы, 3-я бригада, изучили основы написания кода, компиляцию и линковку программ на базе Турбо Ассемблер. Используя программу Turbo debugger научились определять адреса сегментов памяти, их размер и порядок.
Для достижения столь недостижимой цели, нам потребовалось создать файлы с расширением .ASM. Были сравнены несколько разных типов приложений на Ассемблере, тип Exe больше возможностей, но занимает больше места на диске чем файл COM.
Файл COM имеет ограничение в размер одного стека в 64кБайт. В COM файле данные располагаются в сегменте кода, а не в сегменте данных.