
- •1.Техническое задание
- •1.1.Исходные данные
- •1.2.Пример выходныx данныx.
- •2.Теоретические сведения
- •3.Описание инструментов
- •3.1.Visual Studio и расширения
- •4.Подход к решению задачи
- •Методы классов
- •5.Описание структур
- •6.Схема вызовов функций
- •7.Резултаты работы программы
- •8.Вывод
- •9.Текст программы
Федеральное агентство по образованию
Государственное образовательное учреждение высшего профессионального образования
«Ижевский государственный технический университет»
кафедра «Программное обеспечение»
Отечет по лабораторной работе №2
по дисциплине «Операционные системы»
на тему «Проектирование Ассемблера: создание объектного файла»
Вариант №15
Выполнил
Студент гр. 5-78-10 Никитин А.В.
Принял Тарасов В.Г.
Ижевск 2012
1.Техническое задание
Спроектировать ассемблер для команд заданного вида.
Требуется разработать:
систему признаков для фиксации результатов обработки операндов, таблицу машинных операций;
алгоритмы анализа и синтеза машинных операций;
Сформировать листинг для этого потока команд для случая 32-разрядных операндов
сформировать объектный файл для Windows для этого потока команд для случая 32-разрядных операндов.
1.1.Исходные данные
Исходные данные содержат команды вида:
jmp start
dw ?
…
dw ?
start:
МНЕМА r
МНЕМА mem
…
ret
Здесь операнд в памяти (mem) может быть задан :
[EBX+EDI], [EBX+EDI], [EBX], [EBP+EDI] – для 32 разрядных регистров.
Операнд в памяти может быть одним из типов ”word ptr”,”dword ptr”.
r – регистр общего назначения. Входные данные считываются из файла содержащего команды написанные в соответствии с правилами ассемблера. Используются 16 и 32 разрядные регистры.
1.2.Пример выходныx данныx.
Входной файл «1.asm» содержит:
CSEG segment
jmp start
dw 5
dw 40
start:
push sp
pop ax
pop eax
push word ptr [ebx]
push dword ptr [ecx+eax]
pop bx
ret
CSEG ends
End
П
ример
выходных данных для указанных команд:
2.Теоретические сведения
Описание записей объектного файла
THEADR – заголовочная запись модуля. Поле T-module name содержит имя модуля.
Формат записи:
______________________///____________
│ rec │ record │ T-module │ chk │
│ typ │ length │ name │ sum │
│ 80H │ │ │ │
│_____│___________│___///_____│_____│
LNAMES – запись списка имен. Содержит список имен, которые последующие записи SEGDEF и GRPDEF могут использовать в качестве имен сегментов, классов и/или групп.
Формат записи:
______________________///____________
│ rec │ record │ │ chk │
│ typ │ length │ name │ sum │
│ 96H │ │ │ │
│_____│___________│___///_____│_____│
│___rpt_____│
Порядок записей LNAMES в модуле и порядок имен в записи LNAMES составлен так, что каждое имя имеет свой номер (1, 2, 3 и т.д.), используемый в качестве индекса имени в полях Group name index, Class name index и Segment name index записей SEGDEF и GRPDEF.
Имя, указываемое в поле name, может иметь и нулевую длину.
SEGDEF – запись определения сегмента. Индекс сегмента может принимать значения от 1 до 32767 и используется в других записях для ссылки на определенный ЛСЕГ. Нумерация индексов определяется последовательностью появления в объектном файле записей SEGDEF.
Ф
ормат
записи:
а) segment attr
Это поле содержит информацию о различных атрибутах сегмента.
-
Байт ACBP имеет следующий формат:
Битовое поле А (выравнивание) указывает атрибут выравнивания ЛСЕГ:
А=0 - SEGDEF описывает абсолютный ЛСЕГ
A=1 - SEGDEF описывает перемещаемый ЛСЕГ, выровненный на границу байта.
A=2 - SEGDEF описывает перемещаемый ЛСЕГ, выровненный на границу слова.
A=3 - SEGDEF описывает перемещаемый ЛСЕГ, выровненный на границу параграфа.
A=4 - SEGDEF описывает перемещаемый ЛСЕГ, выровненный на границу страницы (256 байт).
Если А=0, то поля Frame number (номер фрагмента) и offset (смещение) присутствуют. Сборщик Microsoft linker поддерживает использование абсолютных сегментов только для адресации, например, для определения стартового адреса ПЗУ и определения символических имен вместо адресов ПЗУ. Сборщик игнорирует любые данные, принадлежащие абсолютному сегменту, и выводит предупреждение, если абсолютные сегменты определены для программ, запускаемых в защищенном режиме.
Битовое поле С (сочетание) определяет атрибут сочетания ЛСЕГ. Для абсолютных сегментов С равно нулю. Для перемещаемых сегментов, поле С кодирует способ сочетания сегментов (0,1,2,3,4,5,6 и 7). Для интерпретации этого атрибута необходимо предварительно рассмотреть принципы сочетания логических сегментов. Допустим, например, что X и Y это логические сегменты, а Z это логический сегмент, получаемый в результате комбинации X и Y. Пусть LX и LY это длины соответственно Х и Y, a MXY это их общая длина. Пусть G это промежуток между Х и Y (определяется атрибутом выравнивания), а LZ это длина Z (сумма LХ, LY и промежутка между ними).
Пусть теперь dx (0<dx<LX) это смещение какого либо байта в Х, и, аналогично, dy это смещение в Y. Тогда атрибут сочетания С может быть представлен в виде таблицы, где dx' и dy' это смещения в Z, байтов, имеющих смещения в Х и Y, соответственно dx и dy:
______________________________________________________
С LZ dx' dy'
______________________________________________________
2 LX+LY+G dx dy+LX+G "Public"
5 LX+LY+G dx dy+LX+G "Stack"
6 MXY dx dy "Common"
______________________________________________________
Если С=0, то перемещаемый ЛСЕГ не может сочетаться. Значения 1 и 3 не определены. С=4 и С=7 тоже самое, что и С=2.
Бит В при установке в единицу означает, что длина сегмента точно 64К (65536), при этом поле Segment length должно содержать ноль.
Бит Р всегда равен нулю.
- Поля Frame number и Offset (номер фрагмента и смещение) предназначены только лишь для указания адреса абсолютного сегмента в MAS (А=0). Величина смещения может принимать значения от 0 до 15 включительно. Если значение смещения превышает 15, то необходимо увеличить номер фрагмента.
б) segment length
Это поле содержит длину сегмента в байтах. Длина может равняться нулю. В этом случае сегмент не удаляется из модуля, т.к. для указания длины сегмента, равной 64К, вы должны использовать бит В поля АСВР в поле segment attr, а описываемое поле сбросить в ноль.
в) segment name index
Имя сегмента это имя, которое программист или транслятор присваивает сегменту, например, code, data, modulename-code, taxdata или stack. Описываемое поле содержит индекс имени сегмента, т.е. указывает имя сегмента его индексом в списке имен записи LNAMES.
г) class name index
Имя класса это имя, которое программист или транслятор присваивает сегменту. Если таковое не присвоено, то его длина равна нулю. Имя класса дает программисту "рычаг" управления построением сегментов в MAS, например, red, white, blue; или rom, fastram, displayram. Описываемое поле содержит индекс имени класса, т.е. указывает имя класса его индексом в списке имен записи LNAMES.
д) overlay name index
Содержит индекс имени наложения, т.е. указывает имя наложения его индексом в списке имен записи LNAMES. Имя наложения это имя, которое транслятор и/или сборщик присваивает, по указанию программиста, сегменту. Длина этого имени может равняться нулю.
Примечание: сборщики Microsoft версий 3.00 и позже игнорируют имя наложения. Это имя принимается во внимание стандартным сборщиком MS-DOS.
LEDATA – логическaя упорядоченнaя зaпись дaнных. Содержит связные дaнные, из которых сборщик зaтем строит чaсть обрaзa пaмяти микропроцессорa.
Формат записи:
__________________///__________________________
|rec| record |segment | enumerated |dat|chk|
|typ| length | index | data | |sum|
|A0H| | | offset | | |
|___|_________|___///____|____________|___|___|
|rpt|
|___|
segment index. Это поле (индекс сегментa) не может быть нулевым и содержит индекс, ссылaющийся нa одну из зaписей SEGDEF (Индексация сегментов начинается с единицы).
enumerated data offset. Это поле (смещение упорядоченных дaнных) содержит смещение упорядоченных дaнных относительно ЛСЕГ, укaзaнного индексом сегментa, т.е. смещение первого бaйтa данных из поля dat.
dat. Это поле содержит до 1024 последовательных байт перемещаемых или абсолютных данных, в противном случае необходимо записать данные в несколько записей LEDATA.
chksum. Последним полем в кaждой зaписи является поле chksum, содержaщее дополнение до двух суммы (по модулю 256) всех остaльных бaйт в зaписи.
MODEND – конечная запись объектного модуля. Эта запись предназначена для указания сборщику конца модуля, а также для сообщения ему, содержит ли данный модуль стартовый адрес всей собираемой программы.
Формат записи:
__________________///_______
│rec│record│mod│start │chk│
│typ│length│typ│address│sum│
│8AH│ │ │ │ │
│___│______│___│__///__│___│
│__cond_│
а) mod typ
Этот байт указывает атрибут модуля:
_________________________________
│ mattr │ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │
│_______│___│___│___│___│___│___│
2
mattr Атрибут
0 Не главный модуль без стартового адреса.
1 Не главный модуль со стартовым адресом.
2 Главный модуль без стартового адреса.
3 Главный модуль со стартовым адресом.
б) start address
Это поле имеет следующий формат (присутствует, если mattr равно 1 или 3):
______///___///________________
│end│frame│target│target │
│dat│datum│datum │displacement│
│___│_///_│_///__│____________│
│__________cond___________│
Эти поля имеют те же форматы и тот же смысл, что и поля fix dat, frame datum, target datum и target displacement записи FIXUPP. Разрешены только основные методы привязки (с использованием смещения). Метод F4 не разрешен.