AND

Материал из ПМК вики
Перейти к: навигация, поиск

AND (и, читается «энд») — стандартное слово Каллисто. 32-битное поразрядное логическое умножение.

AND            ( n1 n2 −− i )                  32−битное логическое умножение (и). i := n1 & n2

Выполняет 32-битное логическое «и» (конъюнкцию) двух целых чисел n1 и n2, заносит в стек результат i в дополнительном коде.

Другими словами, каждый из 32 битов числа n1 сравнивается с соответствующим битом числа n2 и, если хотя бы один из битов равен нулю, в соответствующий бит числа i заносится ноль. Если оба бита равны единице, соответствующий бит результата i тоже будет равен единице.

Ввод слова AND[править]

В режиме ЛАТ последовательно нажмите три клавиши $\mathrm{\overset{\leftarrow}{ШГ}}$  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

Ссылки[править]


  Nopictures-icon.png У этой статьи нет иллюстраций. Вы можете помочь проекту, добавив их.


  Stub-icon-48px.png Это заготовка статьи. Вы можете помочь проекту, дополнив её.