OR

Материал из ПМК вики
Версия от 16:54, 10 ноября 2017; AtH (обсуждение | вклад) (→‎Реализация)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

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

OR             ( n1 n2 −− i )                  32−битное логическое сложение (или). i := n1 ∨ n2

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

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

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

В режиме ЛАТ последовательно нажмите две белые клавиши  5   × 

OR в стандарте ANS Forth[править]

6.1.1980   OR                                                              CORE
           ( x1 x2 -- x3 )
           x3 - поразрядное включающее или x1 и x2.

История[править]

Слово OR является одним из самых древних сохранившихся слов Форта.

В 1968 году Чак Мур работал в Mohasco Industries, Inc (Amsterdam NY, англ.). Первая версия интерпретатора, получившая название FORTH, заработала на миникомпьютере IBM 1130 с графическим дисплеем 2250 (16-битный процессор с ОЗУ 8К, дисководом, клавиатурой, принтером и ридером/панчером перфокарт). Первый FORTH знал слово OR

Позже было реализовано Чаком Муром для 2К×48бит версии Форта на Burroughs B-5500 в 1970 году.

В colorForth слово OR начало означать исключающее «или» (XOR).

В отечественных калькуляторах команда OR претерпела большие изменения. В советских ПМК команда К∨ осуществляла побитовое логическое или во всех тетрадах мантиссы в формате bcd, кроме старшей. В «Электронике МК-152» команда получила более практичное назначение и новое имя K OR, сохранив свой код операции. Команда K OR стала работать с 8-битными двоичными числами. Именно на её основе удалось реализовать стандартное слово OR для работы с 32-битными целыми.

OR в предыдущем стандарте Forth-83 (англ.)[править]

     OR           16b1 16b2 -- 16b3             79
          16b3 is the bit-by-bit inclusive-or of 16b1 with 16b2.

OR в стандарте Forth-79 (англ.)[править]

OR             n1 n2 -- n3                   223
    Leave the bitwise inclusive-or of two numbers.

OR в fig-FORTH Release 1 glossary, май 1979 (англ.)[править]

OR             n1   n2  --   or                    L0
       Leave the bit-wise logical or of two l6 bit values.

Реализация[править]

В Каллисто для записи 32-битных целых чисел в десятичном стеке используется дополнительный код (англ. two's complement). На входе слово OR принимает как 32-битные целые в дополнительном коде, так и беззнаковые целые. Результат i всегда представлен в дополнительном коде и отрицателен, если старший бит в нём установлен.

OR даёт правильный результат побитового «или» над числами любой разрядности, меньшей 32, включая 16-, 8- и 1-битные числа. Если оба аргумента разрядности меньше, чем 32, представлены в дополнительном коде, результат i также выдаётся в дополнительном коде. Если оба аргумента представлены в беззнаковом виде, результат также будет в беззнаковом виде — положительным числом или нулём.

Также слово OR можно использовать для логической операции «или» над флагами, если значение «истина» представляется числом -1. Все стандартные слова Каллисто, возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина».

В Каллисто 1.0 слово OR реализовано с использованием команды ЭКВМ K OR:

1481 ; Приводит 32−битное число в беззнаковый вид.
1482 Norm32:         FX<0 N32A
1483                 65536 FX^2 +                    ; FX^2 vs ENT ∗
1484 N32A:           RTN
1485 
1486 ;#OR
1487 ; OR               ( n1 n2 −− i )                       32−битное логическое сложение (или). i := n1 ∨ n2
1488 LSOR:           .DB     2
1489                 .TEXT   "OR"                    ; ( a b −− a OR b )
1490                 .DW     LSAND                   ; 32−битное побитовое логическое сложение (ИЛИ).
1491 SOR:            .DW     JSOR
1492 JSOR:           RM3 MB  1 M1 +  MA M3
1493                 CX M8 4 M0
1494                 KRMB  GSB Norm32  MB
1495                 KRMA  GSB Norm32  MA
1496                 GOTO SORIN
1497 SORL:           M8  RM1 RME ∗ M1
1498                 RMA
1499 SORIN:              ENT RME / FANS <−> KINT MA ∗ − 
1500                 RMB ENT RME / FANS <−> KINT MB ∗ − 
1501                 KOR RM1 ∗ RM8 +
1502                 PFL0 SORL
1503                 GSB Sign32
1504                 PKM03 KGOTO9
1505 ;
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 OR ( x1 x2 -- x3 ) \ 94
\ x3 - побитовое "ИЛИ" x1 и x2.
     OR EAX, [EBP]
     LEA EBP, 4 [EBP]
     RET
END-CODE

Советская реализация[править]

Слово OR в ФОРТ-ЕС было примитивом. Вот его описание и определение:

OR           W1,W2->W3 ПОРАЗРЯДНОЕ ЛОГИЧЕСКОЕ "ИЛИ"             13

                     Экран номер 13
( 31.03.86      AND  OR XOR  NOT  0=  0<      )

CODE OR     ( W1,W2->W3)
 14 LHRW12 BAL,   RW1 RW2 OR, POPPUT1 B,   END-CODE

В FORTH ИТЭФ слово OR также было примитивом, вот его определение:

            HEAD     203Q,'AN',304Q,$AND                  ; AND
            POP  AX
            POP  CX
            AND  AX,  CX
   ENDA:    PUSH AX
            NEXT

            HEAD     202Q,'O',322Q,$OR                    ; OR
            POP  AX
            POP  CX
            OR   AX, CX
            JMP  ENDA

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


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


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