|
||||
Меню:
Главная
Форум
Литература: Программирование и ремонт Импульсные блоки питания Неисправности и замена Радиоэлектронная аппаратура Микросхема в ТА Рубрикатор ТА Кабельные линии Обмотки и изоляция Радиоаппаратура Гибкие диски часть 2 часть 3 часть 4 часть 5 Ремонт компьютера часть 2 Аналитика: Монтаж Справочник Электроника Мощные высокочастотные транзисторы 200 микросхем Полупроводники ч.1 Часть 2 Алгоритмические проблемы 500 микросхем 500 микросхем Сортировка и поиск Монады Передача сигнала Электроника Прием сигнала Телевидиние Проектирование Эвм Оптимизация Автомобильная электроника Поляковтрансиверы Форт Тензодатчик Силовые полевые транзисторы Распределение частот Резисторные и термопарные Оберон Открытые системы шифрования Удк |
[153] для операции start регистровой машины, а также процедуры для доступа к содержимому регистров и их изменения, как указано в начале раздела 5.2: (define (start machine) (machine start)) (define (get-register-contents machine register-name) (get-contents (get-register machine register-name))) (define (set-register-contents! machine register-name value) (set-contents! (get-register machine register-name) value) done) Все эти процедуры (а также многие процедуры из разделов 5.2.2 и 5.2.3) следующим образом ищут регистр с данным именем в данной машине: (define (get-register machine reg-name) ((machine get-register) reg-name)) 5.2.2 Ассемблер Ассемблер переводит последовательность выражений контроллера машины в соответствующий ей список машинных команд, каждая со своей исполнительной процедурой. По общему строению ассемблер подобен интерпретаторам, которые мы изучали в главе 4 - имеется входной язык (в этом случае язык регистровых машин), и нам нужно выполнить некоторое действие для каждого типа выражений этого языка. Методика порождения исполнительной процедуры для каждой команды в точности та же, которой мы пользовались в разделе 4.1.7, чтобы ускорить интерпретацию путем отделения синтаксического анализа от выполнения. Как мы видели в главе 4, существенную часть полезного анализа выражений Scheme можно провести, не зная конкретных значений переменных. Подобным образом и здесь существенную часть анализа выражений машинного языка можно провести, не зная конкретного содержимого регистров машины. Например, можно заменить имена регистров указателями на объекты-регистры, а имена меток - указателями на те места в последовательности команд, которые метками обозначаются. Прежде чем порождать исполнительные процедуры команд, ассемблер должен знать, куда указывают все метки, так что вначале он просматривает текст контроллера и отделяет метки от команд. При просмотре текста он строит список команд и таблицу, которая связывает каждую метку с указателем внутрь этого списка. Затем ассемблер дополняет список команд, вставляя в каждую команду исполнительную процедуру. Процедура assemble - основной вход в ассемблер. Она принимает в качестве аргументов текст контроллера и модель машины, а возвращает последовательность команд, которую нужно сохранить в модели. Assemble вызывает extract-labels, чтобы построить из данного ей списка контроллера исходный список команд и таблицу меток. Вторым аргументом extract-labels служит процедура, которую следует позвать для обработки этих результатов: эта процедура зовет update-insts! , чтобы породить исполнительные процедуры для команд и вставить их в командный список, а затем возвращает модифицированный список команд. (define (make-new-machine) (let ((pc (make-register pc)) (flag (make-register flag)) (stack (make-stack)) (the-instruction-sequence ())) (let ((the-ops (list (list initialize-stack (lambda () (stack initialize))))) (register-table (list (list pc pc) (list flag flag)))) (define (allocate-register name) (if (assoc name register-table) (error "Многократно определенный регистр: " name) (set! register-table (cons (list name (make-register name)) register-table))) register-allocated) (define (lookup-register name) (let ((val (assoc name register-table))) (if val (cadr val) (error "Неизвестный регистр:" name)))) (define (execute) (let ((insts (get-contents pc))) (if (null? insts) done (begin ((instruction-execution-proc (car insts))) (execute))))) (define (dispatch message) (cond ((eq? message start) (set-contents! pc the-instruction-sequence) (execute)) ((eq? message install-instruction-sequence) (lambda (seq) (set! the-instruction-sequence seq))) ((eq? message allocate-register) allocate-register) ((eq? message get-register) lookup-register) ((eq? message install-operations) (lambda (ops) (set! the-ops (append the-ops ops)))) ((eq? message stack) stack) ((eq? message operations) the-ops) (else (error "Неизвестная операция -- MACHINE" message)))) dispatch))) Рис. 5.13: Процедура make-new-machine, реализующая базовую модель машины. (define (assemble controller-text machine) (extract-labels controller-text (lambda (insts labels) (update-insts! insts labels machine) insts))) Extract-labels принимает на входе список text (последовательность выражений, обозначающих команды контроллера) и процедуру receive. Receive будет вызвана с двумя аргументами: (1) списком insts структур данных, каждая из которых содержит команду из text; и (2) таблицей под названием labels, связывающей каждую метку из text с позицией в списке insts , которую эта метка обозначает. (define (extract-labels text receive) (if (null? text) (receive () ()) (extract-labels (cdr text) (lambda (insts labels) (let ((next-inst (car text))) (if (symbol? next-inst) (receive insts (cons (make-label-entry next-inst insts) labels)) (receive (cons (make-instruction next-inst) insts) labels))))))) Работа extract-labels заключается в последовательном просмотре элементов text и сборке insts и labels. Если очередной элемент является символом (то есть меткой), соответствующий вход добавляется в таблицу labels. В противном случае элемент добавляется к списку insts.4 4Процедура receive используется здесь, в сущности, для того, чтобы заставить extract-labels вернуть два значения - labels и insts, - не создавая специально структуры данных для их хранения. Альтернативная реализация, которая явным образам возвращает пару значений, выглядит так: (define (extract-labels text) (if (null? text) (cons () ()) (let ((result (extract-labels (cdr text)))) (let ((insts (car result)) (labels (cdr result))) (let ((next-inst (car text))) (if (symbol? next-inst) (cons insts (cons (make-label-entry next-inst insts) labels)) (cons (cons (make-instruction next-inst) insts) labels))))))) Вызывать ее из assemble следовало бы таким образом: (define (assemble controller-text machine) (let ((result (extract-labels controller-text))) (let ((insts (car result)) (labels (cdr result))) (update-insts! insts labels machine) insts))) Можно считать, что использование receive показывает изящный способ вернуть несколько значений, а можно считать, что это просто оправдание для демонстрации программистского трюка. |
Среды: Smalltalk80 MicroCap Local bus Bios Pci 12С ML Микроконтроллеры: Atmel Intel Holtek AVR MSP430 Microchip Книги: Емкостный датчик 500 схем для радиолюбителей часть 2 (4) Структура компьютерных программ Автоматическая коммутация Кондиционирование и вентиляция Ошибки при монтаже Схемы звуковоспроизведения Дроссели для питания Блоки питания Детекторы перемещения Теория электропривода Адаптивное управление Измерение параметров Печатная плата pcad pcb Физика цвета Управлении софтверными проектами Математический аппарат Битовые строки Микроконтроллер nios Команды управления выполнением программы Перехода от ahdl к vhdl Холодный спай Усилители hi-fi Электронные часы Сердечники из распылённого железа Анализ алгоритмов 8-разрядные КМОП Классификация МПК История Устройства автоматики Системы и сети Частотность Справочник микросхем Вторичного электропитания Типы видеомониторов Радиобиблиотека Электронные системы Бесконтекстный язык Управление техническими системами Монтаж печатных плат Работа с коммуникациями Создание библиотечного компонента Нейрокомпьютерная техника Parser Пи-регулятор ч.1 ПИ-регулятор ч.2 Обработка списков Интегральные схемы Шина ISAВ Шина PCI Прикладная криптография Нетематическое: Взрывной автогидролиз Нечеткая логика Бытовые установки (укр) Автоматизация проектирования Сбор и защита Дискретная математика Kb радиостанция Энергетика Ретро: Прием в автомобиле Управление шаговым двигателем Магнитная запись Ремонт микроволновки Дискретные системы часть 2 | ||