Ассемблер - Запись чисел, пересылка числа в регистр, запись числа в регистровую пару, скролирование экрана, установка вывода на
экран, очистка экрана.
┌──────────────────────────────────────────────────────────────┐
│ ████▓▓▓▓▒▒▒▒░░░░ АССЕМБЛЕР ДЛЯ НАЧИНАЮЩИХ ░░░░░▒▒▒▒▓▓▓▓███ │
└──────────────────────────────────────────────────────────────┘
(C) THINKER
───────────
Во многих газетах и журналах есть подобная рубрика. Однако,
когда я совершенно не знал ассемблер и с удивлением смотрел на
"простенькие" процедуры очистки экрана, мне пришлось учиться с
помощью других источников. Я и сейчас еще плохо кодирую, но для
некоторых следующая статья покажется интересной и полезной.
Прежде всего, Вам понадобиться специальная ассемблирующая
программа (или пакет программ), иначе называемая просто - ассем-
блер. Я пользуюсь ZX ASM-3, но, естественно, можно взять и любой
другой. К этому вопросу мы еще вернемся.
У нашего любимого Speccy есть несколько пар регистров. Вот
основные из них: AF,BC,HL,DE. Вы можете использовать их по
отдельности, или в парах, причем именно так, как написано выше
(Совершенно недопустима запись: AH,DL или BE). Они служат для
хранения чисел. Эти регистры являются восьмибитными.
Например, в рег. 'В' можно записать число, которое в двоичной
системе не превышает восьми знаков, то есть можно записать число
"98" (в двоичной системе исчисления - это %1100010, число нули-
ков и единичек не превышает восемь), но нельзя записать число
350 (в двоичной системе счисления - %101100010, количество раз-
рядов-9 ). Вообще, самое большое число, которое можно записать
в регистр - это 255 (%11111111).
Также можно записывать и большие числа, но уже не в регист-
ры, а в регистровые пары (AF,BC,HL,DE). Эти регистровые пары
уже шестнадцатибитные и самое большое число, которое можно запи-
сать в них - это те числа, которые в двоичной системе не превы-
шают шестнадцати разрядов. Самое большое число-65535.
Самой простейшей операцией на ассемблере является пересылка
числа в регистр. Для этого служит мнемоника 'LD'. Например:
LD A,5 ; записываем в регистр "А" число "5"
Эта программа запишет в регистр 'A' число '5'. Однако, если
Вы запустите эту програмку (для этого нужно программу сначала
проассемблировать, а потом запустить), то Ваш комп почти навер-
няка зависнет. Для того, чтобы этого не происходило Вам нужно
после всей програмки поставить команду 'RET' (возврат), это
даст компьютеру повод вернуться обратно в ассемблер или в интер-
претатор бейсика.
Теперь наша программка выглядит так:
LD A,5 ; записываем в регистр "А" число "5"
RET ; возвращаемся
Обратите внимание! Текст, стоящий после знака ";" называется
комментарием к программе. К выполнению самой программы он не
имеет никакого отношения и программой-ассемблером игнорируется.
Комментарии вводятся в текст исключительно ради удобства и чита-
бельности программы. Например, программисты часто снабжают ис-
ходные тексты своих программ комментариями, чтобы спустя время
не приходилось мучительно вспоминать ее алгоритм. В ассемблере,
знак ";" можно уподобить оператору 'REM' языка Бейсик - все, что
находиться за ним - не обрабатывается транслятором. Это свойство
комментариев можно эффективно использовать при отладке программ,
исключая из выполнения отдельные команды и целые процедуры.
Но я отвлекся...
Для того, чтобы записать число в регистровую пару, можно тоже
воспользоваться мнемоникой 'LD':
LD HL,1998 ; записываем регистровую пару "HL" - "1998"
RET ; возвращаемся
Ну а теперь Вам, наверное хочется увидеть что-то на экране.
Начнем с простого. Наверное, самой первой Вашей программой на
Basic'е была программа вывода на экран какого-нобудь слова. Ни
чем не сложнее это сделать на ассемблере. Хотя, можно такую
програмку загнуть... Но мы воспользуемся Basic'ом, в принципе
нe самим, а лишь его подпрограммой. Эта подпрограмма находится в
ПЗУ под адресом 16. (Шестанцатеричный адрес - #10).
Для того, чтобы обратиться к какой-нибудь подпрограмме в па-
мяти можно воспользоваться мнемоникой 'CALL', после которой не-
обходимо указать адрес, то есть номер ячейки пямяти с которого в
ПЗУ хранится подпрограмма печати символа. Например, из ассембле-
ра можно вызвать подпрограмму ПЗУ - "скроллирование экрана":
CALL 3582 ; обращаемся на адрес 3582.
; (равносильно "RANDOMIZE USR 3582")
RET ; возвращаемся
Но вернемся к выводу на экран. Для того чтобы что-то напеча-
тать, необходимо передать подпрограмме необходимые данные, на-
пример: какой именно символ печатать. Для этого воспользуемся
регистрами, а точнее регистром 'A'. В него нужно записать код
символа, который нужно напечатать, но сначала нужно указать по-
ток вывода (экран, принтер, служебное окно или еще чего). Для
этого воспользуемся подпрограммой ПЗУ под адресом 5633, при этом
перед обращением на адрес 5633, нужно в регистр 'A' занести но-
мер потока (2-основной экран, 3-принтер). Например, для установ-
ки вывода на экран:
LD A,2 ; устанавливаем вывод на экран (поток-2)
CALL 5633 ; вызов подпрограммы установки потока
RET ; возвращаемся
Обратите внимание! Регистр 'А' - самый важный регистр процес-
сора. Его часто называют аккумулятором, т.к. именно с участием
этого регистра осуществляется большинство математических и логи-
ческих операций ассемблера.
Сейчас самое время научиться выполнять процедуру очистки эк-
рана. Благо в памяти нашего Speccy есть и эта подпрограмма.
Например, вот как будет выглядеть эта процедура на ассемблере:
CALL 3435 ; это адрес подпрограммы очистки экрана в ПЗУ.
RET ; возвращаемся
Теперь мы умеем устанавливать потоки и очищать экран, значит
можно попытаться что-то вывести:
CALL 3435 ; очищаем экран
LD A,2 ; заносим в аккумулятор номер потока
CALL 5633 ; устанавливаем поток
LD A, "*" ; в рег. 'A' заносим символ '*'
CALL 16 ; вызов подпрограммы печати
RET ; возвращаемся
Вместо 'CALL 16' можно писать 'RST 16'. RST - это команда пе-
рехода на строго фиксированный адрес, (например не допустима за-
пись "RST 17"), которая и в памяти занимает меньше байт и выпол-
няется быстрее.
Вместо символов в аккумулятор можно заносить и коды этих сим-
волов, без кавычек. Например, если подставить в четвертую строку
нашей программы: "LD A,65" - на экране появиться буква "А", т.к
65 - это десятичный код буквы "А".
Теперь, как я и обещал, поговорим о программах-ассемблерах.
Если у Вас "Спектрум-48К" - можно воспользоваться программами
типа GENS-3, GENS-4, ZEUS. Владельцам же машин с памятью 128К и
выше повезло больше: их вниманию предлагается свыше около раз-
личных ассемблеров, основные различия между которыми сводятся к
объему предоставляемого сервиса и некоторых дополнительных
удобств, как-то скорость ассемблирования и т.п.
Начинающим кодерам вполне подойдут ассемблеры: TASM, ZX-ASM.
Более продвинутые пользователи по достоинству оценят XAS, ALASM,
STORM. Вообще, выбор конкретной ассемблируещей программы сугубо
индивидуален - это скорее дело вкуса. Позднее, набрав необходи-
мого опыта, можно будет попробовать различные ассемблеры, найдя
"свою" программу, работа в которой будет приносить удовольствие.
Как правило наряду с ассемблерами Вам понадобятся и программы
дизассемблеры (мониторы-отладчики). Среди множества таких прог-
рам, заслуженной популярностью пользуется монитор STS. Он неза-
меним при взломе, отладке, трассировке, содержит богатые сервис-
ные возможности. Подробный разбор этих и других средств мы оста-
вим на следующие выпуски.
До встречи в следующем номере!
Другие статьи номера:
Ассемблер - Запись чисел, пересылка числа в регистр, запись числа в регистровую пару, скролирование экрана, установка вывода на
экран, очистка экрана.
|
|
|
|
|
|
|
|
|
|
|
|
|