Приложение 1. Пример сегмента данных программы.
Лабораторная работа № 1 Типы данных Содержание работы - цель работы - введение - типы данных процессора Intel - описание типов данных в Ассемблере Intel - пример программы - порядок выполнения работы - содержание отчета - варианты заданий - заключение - приложения Цель работы Целью работы является знакомство с типами данных процессора и их описанием в языке Ассемблера. Введение Компьютер является средством обработки и хранения информации. Информация представляется как данные, хранящиеся в устройствах компьютера в виде состояний физических элементов. Общепринятым способом кодирования данных в машине является двоичное представление, когда один бит информации хранится в элементарной ячейке с двумя стабильными состояниями, обозначаемыми как «0» и «1» или же «ЛОЖЬ» и «ИСТИНА». В зависимости от типа устройства различают расположение данных в регистрах процессора, в памяти (ОЗУ или ПЗУ) или в регистрах периферийных устройств (портах). В качестве единицы измерения информации используется, кроме бита, байт (8 бит). Исторически сложилось так, что аппаратные ресурсы компьютера (процессор, шина данных, память) имели разрядность, кратную восьми (8-, 16-, 32-, 64-разрядные системы). Наименьшей адресуемой в памяти единицей информации является один байт. Таким образом, информация (данные) при написании программ рассматривается как наборы байтов. Типы данных процессора Intel Физически адресуемыми и обрабатываемыми единицами данных являются данные разрядности 8, 16, 32, 64. Они получили названия, соответственно: - байт (byte) – 8 бит, - слово (word) – 16 бит, - двойное слово (double word) – 32 бита, - учетверенное слово (quad word) – 64 бита.
Арифметические сопроцессоры (FPU), первым представителем которых был 80287, а сейчас они встроены в один чип с центральным процессором (CPU), могут хранить и обрабатывать числа в форматах с плавающей точкой двойной точности и упакованном BCD (Binary coded decimal) (80 бит или 20 десятичных знаков). Для их описания используется тип: - десять байт (ten bytes) – 80 бит. В арифметике принято записывать числа в нотации, когда старшие цифры располагаются слева, а младшие справа.
Для единиц данных, больших, чем 1 байт, нумерация байтов выполняется, так же, как битов в байте, от младшего к старшему справа налево:
Байт
Слово
Двойное слово
Учетверенное слово
Десять байт Описание типов данных в Ассемблере Intel Для описания типов данных используются директивы резервирования и инициализации памяти: - DB – 1 байт – 8 бит, - DW – 2 байта – 16 бит, - DD – 4 байта – 32 бита, - DQ – 8 байт – 64 бита, - DT – 10 байт – 80 бит. Примечание. Дополнительными директивами являются директивы, описывающие данные длиной 6 байт (для дальнего указателя – 2 байта селектор и 4 байта смещение):
- DF – 6 байт – 48 бит, - DP – 6 байт – 48 бит, Примеры: The_byte DB 5; 0... 255 (28-1) The_word DW 3000; 0... 65 535 (216-1) The_dword DD 12345678; 0... 4 294 967 295 (232-1) The_qword DQ 1122334455667788; 0... (264-1) The_ptr DP 112233445566; 0... (248-1) При резервировании памяти можно задавать различное количество элементов данных, инициализируя их значения или не инициализируя, присваивая имя или не присваивая. Для описания символов в коде ASCII Ассемблер допускает записывать значения байт в кавычках. Примеры: DB?; один байт без инициализации и имени DB 5, 0Fh; два байта без имени с инициализацией DB 5,?,7; три байта, два с инициализацией, один – без Five_bytes DB 0,0,0,0,0; область 5 байт, значения всех нулевые The_ptr DB 1122334455; 0... (248-1) Str DB ‘Строка текста’; 13 байт DB ‘5’; один байт, равный 53 или 35h или ‘5’ DB 5; один байт, равный 5 При заполнении памяти повторяющимися значениями используется оператор dup: Примеры: Buffer DB 200h dup (0); буфер 512 байт инициализирован нулями. String_buf DB 78 dup (‘ ‘); буфер приема строки заполнен пробелами. К одним и тем же ячейкам памяти можно обращаться как к данным различных типов. Один из способов описания таких ячеек памяти предполагает использование директивы LABEL. Примеры: Bytes label byte Words label word DB 0,1,2,3,4,5; определены шесть байт или три слова ; слова равны: 0100h, 0302h, 0504h Обращение к ячейкам как к данным нужного типа можно выполнять и без описания их в директиве LABEL, если явно указать тип данных в команде, используя оператор PTR. Примеры: b_or_w db 1,2,3,4; данные … mov al, byte ptr b_or_w; al:= 01 mov ax, word ptr b_or_w; ax:= 0201h mov al, byte ptr b_or_w+3; al:= 04 mov ax, word ptr b_or_w+2; ax:= 0403h
w_or_b dw 0201h,0403h; те же данные … mov al,byte ptr w_or_b+3; al:= 04 mov ax,w_or_b+2; ax:= 0403h Пример программы Ниже приведен пример программы на языке Ассемблер с различными типами данных, описанными в сегменте данных. Сегмент данных выделен полужирным шрифтом.
На первой странице листинга программы, приведенной ниже, можно увидеть результаты трансляции рассматриваемой программы. Описанные в исходном модуле данные выделены.
На второй странице листинга приведена таблица символических имен с указанием их адресов. Так, адрес переменной x4 равен 0017h, т. е. находится в 23-ей ячейке относительно начала сегмента данных, который находится в группе DGROUP.
Вид модуля в отладчике AFD показан на рис.1. Выделенная внизу область – это сегмент данных программы. Адреса данных складываются из двух шестнадцатеричных чисел: в левом столбце и верхней строке над данными. Так, начальный байт имеет адрес 0000h, а его значение равно 42h, или ‘B’ лат., первый символ строки String1 имеет адрес 0030h + 5h = 0035h, а его значение равно 53h или ‘S’ лат. Справа от шестнадцатеричного дампа памяти расположено ASCII-представление этих данных (символьное представление, удобное для чтения текстовых констант). Рисунок 1 Сегмент данных в модуле приведен на рис.2. Показаны зарезервированные в исходном модуле области данных. Обратное по отношению с записью в исходном модуле расположение байтов – характерный эффект, связанный с представлением ячеек памяти в окне отладчика слева направо (от младших к старшим). Так, двойное слово x3, значение которого инициализировано шестнадцатеричной константой 12345678h, занимает байты с адресами 13, 14, 15, 16. При этом две младшие цифры числа (7 и 8) занимают младший байт с адресом 13, следующие две цифры (5 и 6) занимают следующий байт с адресом 14 и т.д. Строка текста в окне отладчика читается так же, как и в исходном модуле, т.к. расположение текста в памяти – от начала текста в младших адресах к концу текста в старших адресах – совпадает с естественным расположением читаемого текста слева направо (см. рис.1). Байты с адресами 3E, 3F, значения которых равны нулю, не инициализируются программой. Байты с адресами 40-5F занимают область, зарезервированную с использованием оператора dup. Рисунок 2 Вид модуля в отладчике TurboDebuger 5.0 показан на рис.3.
Рисунок 3
Порядок выполнения работы 1. Создайте исходный модуль ggnn_dt1.asm, содержащий сегмент данных с переменными согласно варианту задания. Здесь gg – две последние цифры номера группы, nn – номер в группе. 2. Выполните трансляцию модуля в ggnn_dt1.exe 3. Посмотрите значения и расположение Ваших данных в листинге программы.
4. Загрузите исполняемый модуль в отладчик afd.exe или td.exe. 5. Просмотрите в окне дампа памяти отладчика все объявленные переменные. 6. Результаты отразите в отчете. Содержание отчета 1. Исходный текст программы с сегментом данных согласно задания. 2. Фрагменты листинга программы с описанными данными. 3. Фрагмент окна отладчика с сегментом данных, в котором указанные данные имеют определенные в исходном модуле значения. 4. Словесное описание определенных в исходном модуле данных, фрагмента листинга, сегмента данных в окне отладчика, анализ полученных результатов. 5. Выводы. Варианты заданий
Примечание. Можно добавить произвольные данные по своему усмотрению. Заключение При написании программы на Ассемблере следует внимательно относиться к резервированию и инициализации памяти (данных). Следует иметь в виду, что к одним и тем же ячейкам можно обращаться как к данным различного типа, но это желательно предусмотреть при их резервировании. Не следует использовать для переменных типы данных, не соответствующие им по сути, по применяемой обработке, по диапазону значений. Литература 1. Абель П. Язык Ассемблера для IBM PC и программирования. – М.: Высш. шк., 1992. – 447 с. 2. Коффрон Дж. Технические средства микропроцессорных систем. М. Мир 1983г. - 344 с. 3. Коффрон Дж., В. Лонг. Расширение микропроцессорных систем. М. Машино-строение 1987г. - 320 с. 4. Морису, Э.Т. Есикава. Микро ЭВМ за три дня. М. Мир 1981г. - 194 с. 5. Уокерли Дж.. Архитектура и программирование микро ЭВМ. В 2-х кн. М. Мир 1984г. кн.1 - 486 с., кн. 2 - 341 с. 6. Гивонэ Д., Россер Р.. Микропроцессоры и микрокомпьютеры. Вводный курс. М. Мир 1983г. - 484 с. 7. Гилмор И.. Введение в микропроцессорную технику. М. Мир 1984г. - 334 с. 8. Лю Ю - Чжен, Гибсон Г.. Микропроцессоры семейства 8086/8088. М. Радио и связь 1987г. - 512с. 9. Морс С.П., Алберт Д.Д.. Архитектура микропроцессора 80286. М. Радио и связь 1990г. 10.Григорьев В.Л.. Микропроцессор i486. Архитектура и программирование (в 4-х книгах). – М., ГРАНАЛ, 1993. – с. 346 (кн.1), с. 382 (кн.2-4). 11.Григорьев В.Л.. Программирование однокристальных микропроцессоров. М. Энергоатомиздат 1987г. - 288 с. 12.Дао Л.. Программирование микропроцессора 8088. М. Мир 1988г. - 357 с. 13.Брамм П., Брамм Д.. Микропроцессор 80386 и его программирование. М. Мир 1990г. - 448 с. 14.Смит Б. Э., Джонсон М. Т.. Архитектура и программирование микропроцессора INTEL 80386 М. ТОО “Конкорд” 1992 г. 326 с. 15.Майко Г.В. Ассемблер для IBM PC. М.: Бизнес - Информ, Сирин 1997 г. - 212 с. 16.Пильщиков В.Н. Программирование на языке ассемблера IBM PC. М.: ДИАЛОГ - МИФИ, 1997. - 288 с.
Приложения Приложение 1. Пример сегмента данных программы. Еще один пример описания данных различных типов. В исходном модуле определен сегмент данных: .data db 'Begin of DATAseg'
z1 db 12h z2 dw 12h z3 dd 12h z4 dq 12h z5 dt 12h z6 dp 12h z7 df 12h
s1 db 'String 1' db '*' db? db?
b1 db 10h dup (12h)
В листинге сегмент данных получен в следующем виде:
7 0000 42 65 67 69 6E 20 6F+ db 'Begin of DATAseg' 8 66 20 44 41 54 41 73+ 9 65 67 11 0010 12 z1 db 12h 12 0011 0012 z2 dw 12h 13 0013 00000012 z3 dd 12h 14 0017 0000000000000012 z4 dq 12h 15 001F 00000000000000000012 z5 dt 12h 16 0029 000000000012 z6 dp 12h 17 002F 000000000012 z7 df 12h 19 0035 53 74 72 69 6E 67 20+ s1 db 'String 1' 20 31 21 003D 2A db '*' 22 003E?? db? 23 003F?? db? 25 0040 10*(12) b1 db 10h dup (12h)
В окне отладчика сегмент данных имеет следующий вид:
0 1 2 3 4 5 6 7 8 9 A B C D E F | DS:0000 42 65 67 69 6E 20 6F 66 20 44 41 54 41 73 65 67 |Begin of DATAseg DS:0010 12 12 00 12 00 00 00 12 00 00 00 00 00 00 00 12 |................ DS:0020 00 00 00 00 00 00 00 00 00 12 00 00 00 00 00 12 |................ DS:0030 00 00 00 00 00 53 74 72 69 6E 67 20 31 2A 00 00 |.....Str ing 1*.. DS:0040 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 |................
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|