как делают они раньше вводили машинный код непосредственно в былые времена? [закрытый]

9
задан claws 2 July 2010 в 17:43
поделиться

8 ответов

(Преобразование короткого замечания с множеством последующих вопросов от OP в длинный ответ:)

Я ввел загрузчики через переключатели на Data General Novas (16-битные машины) в 1969 году. Для Packard Bell 250, с которым я возился в 1967 году, имелся Flexowriter, оснащенный устройством чтения бумажных лент, для загрузки программы в память линии задержки.

Для Nova имелся один ряд из 16 тумблеров и полдюжины других переключателей, функции которых были "Установить адрес памяти", "Депонировать слово и продвинуть адрес памяти", "Одиночный шаг" (мы часто использовали его для ранней отладки!), "Выполнить" и "Остановить", IIRC.

Первоначально Nova имела 4096 слов 16-битной памяти, самый уродливый в мире набор инструкций RISC с 4 16-битными регистрами (стек? кому нужен вонючий стек?), и что-то около 1 микросекунды времени цикла памяти (инструкции занимали несколько циклов). Машина имела "последовательный порт", который подключался к телетайпу ASR33 (10 символов в секунду), и мы потратились на высокоскоростное устройство для чтения бумажных лент и перфоратор.

Изначально машина поставлялась в виде "голого" оборудования, с бумажной лентой, содержащей двухпроходной ассемблер, который считывал исходный текст с... считывателя бумажной ленты. Сначала мы записывали исходный код ассемблера на перфорированную бумажную ленту непосредственно с помощью телетайпа ASR33, включая перфораторы для стирания ошибочных символов. Редактирование было невероятно болезненным. Коллега написал плохой редактор, который считывал бумажную ленту в буфер компьютера, позволял нам находить строки, удалять строки и вставлять строки

Моей первой работой была реализация интерпретатора BASIC в стиле Kemeny&Kurtz. Два года спустя мы добавили еще 4К слов и диск с головкой на 100К слов на дорожку, и я построил на нем многопользовательскую систему таймшеринга, и все это было написано с помощью этого уродливого редактора. Уф. Следующие 20 лет я создавал ОС на разных машинах.

В книгах Linkers/Loaders говорится о "компоновщиках", которые объединяют несколько объектных файлов. Наш ассемблер не утруждал себя этим; он создавал для вашего ассемблера непосредственно загружаемую двоичную бумажную ленту. Эта лента была разработана для загрузки крошечной программой, которая вводилась, ну, возвращаясь к началу этого обсуждения, 30-двухсловной загрузочной программой, вводимой с передней панели. После каждого запуска программы (обычно заканчивающегося "крахом") нам обычно приходилось заново вводить этот загрузчик; мы довольно хорошо освоили его, поскольку часто делали это по несколько раз в день.

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

С помощью текстового редактора нельзя было эффективно работать в Интернете: он не вмещал достаточно текста для произвольного вырезания и вставки, поэтому приходилось редактировать за один проход и вносить изменения от начала до конца по порядку. Следовательно, редактирование в газетном стиле на бумаге в процессе первоначального кодирования было гораздо более эффективным. После первого кодирования мы запускали листинги программы, а затем писали на них, какие правки мы хотим внести, прежде чем идти и вносить их. Экранные редакторы с огромными буферами гораздо приятнее!

Packard Bell 250 был похож на машину Data General, за исключением того, что (что примечательно) имел встроенную программу-загрузчик и поставлялся с редактором. Поскольку у нее была память с линией задержки (считайте, что это что-то вроде дисковой дорожки), вы размещали инструкции вдоль линии задержки таким образом, что когда предыдущая инструкция была выполнена, следующая оказывалась под "головками". Поговорим о болезненной оптимизации... У нее было одно замечательное свойство: когда вы расстраивались, вы могли просто ударить по процессору, и механический удар заставлял машину забыть обо всем. На мгновение это приносило удовлетворение. Потом приходилось начинать все сначала.

Ах, быть связанным со "старыми добрыми временами".

3
ответ дан 4 December 2019 в 10:30
поделиться

Просто чтобы немного отклониться от подхода к мэйнфреймам...

