Главная страница
Навигация по странице:

  • Операция Код

  • Операция Код Мнемокод

  • кр гаряев. Чарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе. Книга принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании


    Скачать 6.11 Mb.
    НазваниеКнига принадлежит Контакты владельца Культовая книга талантливого преподавателя стала для многих первым уверенным шагом в программировании
    Анкоркр гаряев
    Дата19.10.2022
    Размер6.11 Mb.
    Формат файлаpdf
    Имя файлаЧарльз Петцольд - Код_ тайный язык информатики-Манн, Иванов и Фе.pdf
    ТипКнига
    #743064
    страница16 из 28
    1   ...   12   13   14   15   16   17   18   19   ...   28
    Операция
    Код
    Загрузить
    10h
    Сохранить
    11h
    Сложить
    20h
    Вычесть
    21h
    Сложить с переносом
    22h
    Вычесть с заимствованием
    23h
    Перейти
    30h
    Остановить
    FFh
    Обычно массив RAM в сумматоре адресуется последовательно. Команда
    «Перейти» заставляет машину действовать иначе, то есть обращаться к ячей- ке массива по другому заданному адресу. Такая команда иногда называется командой ветвления.
    В предыдущем примере мы можем заменить команду «Остановить» в ячей- ке 000Ch командой «Перейти».
    30h
    00h
    20h
    000Ch:
    Перейти к команде по адресу 0020h
    Значение 30h соответствует коду команды «Перейти». Шестнадцатибит- ный адрес, который следует за ним, указывает на ячейку со следующей коман- дой, к которой должен обратиться сумматор.
    В предыдущем примере сумматор, как обычно, начинает с ячейки 0000h, обрабатывает команды «Загрузить», «Сложить», «Вычесть» и «Сохранить».
    Затем он выполняет команду «Перейти» и продолжает работу с адреса 0020h, начиная с которого хранятся команда «Загрузить», две команды «Сложить», команды «Сохранить» и «Остановить».

    Глава 17. Автоматизация
    255
    Команда «Перейти» влияет на 16-битный счетчик. Всякий раз, когда сумма- тор ее запускает, на выходе счетчика должен возникать новый адрес, следующий за кодом команды «Перейти». Это реализуется с помощью входов Pre и Clr тригге- ров D-типа со срабатыванием по фронту, из которых состоит 16-битный счетчик.
    Q
    D
    Clk
    Q
    Pre
    Clr
    Напомню, что входы Pre и Clr должны быть равны 0 при выполнении обычной операции. Если вход Pre равен 1, сигнал Q тоже становится 1; если вход Clr равен 1, сигнал Q — 0.
    Если хотите загрузить в триггер новое значение (назовем его A — от сло- ва «адрес»), вы можете включить его в схему следующим образом.
    Q
    Сброс
    D
    Clk
    Q
    Pre
    Clr
    Задать
    A
    Обычно сигнал «Задать» равен 0. В этом случае вход триггера Pre также 0.
    Вход Clr равен 0 при условии, что сигнал «Сброс» не равен 1. Это позволяет очистить триггер независимо от значения сигнала «Задать». Когда сигнал «За- дать» — 1, вход Pre — 1, а вход Clr — 0 при условии, что сигнал A — 1. Если сигнал A — 0, то вход Pre — 0, а вход Clr — 1. Следовательно, значение выхо- да Q будет совпадать со значением A.
    Нам требуется по одной такой схеме для каждого бита 16-битного счет- чика. После загрузки конкретного значения счетчик будет продолжать под- счет с него. В других отношениях изменения не являются такими серьезными.
    Шестнадцатибитный адрес из массива RAM, сохраненный в защелках, пода- ется как на вход селектора «2 на 1» (передает его на адресный вход массива
    RAM), так и на вход 16-битного счетчика для выполнения функции «Задать».

    256
    Код
    Clk
    Clr
    Addr
    DO
    16 16 16 8
    8 8
    8 8
    16 8
    8 8
    8
    DI
    Задать
    Сброс
    16
    Sel
    W
    Clk
    Clk
    Clk
    Селектор
    «2 на 1»
    16-битный счетчик
    Пульт управления
    8-битная защелка
    8-битная защелка
    8-битная защелка
    «Код»
    «Данные»
    RAM
    64 Кбайт × 8
    Очевидно, сигнал «Задать» должен быть равен 1, только если код коман- ды 30h и адрес сохранен в защелках.
    Команда «Перейти», безусловно, полезна. Однако еще более практичной была бы команда, которая совершает переход не всегда, а только при опреде- ленных условиях. Такая команда называется условным переходом. Вероятно, лучший способ продемонстрировать ее полезность — постановка вопроса:
    «Как сделать так, чтобы наш сумматор перемножил два 8-битных числа, на- пример A7h и 1Ch?»
    Все просто, не так ли? Результат умножения двух 8-битных значений —
    16-битное число. Для удобства все три числа, участвующие в этой операции, выражены в виде 16-битных значений. Первым делом нужно решить, где сле- дует сохранить эти числа и результат.
    00h
    A7h
    00h
    00h
    1000h:
    16-битное множимое
    1Ch
    16-битный множитель
    00h
    1002h:
    1004h:
    16-битное произведение сохраняется здесь…
    …и здесь

    Глава 17. Автоматизация
    257
    Все знают, что умножить число A7h на 1Ch (соответствует десятичному числу 28) — это то же самое, что найти сумму 28 чисел A7h. Таким образом, в ячейках 1004h и 1005h фактически будет накапливаться 16-битный резуль- тат этого суммирования. Вот последовательность кодов для выполнения пер- вой операции сложения.
    10h
    10h
    05h
    10h
    0000h:
    Сложить байт по адресу
    1001h со значением в аккумуляторе
    20h
    Загрузить байт по адресу
    1005h в аккумулятор
    01h
    11h Сохранить содержимое аккумулятора по адресу 1005h
    10h
    05h
    10h
    10h
    04h
    22h Сложить с переносом байт по адресу 1000h со значением в аккумуляторе
    Сохранить содержимое аккумулятора по адресу 1004h
    04h
    00h
    11h
    10h
    0012h:
    10h
    Загрузить байт по адресу
    1004h в аккумулятор
    0003h:
    0006h:
    000Fh:
    000Ch:
    0009h:
    После выполнения этих шести команд 16-битное значение в ячейках 1004h и 1005h будет равно числу A7h, умноженному на 1. Чтобы это значение рав- нялось произведению A7h и 1Ch, эти шесть команд необходимо выполнить еще 27 раз. Вы можете ввести эти шесть команд еще 27 раз, начиная с адре- са 0012h, или сохранить код команды «Остановить» по адресу 0012h, нажать кнопку «Сброс» 28 раз, чтобы получить окончательный ответ.
    Конечно, ни один из этих двух вариантов не идеален. Оба они предпола- гают, что вы должны что-то сделать: ввести набор команд или нажать кнопку
    «Сброс» в соответствии со значением одного из сомножителей. Уверен, что вы не хотели бы всю жизнь перемножать 16-битные значения именно так.
    А что, если поместить команду «Перейти» в ячейку 0012h? Эта команда заставляет счетчик снова начать счет с ячейки 0000h.
    30h
    00h
    00h
    0012h:
    Перейти к команде по адресу 0000h

    258
    Код
    Вроде бы проблема решена. При выполнении первой команды 16-битное значение в ячейках 1004h и 1005h будет равно произведению чисел A7h и 1.
    Затем благодаря команде «Перейти» мы вернемся к началу. После выполнения второй операции 16-битный результат будет равен произведению чисел A7h и 2. В конце концов он станет равен произведению чисел A7h и 1Ch, однако у нас нет способа остановить работу сумматора. Нам нужна команда «Перей- ти», которая запускала бы процесс с начала столько раз, сколько необходимо.
    Это условный переход, который совсем несложно реализовать. Сначала нуж- но добавить однобитную защелку, подобную защелке для переноса. Она будет называться нулевой защелкой, поскольку в ней будет сохраняться значение 1, только если все выходы 8-битного сумматора будут равны 0.
    Флаг нуля
    DI
    Clk
    DO
    Clr
    8-битный сумматор
    Выход этого 8-битного вентиля ИЛИ-НЕ равен 1, только если все входы равны 0. Как и вход защелки для переноса Clk, вход Clk нулевой защелки сохра- няет значение только при выполнении команд «Сложить», «Вычесть», «Сложить с переносом» или «Вычесть с заимствованием». Это сохраненное значение на- зывается флагом нуля. Будьте внимательны: флаг нуля равен 1, если все выхо- ды сумматора равны 0; флаг нуля — 0, если не все выходы сумматора равны 0.
    Защелка для переноса и нулевая защелка позволяют дополнить наш ре- пертуар четырьмя командами.
    Операция
    Код
    Загрузить
    10h
    Сохранить
    11h
    Сложить
    20h
    Вычесть
    21h
    Сложить с переносом
    22h
    Вычесть с заимствованием
    23h
    Перейти
    30h
    Перейти, если 0 31h

    Глава 17. Автоматизация
    259
    Операция
    Код
    Перейти, если перенос
    32h
    Перейти, если не 0 33h
    Перейти, если не перенос
    34h
    Остановить
    FFh
    Например, при выполнении команды «Перейти, если не 0» переход к указан- ному адресу осуществляется только в том случае, если выход нулевой защелки равен 0. Другими словами, никакого перехода не произойдет, если результат вы- полнения последней команды — «Сложить», «Вычесть», «Сложить с переносом» или «Вычесть с заимствованием» — равен 0. Реализация этого нововведения пред- полагает дополнение набора управляющих сигналов, которые реализуют обыч- ную команду «Перейти»: при выполнении команды «Перейти, если не 0» сигнал
    16-битного счетчика «Задать» равен 1 только при нулевом значении флага нуля.
    Следующая последовательность команд, начинающаяся с адреса 0012h, позволяет перемножить два числа.
    10h
    10h
    03h
    00h
    0012h:
    Сложить байт по адресу 001Eh со значением в аккумуляторе
    20h
    Загрузить байт по адресу 1003h в аккумулятор
    1Eh
    11h Сохранить содержимое аккумулятора по адресу 1003h
    10h
    03h
    33h
    00h
    00h
    FFh
    Остановить
    001Eh:
    Перейти к ячейке 0000h, если флаг нуля не равен 1 0015h:
    0018h:
    001Bh:
    При первом выполнении этой последовательности команд в ячейках 0004h и 0005h, как мы уже выяснили, хранится 16-битное произведение чисел A7h и 1. Приведенные здесь команды загружают байт из ячейки 1003h в аккумуля- тор. Его значение — 1Ch. Этот байт прибавляется к значению в ячейке 001Eh, в которой хранится команда «Остановить», представленная действительным числом. Сложение чисел FFh и 1Ch равнозначно вычитанию 1 из числа 1Ch, поэтому результат равен 1Bh. Это значение не равно 0, поэтому флаг нуля — 0.

    260
    Код
    Байт 1Bh сохраняется в ячейке 1003h. Затем выполняется команда «Перейти, если не 0». Флаг нуля не равен 1, поэтому переход происходит. На следующем этапе запускается команда, хранящаяся в ячейке 0000h. Имейте в виду, что команда «Сохранить» не влияет на флаг нуля. На его значение воздействуют только команды «Сложить», «Вычесть», «Сложить с переносом» или «Вычесть с заимствованием», поэтому его значение останется таким, какое было уста- новлено в последний раз, когда отрабатывалась одна из этих команд.
    При втором выполнении последовательности команд в ячейках 1004h и 1005h будет содержаться 16-битное произведение чисел A7h и 2. При сло- жении 1Bh и FFh получается 1Ah. Это значение не равно 0, поэтому мы воз- вращаемся к началу.
    При двадцать восьмом выполнении этой последовательности команд в ячей- ках 1004h и 1005h будет содержаться произведение чисел A7h и 1Ch. В ячейке
    1003h будет храниться значение 1, которое прибавится к FFh, в результате чего получится 0. При этом значение флага нуля станет 1, поэтому вместо команды
    «Перейти, если 0» будет выполнена команда «Остановить».
    Теперь я могу объявить, что нам наконец удалось собрать устройство, ко- торое мы можем на полном основании назвать компьютером. Несмотря на при- митивность, это уже компьютер. Его отличие заключается в условном переходе.
    Контролируемое повторение последовательности команд, или цикл, — это то, что отличает компьютеры от калькуляторов. Я только что продемонстрировал, как команда условного перехода позволяет машине перемножить два числа. Подоб- ным образом она может выполнить и деление. Кроме того, она не ограничивается
    8-битными значениями и способна складывать, вычитать, умножать и делить 16-,
    24-, 32-битные числа и числа большей разрядности. Это значит, что такая машина может вычислять квадратные корни, логарифмы и тригонометрические функции.
    Когда мы собрали компьютер, можем начать использовать соответствую- щую терминологию.
    Собранный компьютер можно классифицировать как цифровой, посколь- ку он работает с дискретными числами. К другому типу относятся аналоговые компьютеры, которые в настоящее время уже практически не применяются.
    (Цифровые, или дискретные, данные могут принимать только определенные значения *. Аналоговые данные непрерывны и могут принимать любое значе- ние в заданном диапазоне.)
    * В строгом смысле понятия «дискретный» и «цифровой» не эквивалентны. Дискретный сигнал представляет собой последовательность отсчетов (например, напряжения) с произвольными значениями. Цифровым сигнал станет после того, как будет проквантован (то есть значения отсчетов будут округлены до ближайшего разрешенного значения) и закодирован с помощью нулей и единиц. Прим. науч. ред.

    Глава 17. Автоматизация
    261
    Цифровой компьютер состоит из четырех основных частей: процессора,
    памяти, как минимум одного устройства ввода иодного устройства выво-
    да. В нашей машине память — массив RAM емкостью 64 килобайт. Устройства ввода и вывода — ряд переключателей и лампочек на пульте управления мас- сивом RAM. Эти переключатели и лампочки позволяют нам (людям) вводить в память числа и анализировать результаты.
    Все остальное — процессор, который также называется центральным
    процессорным устройством (ЦПУ). В обычной речи процессор иногда называ- ют мозгом компьютера, но я не хотел бы использовать этот термин, поскольку собранное нами устройство совершенно не похоже на мозг. В наши дни часто употребляется слово «микропроцессор» — процессор, который благодаря ис- пользованию технологии, которую я опишу в главе 18, отличается очень ма- лыми размерами. К тому, что мы собрали из реле в этой главе, вряд ли приме- нима приставка «микро-».
    Созданный нами процессор является 8-битным. Ширина аккумулятора и большинства каналов данных составляет 8 бит. Шестнадцатибитное значе- ние подается только на адресный вход массива RAM. Если бы значение адре- са было 8-битным, то вместо 65 536 байт можно было бы адресовать только
    256 байт памяти, что было бы значительным ограничением.
    Процессор состоит из нескольких компонентов. Я уже упомянул аккуму-
    лятор, который представляет собой просто защелку, позволяющую хранить число внутри процессора. Восьмибитный инвертор и 8-битный сумматор на- шего компьютера вместе образуют арифметико-логическое устройство (АЛУ).
    Наше АЛУ выполняет только арифметические операции, в частности сложение и вычитание. В более сложных компьютерах АЛУ может производить такие логические функции, как И, ИЛИ и исключающее ИЛИ. Шестнадцатибитный счетчик называется счетчиком команд.
    Собранный нами компьютер состоит из реле, проводов, переключателей и лампочек. Все это — аппаратное обеспечение (hardware, или хард) компью- тера. Напротив, содержащиеся в памяти коды команд и числа называются про-
    граммным обеспечением (software, или софт).
    Когда мы говорим о компьютерах, термин «программное обеспечение» прак- тически идентичен термину «компьютерная программа» (или просто «програм-
    ма»). Написание программного обеспечения называется программированием.
    Именно этим я занимался, когда определял серию команд, позволяющих на- шему компьютеру перемножить два числа.
    Как правило, в компьютерных программах мы можем различать код (ко- торый относится к самим командам) и данные, то есть числа, которыми ма- нипулирует код. Иногда это различие не так очевидно. Например, команда

    262
    Код
    «Остановить» в описанной выше последовательности выступала еще и в ка- честве числа –1.
    Компьютерное программирование иногда называют написанием кода, или
    кодированием. От программиста вы можете услышать фразы типа: «Я потратил свои каникулы на кодирование», «Я писал код до семи утра». Иногда компью- терных программистов называют кодерами, хотя кому-то этот термин может показаться уничижительным. Такие программисты, возможно, предпочтут, чтобы их называли программными инженерами.
    Коды команд, на которые реагирует процессор (например, 10h и 11h, соот- ветствующие командам «Загрузить» и «Сохранить»), называются машинными
    кодами, или машинным языком. В данном случае термин «язык» используется потому, что он напоминает устный или письменный человеческий язык в том смысле, что машина его «понимает» и реагирует на него.
    Для обозначения команд, выполняемых нашей машиной, я использовал довольно длинные фразы вроде «Сложить с переносом». Как правило, коман- ды — это короткие мнемонические коды, написанные заглавными буквами.
    Мнемокоды могут состоять всего из двух или трех букв. Далее перечислены возможные мнемокоды для команд, распознаваемых нашим компьютером.
    Операция
    Код
    Мнемокод
    Загрузить
    10h
    LOD
    Сохранить
    11h
    STO
    Сложить
    20h
    ADD
    Вычесть
    21h
    SUB
    Сложить с переносом
    22h
    ADC
    Вычесть с заимствованием
    23h
    SBB
    Перейти
    30h
    JMP
    Перейти, если 0 31h
    JZ
    Перейти, если перенос
    32h
    JC
    Перейти, если не 0 33h
    JNZ
    Перейти, если не перенос
    34h
    JNC
    Остановить
    FFh
    HLT
    Эти мнемокоды особенно полезны, когда используются в сочетании с дру- гими сокращенными обозначениями. Например, вместо длинной команды
    «Загру зить байт из ячейки 1003h в аккумулятор» можем написать следующее.
    LOD A,[1003h]

    Глава 17. Автоматизация
    263
    Обозначения A и [1003h] справа от мнемокода называются аргумента-
    ми, которые определяют, что конкретно происходит при выполнении коман- ды «Загрузить». При записи аргументов место назначения указывается слева
    (А — аккумулятор), а источник — справа. Квадратные скобки означают, что в аккумулятор нужно загрузить не число 1003h, а значение, хранящееся в ячей- ке памяти по адресу 1003h.
    Аналогично команду «Сложить байт из ячейки 001Eh со значением в ак- кумуляторе» можно сократить до такого выражения.
    ADD A, [001Eh]
    А команду «Сохранить содержимое аккумулятора по адресу 1003h» — до выражения следующего вида.
    STO [1003h], A
    Обратите внимание: место назначения (ячейка памяти для команды «Со- хранить») по-прежнему указывается слева, а источник — справа. Содержимое аккумулятора нужно сохранить в ячейке 1003h. Длинную команду «Перейти к ячейке 0000h, если флаг нуля не равен 1» можно записать кратко.
    JNZ 0000h
    В этой команде квадратные скобки не используются, поскольку она пред- полагает переход к ячейке 0000h, а не к значению, которое может в ней хра- ниться.
    Такая сокращенная запись удобна, поскольку позволяет перечислить коман- ды в столбик и сделать их легко читаемыми, не прибегая к рисованию ячеек памяти. Для указания ячейки, в которой хранится определенная команда, мо- жете использовать шестнадцатеричный адрес с двоеточием.
    0000h: LOD A, [1005h]
    А вот так можно указать на данные, хранящиеся по определенному адресу.
    1000h: 00h, A7h
    1002h: 00h, 1Ch
    1004h: 00h, 00h

    264
    Код
    Два байта, разделенные запятой, указывают на то, что первый хранит- ся в ячейке по адресу слева, а второй — в ячейке, следующей за ней. Эти три строки эквивалентны следующей строке.
    1000h: 00h, A7h, 00h, 1Ch, 00h, 00h
    Таким образом, программа для умножения двух чисел может быть запи- сана в виде следующей серии команд.
    0000h: LOD A, [1005h]
    ADD A, [1001h]
    STO [1005h], A
    LOD A, [1004h]
    ADC A, [1000h]
    STO [1004h], A
    LOD A, [1003h]
    ADD A, [001Eh]
    STO [1003h], A
    JNZ 0000h
    001Eh: HLT
    1000h: 00h, A7h
    1002h: 00h, 1Ch
    1004h: 00h, 00h
    Пустые строки и другие пробелы применяются для упрощения восприя- тия. При написании кода лучше не использовать фактические адреса, поскольку они могут измениться. Например, если вы решили сохранить числа в ячейках с 2000h до 20005h, то придется переписывать множество выражений. Лучше использовать
    1   ...   12   13   14   15   16   17   18   19   ...   28


    написать администратору сайта