Команда Объектный код команды 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команда Объектный код команды



 

MOV AH,0 10110100 00000000

 

w

 

ADD BX,AX 00000011 11 011 000

Mod reg r/m

D w

 

Кроме того, первый байт машинного кода может содержать бит d, который указывает направление потока данных между операндами. Если d=0, то поле reg определяет второй операнд, а поля mod и r/m – первый, иначе поле reg определяет первый операнд, а поля mod и r/m – второй.

В последнем примере d=1 означает, что поле reg определяет первый операнд, а поля mod и r/m - второй.

Операнды команды кодируется полями reg или mod,r/m. Поле reg предназначено для указания операнда с регистровым режимом адресации и содержит код регистра. Поле r/m предназначено для указания операнда с регистровым режимом адресации или с режимом адресации оперативной памяти. Если биты поля mod имеют значение 11, это значит, что операнд находится в регистре, т. е. биты r/m вместе с битом w определяют конкретный регистр. Кодирование регистров приведено в таблице 1. Если биты поля mod имеют значение 00,01,10 это значит, что операнд находится в оперативной памяти, т. е. поле r/m содержит код способа адресации оперативной памяти.

 

reg или r/m                
  Регистр w =0 AL CL DL BL AH CH DH BH
w=1 AX CX DX BX SP BP SI DI

Таблица 1– Таблица соответствия кодов и мнемонических имен регистров

 

Значения битов mod имеют следующую интерпретацию:

mod=00 – биты r/m задают абсолютный адрес, байт смещения отсутствует;

mod=01 – биты r/m задают абсолютный адрес памяти и имеется один байт смещения;

mod=10 – биты r/m задают абсолютный адрес памяти и имеется два байта смещения.

Кодирование типов адресаций приведено в таблице 2.

 

Таблица 2– Таблица кодов адресации

 

r/m mod=00 mod=01 или mod=10
  [BX]+[SI] [BX]+[SI]+смещение
  [BX]+[DI] [BX]+[DI]+смещение
  [BP]+[SI] [BP]+[SI]+смещение
  [BP]+[DI] [BP]+[DI]+смещение
  [SI] [SI]+смещение
  [DI] [DI]+смещение
  Прямая [BP]+смещение
  [BX] [BX]+смещение

 

 


В объектном коде команды, если используются операнды длиной в слово, сначала указывается младший байт, а затем – старший.

 

Например,

 

 

Команда Объектный код команды

 

MOV AX, 0123H 10111000 00100011 00000001

       
   


Младший старший младший старший

Байт байт байт байт

 

В командах с одним операндом или в командах, когда второй операнд является непосредственным значением, первый операнд кодируется полями mod и r/m, а поле reg содержит дополнительные 3 бита кода операции.

 

Например,

 

Команда Объектный код команды

 

MUL DH 11111100 11 101 110

 

 

ТРЕБОВАНИЯ К ТРАНСЛЯТОРУ

 

Транслятор с языка Ассемблер должен:

 

– выявить ошибки в исходной программе;

– распределить память;

– перевести на машинный язык команды мнемокода и константы;

– сформировать объектный код программы;

– сформировать протокол трансляции (листинг).

 

Эти задачи трудно решить за один просмотр [3–7]. Поэтому, как правило, используются двухпросмотровые ассемблеры. При первом просмотре ассемблер просматривает исходную программу и строит таблицу идентификаторов, т.е. имен полей данных и меток, используемых в программе, и их относительных адресов.

Кроме того, при первом проходе подсчитывается длина объектного кода, но сам объектный код не генерируется. При втором просмотре, ассемблер, используя таблицу идентификаторов, генерирует объектный код для каждой команды.

В ходе трансляции ассемблер использует постоянные и временные таблицы. Постоянные таблицы составляются при разработке ассемблера, а временные создаются в ходе трансляции. Примером постоянной таблицы может служить таблица команд, в которой перечислены все мнемонические коды команд, типы операндов и их машинные эквиваленты, или таблица сообщений об ошибках, в которой фиксируется тип ошибки и соответствующий текст для вывода в файл-листинг. Множество и структура таблиц зависят от особенностей машины, языка Ассемблер и, наконец, от конкретной реализации транслятора. Однако, обязательной временной таблицей в любом ассемблере является таблица идентификаторов (имен), содержащая все имена, определенные в исходной программе и их характеристики: тип, значение, длину и т.д.

Результатом работы транслятора с языка Ассемблер являются листинг и объектный код. Причем, если объектный код формируется только при отсутствии ошибок в тексте исходной программы, то листинг создается в любом случае. Листинг содержит не только исходный текст, но и, при отсутствии ошибок, машинный код команды в шестнадцатиричном формате, а также шестнадцатиричный адрес команды. Если же в исходном тексте команды есть ошибки, то, очевидно, объектный код команды не может быть сформирован, и листинг содержит подробную информацию об ошибках.