Мой первый опыт низкоуровневого программирования был на Sinclair ZX-81. В нем был встроен вариант BASIC, но вы могли "легко" программировать в машинном коде Z-80 следующим образом:

  • Добавьте оператор REM (комментарий) в программу BASIC. Заполните его символами, чтобы "зарезервировать" часть памяти для вашего кода.
  • Найдите опкоды машинного кода в списке и вручную соберите машинный код в виде значений байтов
  • Введите значения байтов в BASIC-программу как операторы DATA, с коротким циклом, который по очереди считывает каждое значение байта и вставляет его в память, содержащую "текст" оператора REM.
  • Переход к адресу точки входа машинного кода.

После этого я пересел на BBC micro, у которого был потрясающий ассемблер 6502, встроенный прямо в BBC Basic, так что больше не было необходимости идти на такие крайние меры, чтобы ввести машинный код напрямую.

Ах, старые добрые времена... :-)

2
ответ дан 4 December 2019 в 10:30
поделиться

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

После загрузки загрузочного блока, загрузите начальный адрес в регистр адреса и переключите переключатель RUN.

3
ответ дан 4 December 2019 в 10:30
поделиться

В начале 80-х я был ребенком, и моей семье посчастливилось иметь персональный компьютер - «Apple II». Как и многие программисты, я начал в детстве, потому что хотел создавать свои собственные игры. Был встроенный интерпретатор языка BASIC под названием Applesoft BASIC, но он был слишком медленным, чтобы делать какую-либо разумную анимацию. Коммерческие игры, по крайней мере, мне сказали, все были написаны на ассемблере. Так начался квест ... изучить язык ассемблера ... который сначала означал изучение языка МАШИНЫ ... (прямой ввод шестнадцатеричных чисел, а не трехбуквенных текстовых кодов, представляющих инструкции микропроцессора).

В Apple II использовался микропроцессор 6502. Первое, что вам нужно было изучить, это карту памяти, которая представляла собой диапазон и назначение каждого раздела памяти (RAM и ROM). Вот ссылка на карту памяти Apple] [e: текст ссылки

Черные числа на левом поле - это места в памяти. Обратите внимание, что он меняется от $ 0000 до $ FFFF. 6502 мог адресовать только 16 ^ 4 = 65536 или 64 КБ памяти. Вы можете видеть, что ОЗУ закончилось на $ BFFF. Диапазон $ C000- $ CFFF будет иметь доступ к любым периферийным картам, которые вы вставили в компьютер.Например, контроллер дисковода войдет в слот №6 и будет отображаться как $ C600. В детстве я чувствовал себя действительно круто, что я мог перезагрузить систему, набрав $ C600G , который запустил («G» для «Go») процедуру перезагрузки контроллера диска в ПЗУ. Пространство от $ E000 до $ FFFF изначально было просто ROM, но Apple] [e («e» для «расширенного») позволяет переключаться вперед и назад («переключение банка») и получать доступ к этим дополнительным 8 КБ памяти.

Вы видите графические и текстовые области карты памяти? Вот так вы бы отобразили на экране. В те дни (до GUI) существовал «текстовый» режим, в котором программы в ПЗУ непрерывно сканировали память в диапазоне от 0400 до 0800 долларов (= 4 * 16 * 16 = 1024 байтовых ячейки, каждая из которых соответствует месту на экране). Он возьмет любой байт ASCII, помещенный туда, и превратит его в символ на вашем мониторе. Вот набор инструкций 6502, который, среди прочего, позволял вам перемещать байты: Набор инструкций 6502

И чтобы поместить его в контекст, вот подпрограмма из ПЗУ, которая добавляет к числам с плавающей запятой, называемая FADD: (полный набор подпрограмм с плавающей запятой здесь )

F46E: A5 F4     FADD      LDA  X2
F470: C5 F8               CMP  X1       COMPARE EXP1 WITH EXP2.
F472: D0 F7               BNE  SWPALGN  IF #,SWAP ADDENDS OR ALIGN MANTS.
F474: 20 25 F4            JSR  ADD      ADD ALIGNED MANTISSAS.
F477: 50 EA     ADDEND    BVC  NORM     NO OVERFLOW, NORMALIZE RESULT.
F479: 70 05               BVS  RTLOG    OV: SHIFT M1 RIGHT, CARRY INTO SIGN
F47B: 90 C4     ALGNSWP   BCC  SWAP     SWAP IF CARRY CLEAR,
                *       ELSE SHIFT RIGHT ARITH.
F47D: A5 F9     RTAR      LDA  M1       SIGN OF MANT1 INTO CARRY FOR
F47F: 0A                  ASL           RIGHT ARITH SHIFT.
F480: E6 F8     RTLOG     INC  X1       INCR X1 TO ADJUST FOR RIGHT SHIFT
F482: F0 75               BEQ  OVFL     EXP1 OUT OF RANGE.
F484: A2 FA     RTLOG1    LDX  #$FA     INDEX FOR 6:BYTE RIGHT SHIFT.
F486: 76 FF     ROR1      ROR  E+3,X
F488: E8                  INX           NEXT BYTE OF SHIFT.
F489: D0 FB               BNE  ROR1     LOOP UNTIL DONE.
F48B: 60                  RTS           RETURN.

Если посмотреть на подпрограмму, первые четыре шестнадцатеричных числа перед двоеточием - это адрес памяти. Так что, если вы хотите запустить процедуру FADD напрямую, вы должны ввести F46EG (опять же, "G" для "go").

Следующие два шестнадцатеричных числа, $ A5 и $ F4, являются коды инструкций.Если вы посмотрите на удобную таблицу наборов инструкций, вы увидите, что $ A5 означает "LDA" или загрузите аккумулятор.Аккумулятор был одним из трех ячеек памяти (каждый по одному байту) на процессоре 6502, с которым вы могли выполнять вычисления (это было мило с их стороны, а?). Версия команды LDA $ A5 означала, что место в памяти для загрузки было из так называемой «нулевой страницы» или первых байтов $ FF ОЗУ, которые в основном были зарезервированы для использования системой (несколько байтов были свободны для использования программистом. И снова , это было так мило с их стороны.) $ F4 - это ячейка памяти, содержимое которой (один байт)будет передан в аккумулятор. В следующей строке есть инструкция $ C5 или команда «CMP», снова версия нулевой страницы, которая затем сравнивает содержимое аккумулятора с ячейкой памяти $ F8. Итак, это самый низкий уровень, известный как «ЯЗЫК МАШИНЫ», и да, мы иногда вводили небольшие программы или возились с памятью в целях отладки.

Следующие несколько столбцов более читабельны; вы видите фактические команды «LDA» и «CMP» и переменные X1 и X2, которые представляют эти ячейки памяти. Вы также видите комментарии Воза о том, что делает код (сравнение показателей двух чисел с плавающей запятой). Это известно как «язык ассемблера», и это то, что на самом деле было напечатано. После того, как вы напечатали его, ваш ассемблер компилирует байтовые коды.

Ну, мне так и не удалось создать разумную игру на Apple] [но я действительно многому научился, пытаясь программировать!

2
ответ дан 4 December 2019 в 10:30
поделиться

Хорошо, если вы вернетесь достаточно далеко, код был введен с помощью перфокарт.

http://en.wikipedia.org/wiki/Computer_programming_in_the_punch_card_era

1
ответ дан 4 December 2019 в 10:30
поделиться
1
ответ дан 4 December 2019 в 10:30
поделиться

http://en.wikipedia.org/wiki/Front_panel

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

7
ответ дан 4 December 2019 в 10:30
поделиться

У нас все еще есть аналогичные устройства (например, 8085 комплектов) в микропроцессорных лабораториях в университетах - у них обычно есть шестнадцатеричная клавиатура, которую вы используете для ввода машинного кода в определенное место в ОЗУ, и затем вы нажимаете другую клавишу, чтобы начать выполнение. Практически каждый компьютер с 1950-х годов имел отдельную оперативную память, поэтому нет, инструкции никогда не поступают напрямую в ЦП.

Вы можете посмотреть эту статью в Википедии , чтобы увидеть некоторые изображения этих учебных комплектов.

1
ответ дан 4 December 2019 в 10:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: