Статус нашего сайта: |
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 |
Таненбаум Э.- Архитектура компьютера. стр.409boolean 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), определить ее тип (набор операндов) и вычислить длину команды. Эта информация понадобится при втором проходе, поэтому ее лучше записать, чтобы не анализировать строку второй раз. Однако переписывание входного файла потребует больше операций ввода-вывода. Что лучше — увеличить количество операций ввода-вывода, чтобы меньше времени тратить на анализ строк, или сократить количество операций ввода-вывода и потратить больше времени на анализ, зависит от быстродействия центрального процессора и дисковой памяти, эффективности файловой системы и некоторых других факторов. В нашем примере мы запишем временный файл, в который будут записываться тип, код и длина операции, а также сама входная строка. Именно эта строка и будет считываться при втором проходе, и читать файл по второму разу не потребуется. |