Ассемблер В Картинках
для "чайников" и не только.
Автор:Михаил Спицын.
________________________________
Мы начинаем цикл статей по
ассемблеру для начинающих, с
целью побудить людей к изучению
данного языка.
В этих статьях мы раскажем о
строении компьютера, графике,
звуке (48 и 128) и, естественно,
о самом ассемблере.
Итак...
1.ПРОЦЕССОР КОМПЬЮТЕРА
Как человек, так и любой ком-
пьютер имеет мозг; этим мозгом
у компьютера является процессор.
А что же за "мозг" у нашего
Speccy?
"Мозг" Spectrum'а - это про-
цессор Z80 фирмы ZILOG. Процес-
сор Z80 является псевдошестнад-
цатиразрядным. Как это понять?
Дело в том, что каждый про-
цессор может понимать числа
определенной разрядности. К при-
меру восьмиразрядное число запи-
сывается как комбинация из
восьми двоичных нулей и единиц
и может обозначать любое целое
число от 0 до 255.
Каждый разряд такого числа,
это степень двойки, например
двоичное число 01100110 соот-
ветствует десятичному 102, а
перевести из десятичной в двоич-
ную систему можно так:
2^7*0+2^6*1+2^5*1+2^4*0+2^3*0+
2^2*1+2^1*1+2^0*0=102
Продолжим. Z80 имеет двадцать
восьмиразрядных регистров (ре-
гистр это ячейка внутри процес-
сора, куда можно записывать чис-
ла) и все регистры объединяются
в пары, каждая из которых так и
называется: "регистровая пара".
Вот мы и добрались до ответа
на наш вопрос, - 8+8=16, следо-
вательно регистровая пара дает
шестнадцатиразрядное число.
Теперь о том, почему Speccy
не просто шестнадцатиразрядный,
а "псевдо" такой.
Итак регистры нам нужны для
того, чтобы выполнять над ними
арифметические операции, а имен-
но сложение и вычетание. К сожа-
лению наш маленький Speccy не
умеет делить и умножать, а уж ни
о каких более "страшных" дейст-
виях и говорить не приходится.
Так вот, процесор может скла-
дывать/вычитать как регистры,
так и регистровые пары, т.е. вы-
полнять арифметические операции
над восьми и шестнадцатиразряд-
ными числами, а так как регистры
имеют лишь восемь разрядов (это
вам не IBM), то и процессор
"псевдошестнадцатиразрядный".
Вот таблица всех регистров с
их назначением:
╔═══════╦══════════════════════╗
║Регистр║Основное назначение ║
╠═══════╬══════════════════════╣
║ A ║ 8-ый аккумулятор ║
║ F ║ Флаговый регистр ║
║ B ║ 8-ый счетчик ║
║ BC ║ 16-ый счетчик ║
║ DE ║ Регистр приемник ║
║ HL ║ 16-ый аккумулятор ║
║ IX ║ Индексный регистр ║
║ IY ║ Системный индекс ║
║ I ║ Вектор прерывания ║
║ R ║ Регистр регенерации ║
║ SP ║ Вершина стека ║
║ PC ║ Счетчик команд ║
╠═══════╩══════════════════════╣
║ Примечание: ║
║ 8-ый - восьмиразрядный ║
╚══════════════════════════════╝
2.ПРОСТЕЙШИЕ КОМАНДЫ
Теперь рассмотрим простейшие
операции ассемблера, используя в
качестве примера бейсик, с кото-
рым, я надеюсь, Вы знакомы.
Первое, что нужно сделать для
изучения ассемблера - это выб-
рать себе "оболочку-ассемблер",
в которой Вы будете работать.
Могу Вам посоветовать TASM128
если у Вас ZX128 или, для ZX48,
ZEUS ASSEMBLER.
Итак приступим :
BASIC ASSEMBLER
10 LET A=1 LD A,1
20 STOP RET
Команда "LET" эквивалентна
команде "LD" , если Вы наберете
и запустите ее, то в регистр "A"
будет занесена единица. По ко-
манде "RET" произойдет выход в
вызывающую программу (если прог-
рамма была запущена из BASIC'а,
то по команде "RET" она вернет
управление BASIC'у).
Во все регистры, за исключе-
нием "F" и "PC", можно заносить
числа, например:
LD A,1 ; 1-->A
LD B,15 ; 15-->B
LD HL,16384 ; 16384-->HL
LD IX,50000 ; 50000-->IX
Но обычно программисту не
хватает регистров, тогда прихо-
дится использовать память компь-
ютера, например:
BASIC ASSEMBLER
LET A=PEEK 23556 LD A,(23556)
После выполнения этой команды
в "A" будет находиться число,
записаное в указанной ячейке па-
мяти, а учитывая то, что в этой
ячейке BASIC хранит код послед-
ней нажатой клавиши, данная ко-
манда не лишена практического
смысла.
Также используются и обратные
команды :
BASIC ASSEMBLER
POKE 23607,A LD (23607),A
Но часто приходиться записы-
вать/считывать значение ячейки,
адрес которой рассчитывается
или берется из таблицы. В таком
случае используются следующие
команды:
ЗАПИСЬ ЧТЕНИЕ
LD (BC),A LD A,(BC)
LD (DE),A LD A,(DE)
LD (HL),0 LD E,(HL)
Примечание: Хочу заметить,
что не сушествует команды пря-
мой записи числа в ячейку па-
мяти, как и записи из ячейки
в ячейку.
А теперь я хочу привести про-
грамму, которая печатает любое
сообщение (она аналогична опе-
ратору "PRINT").
В программе используется ко-
манда "CALL", для вызова проце-
дуры ПЗУ, эту команду можно
сравнить с командой BASIC'а
"GO SUB", например:
BASIC ASSEMBLER
10 GO SUB 999 CALL M1
.... ....
999 LET A=1 M1 LD A,1
1000 RETURN RET
Здесь "М1"-это метка, вместо
которой при ассемблировании
программы будет поставлен соот-
ветствующий адрес.
ПРИМЕР ПРОГРАММЫ
После точки с запятой в ас-
семблере, также как после REM
в бейсике пишутся комментарии.
;Программа печати текстовых
;сообщений. -= PRINT TEXT =-
ORG 30000
ENT
START LD A,1 ;Открываем 1
CALL #1601;канал для
;печати.
LD DE,TEXT;Адрес текста
LD BC,LEN ;Длина текста
CALL #203C;Печать текста
RET
TEXT DEFB 22 ;Код "AT"
DEFB Y,X ;Позиция печати
DEFM "HELLO, EVEREBODY!"
LEN EQU 20 ;LEN=20
Y EQU 10 ;Y=10
X EQU 5 ;X=5
Эта программа аналогична
строке BASIC'a:
10 PRINT AT 10,5;"HELLO,
EVEREBODY!"
В следующем номере я расскажу
об арифметических командах и ко-
мандах сравнения, и приведу при-
мер маленькой игры.
До встречи !
________________________________