Читаем Код. Тайный язык информатики полностью

Обратите внимание: место назначения (ячейка памяти для команды «Сохранить») по-прежнему указывается слева, а источник — справа. Содержимое аккумулятора нужно сохранить в ячейке 1003h. Длинную команду «Перейти к ячейке 0000h, если флаг нуля не равен 1» можно записать кратко.

JNZ 0000h

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

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

0000h: LOD A, [1005h]

А вот так можно указать на данные, хранящиеся по определенному адресу.

1000h: 00h, A7h

1002h: 00h, 1Ch

1004h: 00h, 00h

Два байта, разделенные запятой, указывают на то, что первый хранится в ячейке по адресу слева, а второй — в ячейке, следующей за ней. Эти три строки эквивалентны следующей строке.

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, то придется переписывать множество выражений. Лучше использовать метки для обозначения ячеек памяти. Эти метки — просто слова или то, что их напоминает.

BEGIN: LOD A,[RESULT + 1]

ADD A,[NUM1 + 1]

STO [RESULT + 1], A

LOD A,[RESULT]

ADC A,[NUM1]

STO [RESULT], A

LOD A,[NUM2 + 1]

ADD A,[NEG1]

STO [NUM2 + 1], A

JNZ BEGIN

NEG1: HLT

NUM1: 00h, A7h

NUM2: 00h, 1Ch

RESULT: 00h, 00h

Важно: метки NUM1, NUM2 и RESULT ссылаются на ячейки памяти, где хранятся два байта. В приведенных выражениях метки NUM1 + 1, NUM2 + 1 и RESULT + 1 ссылаются на второй байт соответствующей метки. Обратите внимание на метку NEG1 (negative one, то есть «минус один») у команды HLT.

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

BEGIN: LOD A,[RESULT + 1]

ADD A,[NUM1 + 1]; Прибавить младший байт

STO [RESULT + 1], A

LOD A,[RESULT]

ADC A,[NUM1]; Прибавить старший байт

STO [RESULT], A

LOD A,[NUM2 + 1]

ADD A,[NEG1]; Уменьшить второе число на 1

STO [NUM2 + 1], A

JNZ BEGIN

NEG1: HLT

NUM1: 00h, A7h

NUM2: 00h, 1Ch

RESULT: 00h, 00h

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

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

Изучение концепций компьютерного программирования предполагает знакомство с понятием ошибки. При кодировании, особенно при написании машинного кода, легко ошибиться. Ввод неправильного числа уже гарантирует возникновение неприятностей, но что произойдет, если неправильно ввести код команды? Если вы введете значение 11h (команда «Сохранить») вместо 10h (команда «Загрузить»), то машина не только не загрузит число, которое должна, но само это число будет заменено значением, которое в настоящий момент хранится в аккумуляторе. Некоторые ошибки могут приводить к непредсказуемым результатам. Предположим, вы используете команду «Перейти» для перехода к ячейке, которая не содержит действительного кода команды. Или, допустим, вы случайно применили команду «Сохранить», записав число в ячейке с кодом команды. Все может случиться (и частенько случается).

Перейти на страницу:

Похожие книги