XOR: различия между версиями

Материал из ПМК вики
Перейти к навигации Перейти к поиску
Нет описания правки
Строка 9: Строка 9:
== Ввод слова XOR ==
== Ввод слова XOR ==
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите три белые клавиши [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ×|{{Серая клавиша|×}}]]
В [[Режим ЛАТ|режиме ЛАТ]] последовательно нажмите три белые клавиши [[Клавиша 0|{{Серая клавиша|0}}]] [[Клавиша 5|{{Серая клавиша|5}}]] [[Клавиша ×|{{Серая клавиша|×}}]]
== Детали реализации ==
В [[Каллисто]] для записи 32-битных целых чисел в [[Стек данных|десятичном стеке]] используется [[дополнительный код]] (''англ.'' two's complement). На входе слово XOR принимает как 32-битные целые в [[Дополнительный код|дополнительном коде]], так и беззнаковые целые. Результат i всегда представлен в [[Дополнительный код|дополнительном коде]] и отрицателен, если старший бит в нём установлен.
XOR даёт правильный результат побитового исключающего «или» над числами любой разрядности, меньшей 32, включая 24-, 16- и 8-битные числа. Если оба аргумента разрядности меньше, чем 32, представлены в [[Дополнительный код|дополнительном коде]], результат i также выдаётся в [[Дополнительный код|дополнительном коде]]. Если оба аргумента представлены в беззнаковом виде, результат также будет в беззнаковом виде — положительным числом или нулём.
Последовательности слов {{Текст на индикаторе|65535, XOR}} и {{Текст на индикаторе|255 XOR}} позволяют сделать поразрядное логическое отрицание (NOT) 16-битного и 8-битного числа, находящегося на вершине [[Стек данных|стека]].
Также слово XOR можно использовать для логической операции исключающего "или" над флагами, если значение «истина» представляется числом -1. Все стандартные слова [[Каллисто]], возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина».
Слово XOR реализовано с использованием команды ЭКВМ [[K XOR]].


== XOR в стандарте ANS Forth ==
== XOR в стандарте ANS Forth ==
Строка 42: Строка 31:


== Реализация ==
== Реализация ==
В [[Каллисто]] для записи 32-битных целых чисел в [[Стек данных|десятичном стеке]] используется [[дополнительный код]] (''англ.'' two's complement). На входе слово XOR принимает как 32-битные целые в [[Дополнительный код|дополнительном коде]], так и беззнаковые целые. Результат i всегда представлен в [[Дополнительный код|дополнительном коде]] и отрицателен, если старший бит в нём установлен.
XOR даёт правильный результат побитового исключающего «или» над числами любой разрядности, меньшей 32, включая 24-, 16- и 8-битные числа. Если оба аргумента разрядности меньше, чем 32, представлены в [[Дополнительный код|дополнительном коде]], результат i также выдаётся в [[Дополнительный код|дополнительном коде]]. Если оба аргумента представлены в беззнаковом виде, результат также будет в беззнаковом виде — положительным числом или нулём.
Последовательности слов {{Текст на индикаторе|65535, XOR}} и {{Текст на индикаторе|255 XOR}} позволяют сделать поразрядное логическое отрицание (NOT) 16-битного и 8-битного числа, находящегося на вершине [[Стек данных|стека]].
Также слово XOR можно использовать для логической операции исключающего "или" над флагами, если значение «истина» представляется числом -1. Все стандартные слова [[Каллисто]], возвращающие логическое значение (например, команды сравнения), используют это значение для возвращаемого флага «истина».
В [[Каллисто|Каллисто 1.0]] слово XOR реализовано с использованием команды ЭКВМ [[K XOR]]:
<pre>
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                      ; Преобразовать
1512
1513 ;#XOR
1514 ; XOR              ( n1 n2 −− i )                      32−битное сложение по модулю два (исключающее или). i := n1 &#8853; n2
1515 LSXOR:          .DB    3
1516                .TEXT  "XOR"                  ; ( a b −− a XOR b )
1517                .DW    LSOR
1518 SXOR:          .DW    JSXOR                  ; 32−битное побитовое логическое исключающее ИЛИ (XOR).
1519 JSXOR:          RM3 MB  1 M1 +  MA M3
1520                CX M8 4 M0
1521                KRMB  PGSB Norm32  MB
1522                KRMA  PGSB Norm32  MA
1523                GOTO SXORIN
1524 SXORL:          M8  RM1 RME ∗ M1
1525                RMA
1526 SXORIN:            ENT RME / FANS <−> KINT MA ∗ −
1527                RMB ENT RME / FANS <−> KINT MB ∗ −
1528                KXOR RM1 ∗ RM8 +
1529                FL0 SXORL
1530                PGSB Sign32
1531                PKM03 KGOTO9
</pre>
=== Советская реализация ===
Слово XOR в ФОРТ-ЕС было [[примитив]]ом. Вот его определение:
Слово XOR в ФОРТ-ЕС было [[примитив]]ом. Вот его определение:
<PRE>
<PRE>

Версия от 11:25, 9 ноября 2017

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

XOR            ( n1 n2 −− i )                  32−битное сложение по модулю два (исключающее или).
                                               i := n1 ⊕ n2
Пример работы слова XOR

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

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

Ввод слова XOR

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

XOR в стандарте ANS Forth

6.1.2490   XOR                               "x-or"                        CORE
           ( x1 x2 -- x3 )
           x3 поразрядное исключающее-или x1 и x2.

История

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

XOR в предыдущем стандарте Forth-83 (англ.)

     XOR          16b1 16b2 -- 16b3             79              "x-or"
          16b3 is the bit-by-bit exclusive-or of 16b1 with 16b2.

XOR в стандарте Forth-79 (англ.)

XOR            n1 n2 -- n3                   174             "x-or"
    Leave the bitwise exclusive-or of two numbers.

XOR в fig-FORTH Release 1 glossary, май 1979 (англ.)

XOR           nl  n2  ---  xor                 L1
       Leave the bitwise logical exclusive or of two values.

Реализация

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

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

Последовательности слов  65535, XOR  и  255 XOR  позволяют сделать поразрядное логическое отрицание (NOT) 16-битного и 8-битного числа, находящегося на вершине стека.

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

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

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                      ; Преобразовать
1512 
1513 ;#XOR
1514 ; XOR              ( n1 n2 −− i )                       32−битное сложение по модулю два (исключающее или). i := n1 ⊕ n2
1515 LSXOR:          .DB     3
1516                 .TEXT   "XOR"                   ; ( a b −− a XOR b )
1517                 .DW     LSOR
1518 SXOR:           .DW     JSXOR                   ; 32−битное побитовое логическое исключающее ИЛИ (XOR).
1519 JSXOR:          RM3 MB  1 M1 +  MA M3
1520                 CX M8 4 M0
1521                 KRMB  PGSB Norm32  MB
1522                 KRMA  PGSB Norm32  MA
1523                 GOTO SXORIN
1524 SXORL:          M8  RM1 RME ∗ M1
1525                 RMA
1526 SXORIN:             ENT RME / FANS <−> KINT MA ∗ − 
1527                 RMB ENT RME / FANS <−> KINT MB ∗ − 
1528                 KXOR RM1 ∗ RM8 +
1529                 FL0 SXORL
1530                 PGSB Sign32
1531                 PKM03 KGOTO9

Советская реализация

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

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

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

CODE XOR    ( W1,M2->W3)
 14 LHRW12 BAL,   RW1 RW2 XR, POPPUT1 B,   END-CODE

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

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

            POP  CX
            XOR  AX, CX
            JMP  ENDA

Ссылки


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