Общая схема обработки данных транслятором приведена на рисунке 4. Стрелками на рисунке представлены информационные и логические связи между блоками транслятора.

 


       
 
 
   
Рисунок 4 – Схема обработки данных транслятором

 


 

КОП – мнемонический код операции;

ОП1 и ОП2 – операнды первый и второй соответственно.

 

 


ТРЕБОВАНИЯ К ОТЛАДЧИКУ

 

Современные системы программирования, как правило, имеют в своем составе специальные средства для облегчения процесса отладки программ, называемые отладчиками.

Отладчики позволяют управлять процессом исполнения отлаживаемой программы и получать информацию о ее текущем состоянии или о содержимом памяти, изменять его, приостанавливать и вновь возобновлять исполнение программы.

Все отладчики можно разделить на две группы: универсальные отладчики для работы на уровне машинного языка и специализированные отладчики, ориентированные на работу с определенным языком программирования высокого уровня. Очевидное достоинство универсальных отладчиков состоит в том, что с помощью одного и того же отладчика можно анализировать любую исполняемою программу. Недостатком же таких отладчиков является то, что от программиста требуется определенное знание машинного языка и способов адресации памяти.

Основное достоинство отладчиков языков высокого уровня состоит в том, что ими гораздо легче пользоваться, т.к. доступ к переменной можно получить по ее имени, не задумываясь о том, с каким физическим адресом памяти она связана. Кроме того, использование отладчиков этого типа не требует знаний, в какие машинные коды преобразуется тот или иной оператор исходной программы. Недостатком же таких отладчиков является то, что они зависят от реализации самого языка высокого уровня. Как правило, они менее универсальны, поскольку не обеспечивают анализ машинных кодов, генерируемых компилятором.

Как уже отмечалось выше, в настоящей работе рассматривается задача разработки универсального отладчика – эмулятора.

На вход универсального отладчика поступает объектный код программы в заданном формате (см. п.2), и отладчик должен обеспечивать проверку правильности структуры объектного кода и выполнение команд программы. Кроме того, отладчик должен фиксировать ошибки исполнения команд (например, деление на ноль) и отслеживать недопустимые ссылки (передачу управления за пределы программы).

Схема обработки данных отладчиком представлена на рисунке 5. Стрелками на рисунке обозначены информационные и логические связи между отдельными блоками отладчика.

 

 


 

 
 
Объектный код

               
   
 
 
     
 
     
 


       
 
   
 


 

 

Рисунок 5 – Схема обработки данных отладчиком.

 


ЗАДАНИЕ НА КУРСОВОЕ ПРОЕКТИРОВАНИЕ

 

Разработать программу транслятора для подмножества команд языка Ассемблера процессора i8086/8088. Транслируемая программа имеет следующий формат:

 

 

NAMESEG SEGMENT

ORG выражение

...

Область команд

...

NAMEDATA DB

DW

...

Область данных

...

NAMESEG ENDS

END

 

В качестве признака завершения вычислений использовать команду

INT 20H. В результате работы транслятора должны быть сформированы протокол трансляции и объектный код программы. Протокол трансляции представляется файлом-листингом, в котором содержится объектный код и мнемонический код команд, сообщения об ошибках, информация о результатах трансляции и т. д. Объектный код программы записывается в файл объектного кода и должен иметь следующий формат:

 

H запись-заголовок

T тело

E запись-конец

 

Здесь

запись-заголовок имеет формат:

H<Имя_сегмента><Длина_кода>

запись-тело:

T<адрес_кода><длина_кода><Код>

запись-конец:

E<точка_входа>

 

Коды команд и данных записать в виде строки, представляющей шестнадцатеричную константу.

 

Во всех вариантах реализовать обработку команды MOV и команд, определенных номером варианта (п. 4). Кроме того, во всех вариантах предусмотреть обработку директив:

 

1) SEGMENT, ENDS, END;

2) ORG, OFFSET;

3) DB;

4) DW.

 

Разработать среду отладчика-эмулятора, в которой предусмотреть следующие возможности:

1) загрузка объектного кода в память;

2) вывод состояния регистров, регистра флагов и заданной области памяти;

3) вывод реассемблированного текста программы;

4) пошаговое выполнение программы.

Исходными данными для отладчика являются объектный код и значения сегментных регистров. Результат работы отладчика – состояния регистров и оперативной памяти после выполнения каждой команды, отображаемые на экране компьютера.

 


 



Поделиться:


Последнее изменение этой страницы: 2017-01-23; просмотров: 500; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.15.6.77 (0.139 с.)