Nicron
#10
05 декабря 1996 |
|
Программирование - курс изучения ассемблера от Wlodek Black, продолжение.
╔═══════════════════════════════════════════════════════════╗ ║ ▒▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒▒▒ ▒▒▒▒ ▒▒▒▒▒ ║ ║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║ ║ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ ▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒▒▒▒ ║ ║ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ▒▒ ║ ║ ▒▒ ▒▒ ▒▒▒ ▒▒▒ ▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒▒ ▒▒ ▒▒ ▒▒▒▒ ▒▒ Z80 ║ ╚═══════════════════════════════════════════════════════════╝ (Продолжение). (C) WLODEK BLACK Логические команды. Логические операции всегда выполняются побитно. Операнды рассма- риваются как наборы по 8 бит, без увязки их в цельный байт. Из этого, кстати, вытекает, что в логических операциях никогда не случается переноса. И действительно, на выходе из всех логичес- ких операций флаг C=0. Логическое "И": AND. Таблица истинности для AND: 1 AND 1 = 1 1 AND 0 = 0 0 AND 1 = 0 0 AND 0 = 0. В мнемонике указывается только второй операнд: AND E AND (IX+0) AND A. Команда AND A не изменяет содержимого аккумулятора,но влияет на флаги. Этой командой пользуются, чтобы выяснить (по флагу Z), равен ли A нулю; также ее применяют для сброса флага C. По прямому назначению AND употребляется, например, для так назы- ваемого маскирования. AND %00011111, например, оставит неизмен- ными 5 младших бит, а 3 старших будут сброшены в 0. Логическое "ИЛИ" - OR. Таблица истинности для OR: 1 OR 1 = 1 1 OR 0 = 1 0 OR 1 = 1 0 OR 0 = 0. Примеры мнемоник: OR A OR (HL) OR 0A5H. Команда OR A аналогична по использованию, что и AND A. Какой из них пользоваться - вопрос личного вкуса программиста. Логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ" - XOR. Исключающее ИЛИ - функция, дающая 1 только в случае, если оба операнда разные. Таблица истинности для XOR: 1 XOR 1 = 0 1 XOR 0 = 1 0 XOR 1 = 1 0 XOR 0 = 0. Нетрудно убедиться, что XOR над самим собой всегда дает 0. Кома- нда XOR A эффективно сбрасывает в нуль аккумулятор, чем и снис- кала популярность у программистов. Еще одно ценное свойство XOR находит широкое применение: два ра- за подряд XOR с одним и тем же вторым операндом дает исходное число. В машинной графике пользуются чрезвычайно простым и эф- фективным приемом: чтобы бесследно удалить наложенное на фон изображение, его нужно... наложить еще раз. Оба раза по логике XOR, разумеется. Команда инверсии аккумулятора. Инверсия означает побитное переворачивание байта. Все единицы в байте станут нулями, а все нули - единицами. Флаги команда не трогает. Мнемоника: CPL (от ComPLement - противоположный). Адресация - неявная к аккумулятору. В сочетании с логическими операциями CPL можно рассматривать как функцию NOT - отрицание. Лирическое отступление. Теоретически доказано, что любой, даже самый сложный, алгоритм можно свести к конечной последовательно- сти операций "И" и "НЕ". Операции над числами в десятичной системе счисления. Следует сразу заявить: десятичная арифметика неэффективна. Нали- чие в системе команд процессора хоть какой-то десятичной арифме- тики объясняется лишь "атавизмом" 70-х годов, когда область при- менения микропроцессоров еще только приобретала первые смутные очертания. В настоящее время десятичная система в микропроцессо- рных системах используется лишь на этапе ввода-вывода данных, то есть на стыке человек-машина. Вся внутренняя арифметика в Бейсике, других языках высокого уровня, прикладных расчетных программах ведется в двоичной системе. Двоично-десятичная форма представления чисел. Число в двоично-десятичной системе представляется в виде 4-бито- вых групп, в каждой из которых помещается одна цифра от 0 до 9. В байте, таким образом, умещаются 2 цифры, а максимальное значе- ние байта равно 99: 10011001BD=99. Двоично-десятичное преобразование данных. Команда DAA (Denary Adjust Accumulator) преобразует число в ак- кумуляторе из обычного 8-разрядного представления в двоично-де- сятичную форму. Например, 66 в двоичном виде равно 01000010, а в двоично-десятичном - 01100110. Чтобы сложить два двоично-деся- тичных числа,нужно сложить их обычным образом через ADD или ADC, а затем выполнить команду DAA. Результат после этого окажется также двоично-десятичным. Аналогично выполняется и вычитание. Команда DAA автоматически распознает предыдущее действие по фла- гу N (это непроверяемый программно флаг, поэтому он не встречал- ся нам в командах перехода по условию)и пригодна и для сложения, и для вычитания. Из-за того, что правильная работа команды DAA возможна только при однозначном установлении факта предыдущего сложения или вычитания,возникают некоторые сложности для случая преобразования числа, не являющегося результатом арифметическо- го действия. Такой случай имеет место, в частности, при первона- чальном обращении к данному, когда исходное двоичное число за- гружается в регистр из памяти и его нужно преобразовать в двоич- но-десятичное. Если сразу подать команду DAA, то она, даже выпо- лнив правильно преобразование, может неверно установить флаги. DAA не изменяет значение флага признака вычитания N,и неправиль- ное значение этого флага может проследовать далее. Во избежание неприятностей перед первым использованием DAA следует воздейст- вовать на флаг N, выполнив,например, фиктивное сложение с нулем: ADD A,0. Как можно видеть, двоично-десятичная арифметика действительно малоэффективна. Байт используется не полностью (99 вместо 255), программирование громоздко... И, наконец, нет команды, обратной DAA. Команды 16-разрядной арифметики. В роли 16-разрядного аккумулятора выступает пара HL (реже - ре- гистры IX, IY). ADD HL,DE ADC HL,DE ADD IX,DE ADD IY,DE SBC HL,DE ADD HL,BC ADC HL,BC ADD IX,BC ADD IY,BC SBC HL,BC ADD HL,HL ADC HL,HL ADD IX,IX ADD IY,IY SBC HL,HL ADD HL,SP ADC HL,SP ADD IX,SP ADD IY,SP SBC HL,SP. Нет команд ADC для индексных регистров. Нельзя сложить IX или IY с HL. Нет команды SUB вообще и SBC - для IX, IY. Влияние команд на флаги: ADD HL,rr, ADD I*,rr - флаг переноса C; ADC - все флаги; SBC - все флаги. Команды инкремента и декремента существуют для всех пар и индек- сных регистров. INC HL; DEC IX и т.д. Команды INC и DEC для 16-разрядной пары вообще не влияют на флаги. Обычно эти команды используются для приращения всевозможных указателей адресов или счетчиков; влия- ние на флаги в таких ситуациях было бы только мешающим фактором. Умножение и деление. Команды MUL (multiple - умножить) и DIV (divise - разделить) мо- жно использовать в программах, работающих под управлением DOS, позволяющей устанавливать текущую дату. Единственный приемлемый вариант даты - 01-е число 04-го месяца любого года. В другие дни корректное исполнение этих команд возможно лишь после N-го стакана: DIV A,3 - сообразить на троих. При многократном повто- рении последнего устанавливается флаг переполнения P/V. При еще более многократном повторении возможны сбои динамического ОЗУ (так называемые провалы памяти). Дальнейшее злоупотребление при- веденной конструкцией способно привести уже к серьезной аварии - перегреву процессора до уровня белого каления (так называемая белая горячка). А если серьезно, то увы - умножения и деления в готовом виде нет. Отчасти их, бывает, удается заменить командами сдвига, но в общем случае - пишутся объемистые процедуры для программной реализации умножения и деления. [ Продолжение следует ].
Другие статьи номера:
Вступление - содержание номера. |
BBS - список станций BBS ZXNet. |
Железо - обзор микропроцессора Zilog Z380, продолжение. |
Программирование - курс изучения ассемблера от Wlodek Black, продолжение. |
Графика - картинкa АNSI графики. |
Поиск - поиск игр, программ. |
Юмор - приколы и случаи из жизни. |
Реклама - реклама и объявления. |
Обратная связь - контакты редакции. |
Похожие статьи:
В этот день... 21 ноября