AND
AND (и, читается «энд») — стандартное слово Каллисто. 32-битное поразрядное логическое умножение.
AND ( n1 n2 −− i ) 32−битное логическое умножение (и). i := n1 & n2
Выполняет 32-битное логическое «и» (конъюнкцию) двух целых чисел n1 и n2, заносит в стек результат i в дополнительном коде.
Другими словами, каждый из 32 битов числа n1 сравнивается с соответствующим битом числа n2 и, если хотя бы один из битов равен нулю, в соответствующий бит числа i заносится ноль. Если оба бита равны единице, соответствующий бит результата i тоже будет равен единице.
Ввод слова AND
В режиме ЛАТ последовательно нажмите три клавиши ШГ← 4 K
AND в стандарте ANS Forth
6.1.0720 AND CORE ( x1 x2 -- x3 ) x3 поразрядное логическое "и" x1 и x2.
История
В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем IBM 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово AND
В отечественных калькуляторах команда AND претерпела большие изменения. В советских ПМК команда К∧ осуществляла побитовое логическое и во всех тетрадах мантиссы в формате bcd, кроме старшей. В «Электронике МК-152» команда получила более практичное назначение и новое имя K AND, сохранив свой код операции. Команда K AND стала работать с 8-битными двоичными числами. Именно на её основе удалось реализовать стандартное слово AND для работы с 32-битными целыми.
AND в предыдущем стандарте Forth-83 (англ.)
AND 16b1 16b2 -- 16b3 79 16b3 is the bit-by-bit logical 'and' of 16b1 with 16b2.
AND в стандарте Forth-79 (англ.)
AND n1 n2 -- n3 183 Leave the bitwise logical 'and' of n1 and n2.
AND в fig-FORTH Release 1 glossary, май 1979 (англ.)
AND n1 n2 --- n3 L0 Leave the bitwise logical and of n1 and n2 as n3.
Реализация
В Каллисто для записи 32-битных целых чисел в десятичном стеке используется дополнительный код (англ. two's complement). На входе слово AND принимает как 32-битные целые в дополнительном коде, так и беззнаковые целые. Результат i всегда представлен в дополнительном коде и отрицателен, если старший бит в нём установлен.
AND даёт правильный результат побитового «и» над числами любой разрядности, вплоть до 32, включая 16-, 8- и 1-битные числа. Если один из аргументов разрядности меньшей, чем 32, представлен в беззнаковом виде, результат i также выдаётся в беззнаковом виде — положительным числом или нулём. Если оба аргумента в дополнительном коде, результат также будет в дополнительном коде.
Последовательности слов 65535, AND и 255 AND позволяют выделить младшее 16-битное слово и младший байт числа, находящегося на вершине стека.
Также слово AND можно использовать для логической операции «и» над флагами, если значение «истина» представляется числом -1. Все стандартные слова Каллисто, возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина».
В Каллисто 1.0 слово AND реализовано с использованием команды ЭКВМ K AND:
1461 ;#AND 1462 ; AND ( n1 n2 −− i ) 32−битное логическое умножение (и). i := n1 & n2 1463 LSAND: .DB 3 1464 .TEXT "AND" ; ( a b −− a & b ) 1465 .DW LABS 1466 SAND: .DW JSAND ; 32−битное побитовое логическое умножение (И). 1467 JSAND: RM3 MB 1 M1 + MA M3 1468 CX M8 4 M0 1469 KRMB PGSB Norm32 MB 1470 KRMA PGSB Norm32 MA 1471 GOTO SANDIN 1472 SANDL: M8 RM1 RME ∗ M1 1473 RMA 1474 SANDIN: ENT RME / FANS <−> KINT MA ∗ − 1475 RMB ENT RME / FANS <−> KINT MB ∗ − 1476 KAND RM1 ∗ RM8 + 1477 FL0 SANDL 1478 PGSB Sign32 1479 PKM03 KGOTO9 1480 1481 ; Приводит 32−битное число в беззнаковый вид. 1482 Norm32: FX<0 N32A 1483 65536 FX^2 + ; FX^2 vs ENT ∗ 1484 N32A: RTN … 1506 ; Преобразование 32−битного беззнакового в 32−битное знаковое. 1507 Sign32: 1508 32768 ENT 65536 ∗ ; 2 147 483 648 1509 − FX<0 S32Fix 1510 FANS + RTN ; Восстановить исходное число 1511 S32Fix: FANS − RTN ; Преобразовать
Реализация из SP-Forth 4.20:
CODE AND ( x1 x2 -- x3 ) \ 94 \ x3 - побитовое "И" x1 и x2. AND EAX, [EBP] LEA EBP, 4 [EBP] RET END-CODE
Советская реализация
Слово AND в ФОРТ-ЕС было примитивом. Вот его описание и определение:
AND W1,W2->W3 ПОРАЗРЯДНОЕ ЛОГИЧЕСКОЕ "И" 13 Экран номер 13 ( 31.03.86 AND OR XOR NOT 0= 0< ) CODE AND ( W1,W2->W3) 14 LHRW12 BAL, RW1 RW2 NR, POPPUT1 B, END-CODE
В FORTH ИТЭФ слово AND также было примитивом, вот его определение:
HEAD 203Q,'AN',304Q,$AND ; AND POP AX POP CX AND AX, CX ENDA: PUSH AX NEXT
Ссылки
- Исходный текст слова AND в Каллисто Классик 1.0
- См. слова OR, XOR и NOT
- Конъюнкция, Логика высказываний и Битовые операции в Википедии
- Слово AND в стандарте ANS Forth (англ.)
- Слово AND в черновике Forth 200x (англ.)
- КОМПЬЮТЕР "ПРИНИМАЕТ РЕШЕНИЯ" в книге Л.Броуди «Начальный курс программирования на языке Форт»
- ЧИСЛО ТИПОВ ЧИСЕЛ в книге Л.Броуди «Начальный курс программирования на языке Форт»
- Decisions, Decisions… в книге Leo Brodie Starting Forth (англ.)
- A Number of Kinds of Numbers в книге Leo Brodie Starting Forth (англ.)
У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их. |
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |