Статус
нашего
сайта:
ICQ Secrets Center is Online  ICQ Information Center


ICQ SHOP
     5-значные
     6-значные
     7-значные
     8-значные
     9-значные
     Rippers List
ОПЛАТА
СТАТЬИ
СЕКРЕТЫ
HELP CENTER
OWNED LIST
РОЗЫСК!New!
ICQ РЕЛИЗЫ
Протоколы ICQ
LOL ;-)
Настройка компьютера
Аватарки
Смайлики
СОФТ
     Mail Checkers
     Bruteforces
     ICQTeam Soft
     8thWonder Soft
     Other Progs
     ICQ Patches
     Miranda ICQ
ФорумАрхив!
ВАШ АККАУНТ
ICQ LiveJournal

Реклама

Наш канал:

irc.icqinfo.ru

Таненбаум Э.- Архитектура компьютера. стр.409


Таненбаум Э.- Архитектура компьютера. стр.409

boolean more_input=true; // флаг, который останавливает первый проход

String line, symbol, literal, opcode; // поля команды

int location_counter, length, value, type; // переменные

final int END_STATEMENT = -2; // сигналы окончания ввода

location_counter =0; // ассемблирование первой команды в ячейке О

initialize_tables(); // общая инициализация

while (morejinput) { // more_input с помощью директивы END

// получает значение "ложь"

line = read_next_line(); // считывание строки length =0; // # байт в команде

type =0; // тип команды

if (line_is_not_comment(line)) { symbol = check_for_symbol(line); // содержит ли строка метку? if (symbol != null) // если да, то записываются

// символ и значение enter_new_symbol(symbol, location_counter); literal = check_for_litérai(1 ine); // содержит ли строка литерал? if (literal != null) // если да, то он

// сохраняется в таблице

enter_new_litérai(literal); // Теперь определяем тип кода операции. -1 значит недопустимый код операции opcode = extract_opcode(line); // определяем место кода операции type =search_opcode_table(opcode); // находим формат,

// например, OP REG1.REG2 if (type < 0) // если это не код операции,

// является ли он директивой? type = search_pseudo_table(opcode); switch(type) { // определяем длину команды

case 1:1 ength=get_length_of_typel(1i ne); break; case 2:1 ength=get_length_of_type2(line); break; // другие варианты

}

}

write_temp_file(type, opcode, length, line); // информация для

// второго прохода location_counter = location_counter + length; // обновление счетчика

// адресов команд if (type == END_STATEMENT) { // завершился ли ввод?

more_input = false; // если да, то выполняем

// служебные действия: rewind_temp_for_pass_two(); // перематываем файл обратно

sort_literal_table(); // сортируем таблицу литералов

remove_redundant_litérais(); // и удаляем из нее дубликаты

}

}

}

Некоторые процедуры будут относительно короткими, например, check_for_symbol, которая просто возвращает в виде символьной строки имя, если таковое имеется, или ноль, если его нет. Другие процедуры, например get_length_of_typel и getl ength_of_type2, могут быть достаточно длинными и сами вызывать другие процедуры. Естественно, на практике типов будет не два, а больше, — это зависит от ассемблируемого языка и от того, сколько типов команд предусмотрено в этом языке.

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

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


⇐ Предыдущая страница| |Следующая страница ⇒

.