Лабораторный практикум

«Начала программирования на языке Assembler»

доцента кафедры ИВТ Гродненского госуниверситета

канд. техн. наук Ливак Елены Николаевны

 

Практическая  работа

разработка программ в пакете TASM

Сегмент данных программы

 

Цели практической работы:

-     научиться создавать программы на языке Assembler в пакете TASM;

-     научиться использовать отладчик;

-     изучить структуру программы на языке Assembler;

-     научиться задавать (описывать) данные;

-     изучить, как выглядит сегмент данных программы в памяти компьютера;

-     разобраться с принципом формирования физического адреса «сегмент : смещение» (segment:offset).

 

Напомним, что микропроцессоры Intel требуют следования данных в памяти по принципу: младший байт по младшему адресу.

 

Порядок выполнения работы и методические указания

 

1.   Создайте свою рабочую папку, например, AsmWork

2.   Поместите (скопируйте из папки Т:\TASM\BIN или D:\BP\BIN) в рабочую папку необходимые для получения исполняемого (загрузочного) модуля файлы из пакета TASM:

tasm.exe

tlink.exe

rtm.exe

dpmi16bi.ovl

dpmiload.ovl

dpmimem.dll

и  отладчик Turbo Debugger - td.exe

 

3.   Введите текст программы-примера (скопируйте) и сохраните в рабочей папке в файле с именем Primer1.asm

 

; Программа выводит на экран сообщение «Начало сегмента данных»

; Точкой с запятой обозначаются комментарии

masm

model    small

.stack   100h

.data

stroka   db   'Начало сегмента данных','$'

perem1   db   0ffh

perem2   dw   3a7fh

perem3   dd   0f54d567ah

mas       db  10 dup (' ')

pole     db   5 dup (?)

adr       dw  perem3

adr_full dd   perem3

fin      db   'Конец сегмента данных программы $'

.code

start:

                       ; стандартное начало программы

mov ax,@data

     mov  ds,ax

          ; вывод строки с именем stroka на экран

mov ah,09h

     mov  dx,offset stroka

     int  21h

          ; стандартное завершение программы

mov ax,4c00h

           int  21h

end  start

 

4.   Запустите на трансляцию программу командной строкой

                        tasm /zi primer1.asm, , ,

 

Просмотрите файл листинга. Исправьте ошибки, если они есть. Если ошибки исправлялись, необходимо заново оттранслировать исходный модуль.   

 

5.   Создайте загрузочный модуль, запустив программу tlink командной строкой

                        tlink /v primer1.obj

 

В результате вы получите загрузочный модуль Primer1.exe

 

6.   Запустите программу на выполнение.

Вы увидите сообщение «Начало сегмента данных». Вывод этого сообщения и есть результат работы программы.

 

7.   Переведите выводимую строку на английский язык, исправьте значение выводимой строки (необходимо заново оттранслировать исходный модуль и создать новый загрузочный модуль).

 

8.   Теперь следует посмотреть, как выглядит в памяти сегмент данных программы.

Для этого необходимо запустить программу в отладчике Turbo Debugger  командной строкой

                        td primer1.exe

В результате откроется окно Module с исходным текстом программы.

Для того, чтобы просмотреть область памяти, необходимо открыть окно Dump (из меню выбрать режимы View / Dump).

Для просмотра области памяти, содержащей сегмент данных, необходимо настроить окно Dump на адрес начала сегмента данных.

Этот адрес должен содержаться в сегментном регистре DS. Но (!!!) перед началом выполнения программы  адрес в DS не соответствует началу сегмента данных. Первые две команды программы производят загрузку физического адреса сегмента данных в регистр DS. Следовательно, для того, чтобы просмотреть содержимое сегмента данных, можно остановить выполнение программы после этих двух команд.

Итак, необходимо перевести отладчик в пошаговый режим работы с помощью клавиш F7 или F8

и выполнить только две первые команды (два раза нажать F8). После этого курсор выполнения (в виде треугольника) должен указывать на третью команду.

Теперь можно смотреть дамп памяти (открыть окно Dump).

 

9.   В дампе памяти для программы видны данные сегмента в двух представлениях: шестнадцатеричном и символьном. Видно, что по смещению 0000 расположены символы, входящие в строку stroka. После нее следует байт, имеющий в сегменте данных символическое имя perem1, содержимое этого байта offh.

Теперь обратите внимание на то, как размещены в памяти байты, входящие в слово, обозначенное символическим именем perem2. Сначала следует байт со значением 7fh, а затем со значением 3ah. Как видите, в памяти действительно сначала расположен младший байт значения, а затем старший. 

 

Оставшуюся часть сегмента данных вы можете теперь проанализировать самостоятельно или с помощью преподавателя.

 

Задания

1.   Проанализируйте размещение байтов для поля, обозначенного символическим именем perem3.

2.   Разберитесь со значением байтов, соответствующих символическим именам adr и adr_full.

3.   Проанализируйте остальную часть сегмента данных.

4.   Измените программу так, чтобы на экран выводилась строка «Конец сегмента данных».

5.   Опишите в сегменте данных переменные со значениями 10, 100, 1000, 10000. Задайте правильный размер символических имен (переменных). Символические имена adr и adr_full оставьте без изменения.

6.   Найдите значения Ваших переменных в дампе сегмента данных.

7.   Определите смещение каждой переменной и ее полный физический адрес.

8.   Проверьте себя, сравнив полученное значение для perem3 со значением переменной adr, записанным в сегменте данных.

9.   Проверьте полный физический адрес переменных, сравнив значение адреса сегмента данных, записанного как значение соответствующего байта переменной adr_full, со значением регистра DS в окне Registry (из меню выбрать режимы View / Registry).