Программистам - Ассемблер для чайников

Ассемблер В Картинках  для "чайников" и не только.      Автор:Михаил Спицын.________________________________   Мы начинаем цикл статей поассемблеру  для  начинающих, сцелью побудить людей к изучениюданного языка.   В этих статьях мы раскажем остроении  компьютера,  графике,звуке (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--&#62;A    LD B,15     ; 15--&#62;B    LD HL,16384 ; 16384--&#62;HL    LD IX,50000 ; 50000--&#62;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!"   В следующем номере я расскажуоб арифметических командах и ко-мандах сравнения, и приведу при-мер маленькой игры.   До встречи !________________________________