- •«Национальный исследовательский ядерный университет «мифи»
- •Озерский технологический институт-филиал нияу мифи
- •Кафедра: Электроники и автоматики
- •Лабораторная работа №2
- •Структура программы на ассемблере. Представление простых типов данных. Цель работы:
- •Теоретические сведения
- •Выполнение работы.
- •Контрольные вопросы.
Выполнение работы.
1. Создаём каталог 1_IT-30.
2. Помещаем в него файлы TASM.exe, TD.exe, TLINK.exe, RTM.exe и текстовый документ MS-DOS PRG_5_2.txt с кодом программы.
3. Запускаем на трансляцию нашу программу командной строкой «tasm.exe /zi prg_5_2,,,»
4. Просматриваем листинг программы:
5. Создаём исполняемый модуль PRG_5_2.ехе командной строкой «tlink.exe /v prg_5_2.obj» :
6. Запускаем отладчик командной строкой «td prg_5_2.ехе» :
7. Настроив отладчик на адрес сегмента данных, вызываем окно «Dump», в котором переходим на нужный адрес памяти ds:0000. С него будет выводиться информация в окне «Dump»:
Символы в сегменте данных, входящие в строку «Message», как раз начинаются с адреса ds:0000. Данная строка имеет размерность 34 байта:
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
Символическое имя «perem_1» имеет адрес ds:0024 в сегменте данных, в нём хранится байт FF:
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
Байты, входящие в слово с символическим именем «perem_2», в памяти расположены по принципу «младший байт по младшему адресу», в отличие от формы записи в тексте программы 3A7Fh:
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
Следом за этими двумя байтами идут байты поля «perem_3» по такому же принципу: от младшего 7А до старшего F5. При том в листинге видно, что под имя «perem_3» зарезервировано ровно 4 байта памяти, благодаря прописанной директиве резервирования и инициализации данных dd.
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
*************************
perem_3 dd 0f54d567ah
*************************
В поле «mas» мы видим идущие подряд 10 символов-пробелов (с ASCII-кодом 20). Это достигнуто благодаря оператору-счётчику dup, прописанным перед ним числом 10 и символу пробела в скобках, взятого в кавычки:
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
*************************
mas db 10 dup (« »)
*************************
Схожим образом обстоит дело со следующей строкой «pole_1», где вместо десяти пробелов прописаны пять пустых байтов (со значением 00). Символ незаполненного байта в листинге - ?:
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
*************************
Pole_1 db 5 dup («? »)
*************************
Директивы «adr» и «adr_full» формируют в памяти значения адресов тех переменных, чьи имена были указаны в качестве операндов. В зависимости от директивы, применяемой для получения такого адреса, формируется либо полный адрес (директива adr_full и dd) в виде двух байтов сегментного адреса и двух байтов смещения, либо только смещение (директива adr и dw).
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных пр
*************************
adr dw perem_3
adr_full dd perem_3
*************************
Красным выделено смещение от начала поля «perem_3» - ячейка 0027 (вновь по принципу «младший байт по младшему адресу») в директиве adr в виде двух байтов.
Бордовым выделены два байта смещения 27 00 и два байта полного адреса «perem_3» директивы adr_full.
Строка «fin»: Конец сегмента данных программы $
Dump
ds: 0000 87 A0 AF E3 E1 E2 A8 E2 Запустит
ds: 0008 A5 20 ED E2 E3 20 AF E0 е эту пр
ds: 0010 AE A3 E0 A0 AC AC E3 20 ограмму
ds: 0018 A2 20 AE E2 AB AO A4 E7 в отладч
ds: 0020 A8 AA A5 24 FF 7F 3A 7A ике$ :z
ds: 0028 56 4D F5 20 20 20 20 20 VMI
ds: 0030 20 20 20 20 20 00 00 00
ds: 0038 00 00 27 00 27 00 60 0B ‘ ‘ B
ds: 0040 8A AE AD A5 E6 20 E1 A5 Конец се
ds: 0048 A3 AC A5 AD E2 A0 20 A4 гмента д
ds: 0050 A0 AD AD EB E5 20 AF E0 анных программы $
ds: 0058 AE A3 EO A0 AC AC EB 20
ds: 0060 24 00 00 00 00 00 00 00
Вывод: Изучили директивы описания данных простых типов; с помощью окна Dump отладчика tdebug.exe просмотрели область памяти, содержащую сегмент данных программы.
