Лабораторный практикум
«Начала программирования на языке 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).