Little Computer 3 , или LC-3 , — это тип компьютерного образовательного языка программирования , язык ассемблера , который является разновидностью языка программирования низкого уровня .
Он имеет относительно простой набор инструкций, но может использоваться для написания умеренно сложных программ на ассемблере и является жизнеспособной целью для компилятора C. Язык менее сложен, чем ассемблер x86 , но имеет много функций, похожих на функции более сложных языков. Эти функции делают его полезным для начального обучения, поэтому его чаще всего используют для обучения основам программирования и компьютерной архитектуры студентам компьютерных наук и компьютерной инженерии .
LC-3 был разработан Йелем Н. Паттом из Техасского университета в Остине и Санджаем Дж. Пателем из Иллинойсского университета в Урбане-Шампейне . Их спецификация набора инструкций, общая архитектура LC-3 и аппаратная реализация могут быть найдены во втором издании их учебника. [1] Курсы, основанные на LC-3 и книге Патта и Пателя, предлагаются на многих факультетах компьютерной инженерии и компьютерных наук.
LC-3 определяет размер слова 16 бит для своих регистров и использует 16-битную адресуемую память с адресным пространством 2 16. Регистровый файл содержит восемь регистров, которые по номерам обозначаются как R0 через R7. Все регистры являются универсальными, то есть они могут свободно использоваться любой из инструкций, которые могут записывать в регистровый файл, но в некоторых контекстах (например, при переводе из кода C в ассемблер LC-3) некоторые регистры используются для специальных целей.
Инструкции имеют ширину 16 бит и 4-битные коды операций . Набор инструкций определяет инструкции для пятнадцати из шестнадцати возможных кодов операций, хотя некоторые инструкции имеют более одного режима работы. Выполнение отдельных инструкций регулируется конечным автоматом , реализованным с помощью управляющего ПЗУ и микросеквенсорного блока.
Архитектура поддерживает использование клавиатуры и монитора для регулирования ввода и вывода; эта поддержка обеспечивается посредством абстракций ввода-вывода с отображением памяти . При моделировании к этим регистрам можно получить прямой доступ, а архитектурная спецификация описывает их содержимое. Поддержка ввода-вывода более высокого уровня также обеспечивается посредством использования инструкции TRAP и базовой операционной системы. Операционная система предоставляет функции для чтения и вывода символов с клавиатуры, печати отдельных символов на мониторе, печати целых строк как в упакованном, так и в распакованном виде и остановки машины.
Предполагается, что все данные в LC-3 хранятся в представлении с дополнением до двух ; отдельной поддержки для беззнаковой арифметики нет. Устройства ввода-вывода работают с символами ASCII . LC-3 не имеет собственной поддержки чисел с плавающей точкой .
Аппаратная реализация, представленная в тексте Патта и Пателя, не является конвейерной и не оптимизирована каким-либо иным образом, но, безусловно, можно создать быструю реализацию, используя более продвинутые концепции компьютерной архитектуры.
Набор инструкций LC-3 реализует пятнадцать типов инструкций, шестнадцатый код операции зарезервирован для последующего использования. Архитектура представляет собой архитектуру загрузки-хранения; значения в памяти должны быть перенесены в файл регистров, прежде чем с ними можно будет работать.
Доступные арифметические инструкции включают сложение, побитовое И и побитовое НЕ, причем первые две из них могут использовать как регистры, так и непосредственные значения со знаком расширения в качестве операндов. Этих операций достаточно для реализации ряда основных арифметических операций, включая вычитание (путем отрицания значений) и побитовый сдвиг влево (путем использования инструкции сложения для умножения значений на два). LC-3 также может реализовать любую побитовую логическую функцию, поскольку НЕ и И вместе являются логически завершенными .
Доступ к памяти может осуществляться путем вычисления адресов на основе текущего значения счетчика программ (PC) или регистра в регистровом файле; кроме того, LC-3 обеспечивает косвенные загрузки и сохранения, которые используют фрагмент данных в памяти в качестве адреса для загрузки данных или сохранения данных в нем. Значения в памяти должны быть перенесены в регистровый файл, прежде чем их можно будет использовать как часть арифметической или логической операции.
LC-3 предоставляет как безусловные, так и условные инструкции потока управления. Безусловные переходы могут перемещать выполнение в место, заданное значением регистра или смещением относительно ПК. Три инструкции (JSR, JSRR и TRAP) поддерживают понятие вызовов подпрограмм, сохраняя адрес кода, вызывающего подпрограмму, в регистре перед изменением значения счетчика программ. LC-3 не поддерживает прямое арифметическое сравнение двух значений. Условные переходы основаны на арифметическом знаке (отрицательный, ноль или положительный) последнего фрагмента данных, записанного в файл регистров. Вычисление разницы двух значений регистров требует нахождения отрицательных эквивалентностей одного значения регистра, а затем добавления отрицательных чисел к положительным значениям во втором регистре. Разница двух регистров будет сохранена в одном из 8 регистров, доступных пользователю. Знак этого сохраненного значения затем будет использоваться для условного перехода.
Поскольку в наборе инструкций LC-3 не осталось места для выделенных инструкций ввода-вывода, отображаемых на порты , аппаратные реализации обычно резервируют часть карты памяти для отображаемого на память ввода-вывода . [2]
Хотя он не был реализован на физическом чипе, LC-3 может использоваться в моделировании в средах Linux/Unix, Mac OS X и Windows. Инструменты моделирования включают ассемблер с поддержкой компьютерного вычисления смещения с метками и вставкой констант, строк и пустых ячеек памяти в блок ассемблерного кода. Существует также соглашение об использовании языка C на LC-3. Образец ассемблера, компилятора и симулятора предоставлены McGraw-Hill. [1]
Соглашение о вызовах для функций C на LC-3 похоже на то, которое реализовано в других системах, таких как x86 ISA. При запуске программ на C архитектура поддерживает модель памяти, которая включает пространство для стека вызовов и динамического выделения памяти . В этой модели четыре из восьми регистров общего назначения процессора играют особую роль: R4 используется как базовый регистр для загрузки и хранения глобальных данных, R5 используется для указания на область текущей функции в стеке вызовов, а R6 используется как указатель стека. Кроме того, R7 обычно зарезервирован для хранения адресов возврата из вызовов функций; инструкции JSR, JSRR и TRAP автоматически сохраняют адреса возврата в этом регистре во время их выполнения.
Когда функция C вызывается в рамках этой модели, параметры функции помещаются в стек справа налево. Затем в стеке выделяется место для возвращаемого значения вызываемой функции, адреса инструкции в вызывающей стороне для возврата и значения R5 вызывающей стороны. Локальные переменные в вызываемой функции помещаются в стек в том порядке, в котором они были объявлены. Обратите внимание, что LC-3 не имеет собственных инструкций PUSH и POP, поэтому инструкции сложения и сохранения в памяти должны использоваться отдельно для реализации стека.
В стандарте ISA LC-3b описывается модифицированная версия LC-3, включающая следующие изменения:
Эти изменения делают аппаратное обеспечение LC-3b немного более сложным, чем у LC-3. Например, LC-3b нуждается в устройстве сдвига (LC-3 его не имеет) и дополнительной логике в блоке памяти для правильной обработки загрузки и хранения данных различных размеров.