Файл: Структура программы на Ассемблере. Вывод текстовой информации на монитор.docx
Добавлен: 10.11.2023
Просмотров: 154
Скачиваний: 12
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
_______________________________________________________________________
ОТЧЕТ
За лабораторную работу № 3
Тема:
«Структура программы на Ассемблере.
Вывод текстовой информации на монитор»
Дисциплина «Вычислительные машины и системы»
Выполнил:
студент группы ИБ-92вп, Кадамов Ш.Ф.
«» ______ 2022 г. ___________/ Кадамов Ш.Ф.
Принял: П.А. Волынкин
«» ______ 2022 г. ___________/П.А. Волынкин
Санкт-Петербург
2022
Цель
Целью настоящей работы является приобретение навыков работы:
- с простейшими командами ввода/вывода на уровне DOS;
- с системой программирования "Турбо Aссемблер";
- с отладчиком TD для ассемблера;
Задача
1. Запустить DOSBOX. Смонтировать виртуальный диск к папке C:\TASM
2. Войти в виртуальный диск.
3. Запустить NC
4. Создать файл с расширением asm
5. Набрать исходный текст программы (варианты 1 и 3 из п.3) во встроенном текстовом редакторе NC, сохранить в файле. Текст выводимого сообщения для каждой бригады должен быть свой – содержать имена и фамилии студентов в бригаде (латинскими и русскими буквами в кодировке 866), а также номер группы и номер бригады.
6. Произвести компиляцию и линковку программы.
6.1. Компиляция
tasm *.asm à *.obj
6.2. Линковка (связывание)
tlink *.obj à *.exe
7. Запустить программу на выполнение.
8. Написать программу вывода того же самого сообщения в консольном режиме на одном из языков высокого уровня (Delphi 1.0, Turbo Pascal, Turbo C, С++ и т.д.).
9. С помощью программы TD просмотреть и распечатать ассемблерный текст для всех программ. Разобраться с тем, в каком блоке интерфейса этой программы, какая содержится информация.
10. Сравнить результаты выполнения трех-четырех вариантов по размеру исходного и исполняемого файла. Сделать выводы.
11. По исходному коду и информации от TD определить:
- Размеры всех трех сегментов и PSP
- Начальные и конечные адреса всех трех сегментов, а также префикса программы.
- Информацию по начальным, конечным адресам и размеру всех сегментов и PSP
представить как в табличном, так и графическом вариантах.
Ход работы:
-
Запущена виртуальная машина. Смонтирована рабочая папка. Запущен NC.
-
Используя команду F7 создали каталог, в котором используя команду SHIFT+F4 созданы файлы с расширением asm
-
Используя редактор NC и команду F4 веден исходный код в три файла.
-
В файл L1.asm введен код общего файла Exe.
Код файла L1:
SSEG segment stack ;Сегмент стека
db 256 dup(0)
SSEG ends
DSEG segment ;Сегмент данных
mess 'db ИБ92-вп, бригада 3: Блинов Александр, Горелова Валерия, Медведев Михаил','$' ; Текст сообщения для вывода на экран
DSEG ends
CSEG segment ;Сегмент кода
assume cs:CSEG,ds:DSEG,ss:SSEG
begin:
mov ax, DSEG ; через регистр ax в регистр dx засылается начальный
mov ds,ax ; адрес сегмента данных
mov ah,09h ; согласно протоколу в регистр ah засылается функция
; вывода строки на экран до '$'
mov dx,offset mess ; теперь сообщение начинается с адреса ds:dx
int 21h ; согласно протоколу с адреса ds:dx будет выводится
; последовательность байт до тех пор пока не встретится
; символ '$'
mov ah,01h ; организация точки останова
int 21h ; (программа прекращает выполнение кода до нажатия
; любой клавиши)
mov ah,4ch ; обработка окончания
int 21h ; программы
CSEG ends ; завершение сегмента кода
end begin Завершение программы
-
В файл L2.asm введен код упрощенного варианта файла .exe на основе модели памяти small.
Код файла L2:
.8086 ; Набор команд для процессора не ниже 8086
.MODEL small ; Модель памяти
.stack 100h ; Размер стека 256 байт
.data ; Начало сегмента данных
mess db 'ИБ92-вп, бригада 3: Блинов Александр, Горелова Валерия, Медведев Михаил','$' ; Текст сообщения для вывода на экран
.code ; Начало сегмента кода
start:
mov dx,@stack ; через регистр dx в стековый регистр ss засылается
mov ss,dx ; начальный адрес сегмента стека
mov dx,@data
mov ds,dx
mov dx, offset mess
mov ah,09h
int 21h
mov ah,01h
int 21h
mov ah,4Ch
int 21h
end start
-
В файла L3.asm введен код варианта com программы.
Код файла L3:
; программа .сом выводит на экран сообщение Privet
; и завершается после нажатия Enter
.model tiny ; Модель памяти для СОМ
.code ; Начало сегмента кода
org 100h ; Начальное значение счетчика - 100h
start:
mov ah,09
mov dx,offset mess
int 21h
mov ah,01h
int 21h
ret ; Завершение СОМ-программы
mess db 'ИБ92-вп, бригада 3: Блинов Александр, Горелова Валерия, Медведев Михаил','$' ; Строка для вывода
; с возвратом каретки, переводом строки,
; и признаком конца строки
end start ; Конец программы
-
Используя команду TASM и TLINK, выполнена компиляция и линковка файлов L1.asm, L2.asm, L3.asm.
-
Компиляция и линковка файла L1
-
Компиляция и линковка файла L2
-
Компиляция и линковка файла L3
Для линковки файла com требуется использование параметра /t
-
Запущены созданные программы.
-
Программа вывода того же самого сообщения в консольном режиме на языке С++
Код программы на С++:
#include
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 файле данные располагаются в сегменте кода, а не в сегменте данных.