Файл: Структура программы на Ассемблере. Вывод текстовой информации на монитор.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
представить как в табличном, так и графическом вариантах.

Ход работы:

  1. Запущена виртуальная машина. Смонтирована рабочая папка. Запущен NC.




  1. Используя команду F7 создали каталог, в котором используя команду SHIFT+F4 созданы файлы с расширением asm





  1. Используя редактор 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 ; Конец программы


  1. Используя команду TASM и TLINK, выполнена компиляция и линковка файлов L1.asm, L2.asm, L3.asm.




    • Компиляция и линковка файла L1




    • Компиляция и линковка файла L2




    • Компиляция и линковка файла L3

Для линковки файла com требуется использование параметра /t




  1. Запущены созданные программы.




  1. Программа вывода того же самого сообщения в консольном режиме на языке С++


Код программы на С++:

#include
int main()

{

setlocale(LC_ALL, "russian");

std::cout << "ИБ92-вп, Бригада №3: Блинов Александр, Горелова Валерия, Медведев Михаил";

}


  1. С помощью программы Turbo debugger (TD) просмотрен ассемблерный текст для всех программ. Используя команду TD «Имя программы».

    • Просмотрен текст L1




    • Просмотрен текст L2



    • Просмотрен текст L3



7.1. Разобраться с тем, в каком блоке интерфейса этой программы, какая содержится информация:



  1. Адрес (Сегмент:смещение)

  2. Машинный код

  3. Ассемблерный код.

Для нас же главными здесь являются сегменты, а именно 3 сегмента и 1 префикс:

  • cs – сегмент кода;

  • ds – сегмент данных;

  • ss – сегмент стека.

  • PSP – префикс программного сегмента (структура данных)

  1. Окно регистров (ax, bx, cx…).

  2. Окно флагов.

  3. Окно стека

  4. Данные программы

Теперь кратко о том, что происходит, если мы будем пошагово выполнять команды с помощью горячей клавиши F8.

Например, регистру “ax” даётся значение, которое указано в ассемблерном коде, а у регистра “ip” изменилось значение на размер выполненной машинной команды (смещение).

Также регистру “ds” даётся новое значение, которое тоже взято из ассемблерного кода. В последствии будет ещё так же изменён и регистр “dx”.

После определённого количества нажатий на F8, то есть выполнения команд выводится то, что мы уже не раз видели, а именно, наш текст.


  1. Сравнение результатов выполнения 3-х программ.




Исходный файл (байт)

Исполняемый файл (байт)

Процентное соотношение

Файл L1

1214

916

23%

Файл L2

611

658

16,9%

Файл L3

701

110

100%

Из таблицы видно, что конечные файлы L1 и L3 программ на языке ассемблер размер меньше, чем исходный код, причем программа типа COM значительно меньше. А конечный файл L2 получился немного больше исходного.



  1. Табличный вид:

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 файле данные располагаются в сегменте кода, а не в сегменте данных.