Слово ↔

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

(обмен, двойная стрелка влево-вправо) — традиционное слово Каллисто. Переставить два верхних элемента стека.

↔              ( y x -- x y )                  Обмен.
Выполнение слова ↔
Картинка из книги Лео Броди «Starting FORTH»

Меняет местами два верхних числа в стеке.

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

В режиме NUM нажмите белую клавишу   

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

 6.1.2260   SWAP                                                            CORE
            ( x1 x2 -- x2 x1 )
            Переставляет два верхних элемента стека.

 12.6.1.1620   FSWAP                     "f-swap"                       FLOATING
            ( F: r1 r2 -- r2 r1 ) or ( r1 r2 -- r2 r1 )
            Меняет два верхних элемента стека с плавающей точкой.

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

В Форте слово ↔ одно из самых древних и устоявшихся, но называется SWAP (англ. обменять).

Впервые оно появилось в 1964 году под именем . в программе CURVE, написанной Чак Муром на Алголе для Burroughs B5500 (Национальная ускорительная лаборатория SLAC, Стэнфордский университет).

Более удобное короткое название ↔ досталось в наследство от советского ПМК «Электроника МК-54», выпущенного в 1982 году. В Каллисто название SWAP осталось в имени слова 2SWAP.

В Форте FSP88M слово ↔ известно под именем SW

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

     SWAP         16b1 16b2 -- 16b2 16b1        79
          The top two stack entries are exchanged.

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

SWAP           n1 n2 -- n2 n1                230
    Exchange the top two stack values.

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

SWAP           nl n2 --- n2 n1               L0
       Exchange the top two values On the stack.

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

В Каллисто 1.0 слово ↔ является аналогом команды ЭКВМ , но действует в стеке данных Каллисто:

1882 ;#SWAP
1883 ; ↔                ( y x −− x y )                       Обмен.
1884 LSWAP:          .DB     1,183                   ; ( a b −− b a )
1885                 .DW     LOVER
1886 SWAP:           .DW     JSWAP
1887 JSWAP:          RM3 M8 M5
1888                 KRM5 KRM8 PKM05 <−> KM8         ; Поменять местами два верхних элемента стека.
1889                 KGOTO9

Также можно предложить на проверку следующий код. Он на один шаг длиннее, зато на одну команду меньше и не использует R8. Возможно, за счёт этого примитив будет выполняться быстрее:

CODE ↔  ( y x -- x y )  ИП3 П5  КИП5  РКИП03 РКП05 ↔ РКП03  КБП9  END-CODE

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

CODE SWAP ( x1 x2 -- x2 x1 ) \ 94
\ поменять местами два верхних элемента стека
\     XCHG EAX, [EBP]
     MOV   EDX, [EBP]
     MOV   [EBP], EAX
     MOV   EAX, EDX
     RET
END-CODE
CODE FSWAP \ *
       FXCH  
       RET
END-CODE

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

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

SWAP         W1,W2->W2,W1 ОБМЕНЯТЬ МЕСТАМИ 2 ВЕРХНИХ            9

                      Экран номер 9
( 31.03.86   DUP ?DUP DROP SWAP OVER >R R> R@ RDROP ROT )

CODE SWAP   ( W1,W2->W2,W1) 14 LHRW12 BAL,  RW2 SECOND STH,
  PUTRW1 B, END-CODE

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

            HEAD     204Q,'SWA',320Q,SWAP                 ; SWAP
	    POP  CX
	    POP  AX
	    PUSH CX
	    PUSH AX
	    NEXT

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


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