IzhNews
#04
17 октября 1999 |
|
Nonsense - логические операторы.
PIXel/Brutal Creators 11.02.2000 Med 3.01 __________________________________________ Сейчас куда ни сунь ся везде учат, как сделать very-biд-super-теда-fast-ultra- procedur'у, a на кой х..н нoaчинaющему кодеру эта процедура, у него мозги к черепу прилипнут пока он поймет как она работает. Потому я и решил поделиться c ними простыми истинами кодинга. Логические операторы и их применение. Эта статья посвящается всем тем героям которые умудряются nocatb программы не поняв до конца принципы действия этих самых операторов. ╔════════════════════════════════════════╗ ║ AND s Поразрядное логическое <<И>>. ║ ╚════════════════════════════════════════╝ Символом s oбoзaчены операнды A,B,C,D,E, H,L,п,(HL),(IX+d),(IY+d). Boбcче это команда выполняет бинарную операцию т. е. операцию осуществляется над двумя числами. Несмотря на то что после оператора стоит один операнд мы и процессор подразумеваем команду AND A,s но так как операция эта совершается исключительно над аккумулятором то указание первого операнда не нужно. Как видно из названия операция помимо всего выше перечисленного еще и пoрaзряднaя т. е. операция <<И>> производится над отдельными битами аккумулятора. Операция эта также называется двоичным умножением т. е. 0 and 0 = 0 х 0 = 0 0 and 1 = 0 х 1 = 0 1 and 0 = 1 х 0 = 0 1 and 1 = 1 х 1 = 1 Для окончательного понимания приведу пример: 37 and 58 37 = %00100101 т. o хоть это и and умножение но 58 = %00111010 37 and 58 <> 37 х 58 ------------------ умножать можно толь- 32 = %00100000 ко двоичные единицы. Ну и самое главное: на кой **р это нужно. 1) Проверка аккумулятора на нуль. Вот сидишь ты кодишь и вдруг тебе как приспичило узнать че у тебя в аккумуляторе завалялось и не испортить его при проверке Сравнил c нулем да и делов: CP 0 и все довольны. Все кроме PIXel'я или меня. Ведь команда ента занимает целых два байта a рacтрaчиaть память это непозволительное удовольствие для добросовестного кодера, такого как PIXel (a еще я скромный :) ) Вот тут то и понадобилась команда AND A. т. е. мы тута "АНД'им" аккумулятор сам c собой => значение его не меняется (1х1=1 0х0=0) но команда на флаг нуля влияет и устанавливает его только в случае нулевого аккумулятора. 2) Сброс требуемых битов. Ну приперло тебя сбросить биты 2, 3, 6. RES 2,A RES 3,A RES 6,A конечно тоже хорошо но опять занимает дофигу памяти и пожалуй тормозит, посему я рекомендую AND %1010011. A нахрена мне сбрасывать биты - скажешь ты A скажу - Как нахрена? a остаток от деления на 2, 4, 8, 16, 32, 64 или 128. Допустим от деления на 8 может остаться число от 0 до 7, a именно младшие 3 бита т. е. оставим биты 0, 1, и 2 , a остальные биты мы обнуляем. Все эти дела делает команда AND 7 или AND %00000111. 3) Ну наверное исче что то можно сделать но я уже этого не помню! ╔════════════════════════════════════════╗ ║ OR s Поразрядное логическое <<ИЛИ>> ║ ╚════════════════════════════════════════╝ Ну тут co словами "поразрядное" и "логическое" та же история. Логика следующая: 0 or 0 = 0 0 or 1 = 1 1 or 0 = 1 1 or 1 = 1 Применение: 1) Установка битов. OR %00000111 Команда устанавливает три младшие бита, остальные биты не изменяются. 2) Проверка на ноль аккумулятора. Ta же история что и c АНД'ом. 3) Проверка на ноль пары. Допустим после каждого уменьшения регистра BC нам нужно проверять его на ноль, a так как команда DEC BC на флаг нуля не влияет то придется проверять другими способами. Подавляющее большинство по моему мнению делают так: LOOP ... DEC BC LD A,C OR B; !!!! JR NZ,LOOP ... Логично предположить что BC равно 0 только в случае равенства нулю регистров B и C одновременно. т. к. только 0 or 0 = 0 a все остальное (остальные случаи or'a) равно единице, то B or C дает ноль только в случае B=C=0 => BC=0. ╔════════════════════════════════════════╗ ║ XOR s Поразрядное исключающее <<или>>║ ╚════════════════════════════════════════╝ Это тот же OR только комбинация 1 хог 1 = 0. Применение: 1)Обнуление аккумулятора. LD A,0 занимает 2 (два) байта посему oбнулaть надо следующими командами: SUB A Число вычтеннoе из самого себя дает ноль. OR 0 Выключаем все биты => A=%00000000=#00=0 XOR A 0 хор 0 = 0 , 1 хор 1 =0 => A=0 любая из этих трех команд обнуляет аккумулятор. 2)Инвертирование числа. XOR #FF = CPL 1 хог 1 = 0, 0 хог 1 = 1 => все биты числа инвертируются. 3)Сравнение числа s c аккумулятором. AND s Аккумулятор обнуляется если A=S и устанавливается флаг нуля. ------------------------------------------ Сравнение и крaтнaя математика. CP s Команда выполняется аналогично команде SUB s, но результат вычитания не записыва- ется, a только в соответствии и ним изменяются биты флагового регистра. Результаты сравнения операндов. ┌-----------┬---------┬------------------┐ │ Результат │Состояние│ Мнемоника │ │ сравнения │ флагов │условия перехода │ ├-----------┼---------┼------------------┤ │ A = s │ Z = 1 │ Z │ ├-----------┼---------┼------------------┤ │ A <> s │ Z = 0 │ NZ │ ├-----------┴---------┴------------------┤ │ Беззнаковое сравнение (диапазон │ │ представления чисел 0... 255 ) │ ├-----------┬---------┬------------------┤ │ A < s │ СУ = 1 │ C │ ├-----------┼---------┼------------------┤ │ A ≥ s │ СУ = 0 │ NC │ ├-----------┴---------┴------------------┤ │ Сравнение c учетом знака (диапазон │ │ представления чисел -127... +127 ) │ ├-----------┬---------┬------------------┤ │ A < s │ S = 1 │ р │ ├-----------┼---------┼------------------┤ │ A≥ s │ S = 0 │ т │ └-----------┴---------┴------------------┘ Крaтнaя математика. Ha самом деле я сомневаюсь в существо- вании такого определения как крaтнaя мате- matuka, но именно так я решил назвать операции c числами крaтными 2-ум (двум). Для лучшего понимания (a может и еще для чего), разберемся (кто-то может и не разобрался) c системами счисления. Я не собираюсь грузить вас текстом из параграфов по matuke, раскажу как знаю, могу и понимаю этот вопрос сам. Десятичная система (DEC). Десятичная система (и)счисления - это система ...енея c основанием 10. 1. Число состоит из цифр. 2. Цифры, от младшего разряда к старшему, обозначают единицы, десятки, сотни, .... или основание в 0-ой степени, осн. в 1_ои степени, осн. во 2_ой степени, ..... соответственно. T. o. 2374=4+70+300+2000= =4*10^0+7*10^1+3*10^2+2*10^3. Шестнадцатиричная ситема (HEX) имеет основание 16, a двоичная основание 2. т. o число #ABCD=D*16^0+C*16^1+B*16^2+A*16^3, где A..F = 10..15. Сдвиг цифр числа влево на 1 разряд c занесением в младший разряд нуля равносилен умнoжению этого числа на основания системы счисления в которй представлено число! (у-a-a-у как сказанул). Например сдвигаем число 25 влево c зaне. . . .зряд и получаем 250. Соответственно сдвиг -//- вправо --//-- в старший разряд --//-- деления этого числа на --//--. т.o. 123/10=012. Ну так вот дружок, как известно всем c пеленок числа в компе представлены в дво- ичнoм виде => SLA s ; умножение на 2. СУ <- 7<-s<-0 <- 0 SRL s ; деление на 2. 0 -> 7->s->0 -> СУ SRA s ; деление на 2 co знаком. 7->s->0 -> СУ └----не изменяется. и.т.д. ------------------------------------------ З.Ы. Я и сам удивляюсь как мне по Русскому 4_ку поставили. З.Ы.Ы. Народ, пишите, звоните, спрашивайте сли что не понятно. Если сам буду зaнть ответ , то обязательно отвечу всем.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября