Из газеты IzhNews #4, Ижевск, 02.2000 XOR AND OR ??? PIXel/Brutal Creators 11.02.2000 Med 3.01 __________________________________________ Сейчас куда ни сунь ся везде учат, как сделать very-big-super-mega-fast-ultra- procedur'у, а на кой х..н ноачинающему кодеру эта процедура, у него мозги к черепу прилипнут пока он поймет как она работает. Потому я и решил поделиться с ними простыми истинами кодинга. Логические операторы и их примeнение. Эта статья посвящается всем тем героям которые умудряются посать программы не поняв до конца принципы действия этих самых операторов. +========================================+ | AND s Поразрядное логическое <<И>>. | +========================================+ Символом s обозачены операнды A,B,C,D,E, H,L,n,(HL),(IX+d),(IY+d). Вобсче это команда выполняет бинарную операцию т. е. операцию осуществляется над двумя числами. Несмотря на то что после оператора стоит один операнд мы и процессор подразумеваем команду AND A,s но так как операция эта совершается исключительно над аккумулятором то указание первого операнда не нужно. Как видно из названия операция помимо всего выше перечисленного еще и поразрядная т. е. операция <<И>> производится над отдельными битами аккумулятора. Операция эта также называется двоичным умножением т. е. 0 and 0 = 0 x 0 = 0 0 and 1 = 0 x 1 = 0 1 and 0 = 1 x 0 = 0 1 and 1 = 1 x 1 = 1 Для окончательного понимания приведу пример: 37 and 58 37 = %00100101 т. о хоть это и and умножение но 58 = %00111010 37 and 58 <> 37 х 58 ------------------ умножать можно толь- 32 = %00100000 ко двоичные единицы. Ну и самое главное: на кой **р это нужно. 1) Проверка аккумулятора на нуль. Вот сидишь ты кодишь и вдруг тебе как приспичило узнать че у тебя в аккумуляторе завалялось и не испортить его при проверке Сравнил с нулем да и делов: СР 0 и все довольны. Все кроме PIXel'я или меня. Ведь команда ента занимает целых два байта а растрачиать память это непозволительное удовольствие для добросовестного кодера, такого как PIXel (а еще я скромный :) ) Вот тут то и понадобилась команда AND А. т. е. мы тута "АНД'им" аккумулятор сам с собой => значение его не меняется (1х1=1 0х0=0) но команда на флаг нуля влияет и устанавливает его только в случае нулевого аккумулятора. 2) Сброс требуемых битов. Ну приперло тебя сбросить биты 2, 3, 6. RES 2,A RES 3,A RES 6,A конечно тоже хорошо но опять занимает дофигу памяти и пожалуй тормозит, посему я рекомендую AND %1010011. A нахрена мне сбрасывать биты - скажешь ты А скажу - Как нахрена? а остаток от деления на 2, 4, 8, 16, 32, 64 или 128. Допустим от деления на 8 может остаться число от 0 до 7, а именно младшие 3 бита т. е. оставим биты 0, 1, и 2 , а остальные биты мы обнуляем. Все эти дела делает команда AND 7 или AND %00000111. 3) Ну наверное исче что то можно сделать но я уже этого не помню! +========================================+ | OR s Поразрядное логическое <<ИЛИ>> | +========================================+ Ну тут со словами "поразрядное" и "логическое" та же история. Логика следующая: 0 оr 0 = 0 0 or 1 = 1 1 or 0 = 1 1 or 1 = 1 Применение: 1) Установка битов. OR %00000111 Команда устанавливает три младшие бита, остальные биты не изменяются. 2) Проверка на ноль аккумулятора. Та же история что и с АНД'ом. 3) Проверка на ноль пары. Допустим после каждого уменьшения регистра ВС нам нужно проверять его на ноль, а так как команда DEC BC на флаг нуля не влияет то придется проверять другими способами. Подавляющее большинство по моему мнению делают так: LOOP ... DEC BC LD A,C OR B; !!!! JR NZ,LOOP ... Логично предположить что ВС равно 0 только в случае равенства нулю регистров В и С одновременно. т. к. только 0 or 0 = 0 а все остальное (остальные случаи or'a) равно единице, то В or С дает ноль только в случае В=С=0 => ВС=0. +========================================+ | XOR s Поразрядное исключающее <<или>>| +========================================+ Это тот же OR только комбинация 1 xor 1 = 0. Применение: 1)Обнуление аккумулятора. LD A,0 занимает 2 (два) байта посему обнулать надо следующими командами: SUB A Число вычтенное из самого себя дает ноль. OR 0 Выключаем все биты => А=%00000000=#00=0 XOR A 0 хор 0 = 0 , 1 хор 1 =0 => А=0 любая из этих трех команд обнуляет аккумулятор. 2)Инвертирование числа. XOR #FF = CPL 1 xor 1 = 0, 0 xor 1 = 1 => все биты числа инвертируются. 3)Сравнение числа s с аккумулятором. AND s Аккумулятор обнуляется если A=S и устанавливается флаг нуля. ------------------------------------------ Сравнение и кратная математика. CP s Команда выполняется аналогично команде SUB s, но результат вычитания не записыва- ется, а только в соответствии и ним изменяются биты флагового регистра. Результаты сравнения операндов. +-----------+---------+------------------+ | Результат |Состояние| Мнемоника | | сравнения | флагов |условия перехода | +-----------+---------+------------------| | А = s | Z = 1 | Z | +-----------+---------+------------------| | A <> s | Z = 0 | NZ | +-----------+---------+------------------| | Беззнаковое сравнение (диапазон | | представления чисел 0... 255 ) | +-----------+---------+------------------| | A < s | CY = 1 | C | +-----------+---------+------------------| | A т s | CY = 0 | NC | +-----------+---------+------------------| | Сравнение с учетом знака (диапазон | | представления чисел -127... +127 ) | +-----------+---------+------------------| | A < s | S = 1 | p | +-----------+---------+------------------| | Aт s | S = 0 | m | +-----------+---------+------------------+ Кратная математика. На самом деле я сомневаюсь в существо- вании такого определения как кратная мате- матика, но именно так я решил назвать операции с числами кратными 2-ум (двум). Для лучшего понимания (а может и еще для чего), разберемся (кто-то может и не разобрался) с системами счисления. Я не собираюсь грузить вас текстом из параграфов по матике, раскажу как знаю, могу и понимаю этот вопрос сам. Десятичная система (DEC). Десятичная система (и)счисления - это система ...енея с основанием 10. 1. Число состоит из цифр. 2. Цифры, от младшего разряда к старшему, обозначают единицы, десятки, сотни, .... или основание в 0-ой степени, осн. в 1_ои степени, осн. во 2_ой степени, ..... соответственно. Т. о. 2374=4+70+300+2000= =4*10^0+7*10^1+3*10^2+2*10^3. Шестнадцатиричная ситема (НЕХ) имеет основание 16, а двоичная основание 2. т. о число #ABCD=D*16^0+C*16^1+B*16^2+A*16^3, где A..F = 10..15. Сдвиг цифр числа влево на 1 разряд с занесением в младший разряд нуля равносилен умножению этого числа на основания системы счисления в которй представлено число! (у-а-а-у как сказанул). Например сдвигаем число 25 влево с зане. . . .зряд и получаем 250. Соответственно сдвиг -//- вправо --//-- в старший разряд --//-- деления этого числа на --//--. т.о. 123/10=012. Ну так вот дружок, как известно всем с пеленок числа в компе представлены в дво- ичном виде => SLA s ; умножение на 2. CY <- 7<-s<-0 <- 0 SRL s ; деление на 2. 0 -> 7->s->0 -> CY SRA s ; деление на 2 со знаком. 7->s->0 -> CY +----не изменяется. и.т.д. ------------------------------------------ З.Ы. Я и сам удивляюсь как мне по Русскому 4_ку поставили. З.Ы.Ы. Народ, пишите, звоните, спрашивайте сли что не понятно. Если сам буду занть ответ , то обязательно отвечу всем. ____________________________________________