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

(удвоить, читается «два-умножить») — адаптированное слово Каллисто. Умножение на 2 (двоичный сдвиг влево).

2×             ( x -- x1 )                     Удвоить. x1 ← x × 2
Пример работы слова 2×

Слово 2× умножает x на 2, результат x1 заносит в стек. x должно быть меньше 5E99.

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

В режиме NUM последовательно нажмите две белые клавиши  2   × 

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

6.1.0320   2∗                                "two-star"                    CORE
           ( x1 -- x2 )
           x2 - результат смещения x1 на один бит к старшему двоичному 
           разряду, заполнение освобожденного младшего бита нулем.
A.6.1.0320   2∗
Исторически 2∗ было реализовано на машинах с дополнительным кодом (дополнение 
до двух) как логическая команда левого сдвига. Умножение на два - эффективный 
побочный эффект на этих машинах. Однако смещение подразумевает знание значения 
и позиции битов в ячейке. В то время как имя подразумевает умножение, 
большинство разработчиков использует аппаратный сдвиг влево для реализации 2∗.

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

Слово 2× известно в Форте, как 2∗ и входит во все стандарты, начиная с 1979 года.

Каллистянское слово 2× способно удваивать не только целые, но и числа с плавающей запятой.

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

     2*           w1 -- w2                      83         "two-times"
          w2 is the result of shifting w1 left one bit.  A zero is
          shifted into the vacated bit position.

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

2*             n1 -- n2                                 "two-times"
    Leave 2*(n1).

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

Если на вершине стека находится целое число в диапазоне от -238 до 238, слово 2× сдвигает его влево на один двоичный разряд. Знак числа сохраняется. Слово 2/ осуществляет обратное действие, арифметический сдвиг вправо.

Каллисто реализована поверх десятичной машины «Электроника МК-161», поэтому поведение слова 2× может не всегда соответствовать тому, как оно реализовано на двоичных форт-машинах.

Если x≥5E99, происходит переполнение. Обработка этой ошибки производится встроенной программой. Например, последовательность слов  5E99 2×  вызывает аварийный останов Каллисто с сообщением «Переполнение» в строке комментариев. Можно ввести с клавиатуры произвольное число в качестве значения «10100» и вернуться в Каллисто, нажав  С/П . Подробнее см. статью Авост Каллисто.

В случае аварийного останова рекомендуется произвести «холодную перезагрузку» Каллисто с удалением всех введённых слов, нажав последовательно клавиши  В/О   С/П .

Слово 2× в Каллисто 1.0 является примитивом:

1287 NONEP:          PKRM03 + PKM03  KGOTO9
…
1290 JMUL2:          PKRM03  GOTO NONEP
…
1306 ;#TwoTimes
1307 ; 2×               ( x −− x1 )                          Удвоить. x1 := x×2
1308 LMUL2:          .DB     2
1309                 .TEXT   "2"                     ; "2∗" ( x −− 2∗x )
1310                 .DB     179                     ; Символ умножения МК−161
1311                 .DW     LONEM
1312 MUL2:           .DW     JMUL2                   ; Умножение на 2 (двоичный сдвиг влево).

Также оно может быть реализовано так:

:  2×  ( x -- 2x )   ↑ + ;

Реализация из SP-Forth 4.20:

CODE 2*
     LEA EAX, [EAX*2]
     RET
END-CODE

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

В ядре ФОРТ-ЕС слово 2× называлось 2∗

Вот его описание и определение:

2*      +    W1->W2 АРИФМЕТИЧЕСКИЙ СДВИГ ВЛЕВО НА 1            20

                     Экран номер 20
( 31.03.86    SP@ SP! RP@ RP! 2/ 2* 2@ 2! DEPTH )

: 2* ( W1->W2 ) DUP + ;

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

             HEAD    202Q,'2',252Q,MUL2                   ; 2*
             POP   AX
             SAL   AX,  1
             PUSH  AX
             NEXT

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


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