CMOVE〉: различия между версиями
Перейти к навигации
Перейти к поиску
AtH (обсуждение | вклад) Нет описания правки |
AtH (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 51: | Строка 51: | ||
== Реализация == | == Реализация == | ||
<pre> | |||
1983 ;#CMOVEtop | |||
1984 ; CMOVE> ( a1 a2 U −− ) Копировать U байтов из a1 в a2, начиная с больших адресов. | |||
1985 LCMOVEG: .DB 6 | |||
1986 .TEXT "CMOVE>" ; ( откуда куда сколько −− ) | |||
1987 .DW LCMOVE | |||
1988 CMOVEG: .DW JCMOVEG | |||
1989 JCMOVEG: PKRM03 M0 ; Счётчик | |||
1990 RM3 1 + MB 1 + MA 1 + M3 M8 ; R8 := SP (R3) | |||
1991 KRMB 1 EE 4 − KX>=09 | |||
1992 RM0 +/− KX<09 − M1 ; R1 := Куда, конец блока | |||
1993 KRMA MA 1 EE 4 − FX<0 CMVGR0 | |||
1994 RMA RM0 + | |||
1995 CMVGP: MA KPRGM KM1 RMA 1 − FL0 CMVGP KGOTO9 | |||
1996 CMVGR0: RM0 + M3 | |||
1997 CMVGRL: Cx KRM3 KM1 FL0 CMVGRL | |||
1998 RM8 M3 KGOTO9 ; R3 (SP) := R8 | |||
</pre> | |||
Реализация из SP-Forth 4.20: | |||
<pre> | |||
CODE CMOVE> ( c-addr1 c-addr2 u -- ) \ 94 STRING | |||
\ Если u больше нуля, копировать u последовательных символов из пространства | |||
\ данных начиная с адреса c-addr1 в c-addr2, символ за символом, начиная со | |||
\ старших адресов к младшим. | |||
MOV EDX, EDI | |||
MOV ECX, EAX | |||
MOV EDI, [EBP] | |||
MOV ESI, 4 [EBP] | |||
STD | |||
ADD EDI, ECX | |||
DEC EDI | |||
ADD ESI, ECX | |||
DEC ESI | |||
REP MOVS BYTE | |||
CLD | |||
MOV EDI, EDX | |||
LEA EBP, 0C [EBP] | |||
MOV EAX, -4 [EBP] | |||
RET | |||
END-CODE | |||
</pre> | |||
=== Советская реализация === | |||
Слово CMOVE> в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | Слово CMOVE> в ФОРТ-ЕС было [[примитив]]ом. Вот его описание и определение: | ||
<PRE> | <PRE> | ||
Строка 79: | Строка 122: | ||
[[Категория:Примитивы]] | [[Категория:Примитивы]] | ||
[[Категория:Работа с памятью Каллисто]] | [[Категория:Работа с памятью Каллисто]] | ||
[[Категория:Стандартные слова]] | |||
[[Категория:1994 STRING]] | |||
[[Категория:2012 STRING]] |
Текущая версия от 17:10, 10 ноября 2017
CMOVE> — стандартное слово Каллисто.
CMOVE> ( a1 a2 u −− ) Копировать u байтов из a1 в a2, начиная с больших адресов.
Параметры слова CMOVE> те же, что у CMOVE, но копирование блока происходит, начиная с последнего байта. Это позволяет безопасно копировать те перекрывающиеся области памяти, на которых CMOVE сбоит.
Ввод слова CMOVE>[править]
В режиме ЛАТ последовательно нажмите клавиши С/П ÷ 5 ↔ ИП P F ИП
Эти нажатия оставляют клавиатуру в режиме NUM.
CMOVE> в стандарте ANS Forth[править]
17.6.1.0920 CMOVE> "c-move-up" STRING ( c-addr1 c-addr2 u -- ) Если u больше чем нуль, копирует u последовательных символов из области данных начинающейся с c-addr1 в область, начинающуюся с c- addr2, выполняя посимвольно с наибольших адресов к наименьшим. Отличие с: 17.6.1.0910 CMOVE. A.17.6.1.0920 CMOVE> Если c-addr1 находится в пределах области назначения, (то есть, когда c-addr1 больше чем или равно c-addr2 и c-addr2 - меньше чем количество c-addr1 u CHARS +), происходит размножение памяти. Типичное использование: Предположите символьную строку по адресу 100: "ABCD". Тогда после 100 DUP CHAR+ SWAP 3 CMOVE>, строка по адресу 100 - "DDDD".
История[править]
В 1983 году слово <CMOVE было переименовано в CMOVE> — лучше отражающее направление и способ перемещения участка памяти.
В таком виде слово и вошло в Каллисто.
CMOVE> в предыдущем стандарте Forth-83 (англ.)[править]
CMOVE> addr1 addr2 u -- 83 "c-move-up" Move the u bytes at address addr1 to addr2. The move begins by moving the byte at (addr1 plus u minus 1) to (addr2 plus u minus 1) and proceeds to successively lower addresses for u bytes. If u is zero nothing is moved. (Useful for sliding a string towards higher addresses).
<CMOVE в стандарте Forth-79 (англ.)[править]
<CMOVE addr1 addr2 n -- "reverse-c-move" Copy n bytes beginning at addr1 to addr2. The move proceeds within the bytes from high memory toward low memory.
Реализация[править]
1983 ;#CMOVEtop 1984 ; CMOVE> ( a1 a2 U −− ) Копировать U байтов из a1 в a2, начиная с больших адресов. 1985 LCMOVEG: .DB 6 1986 .TEXT "CMOVE>" ; ( откуда куда сколько −− ) 1987 .DW LCMOVE 1988 CMOVEG: .DW JCMOVEG 1989 JCMOVEG: PKRM03 M0 ; Счётчик 1990 RM3 1 + MB 1 + MA 1 + M3 M8 ; R8 := SP (R3) 1991 KRMB 1 EE 4 − KX>=09 1992 RM0 +/− KX<09 − M1 ; R1 := Куда, конец блока 1993 KRMA MA 1 EE 4 − FX<0 CMVGR0 1994 RMA RM0 + 1995 CMVGP: MA KPRGM KM1 RMA 1 − FL0 CMVGP KGOTO9 1996 CMVGR0: RM0 + M3 1997 CMVGRL: Cx KRM3 KM1 FL0 CMVGRL 1998 RM8 M3 KGOTO9 ; R3 (SP) := R8
Реализация из SP-Forth 4.20:
CODE CMOVE> ( c-addr1 c-addr2 u -- ) \ 94 STRING \ Если u больше нуля, копировать u последовательных символов из пространства \ данных начиная с адреса c-addr1 в c-addr2, символ за символом, начиная со \ старших адресов к младшим. MOV EDX, EDI MOV ECX, EAX MOV EDI, [EBP] MOV ESI, 4 [EBP] STD ADD EDI, ECX DEC EDI ADD ESI, ECX DEC ESI REP MOVS BYTE CLD MOV EDI, EDX LEA EBP, 0C [EBP] MOV EAX, -4 [EBP] RET END-CODE
Советская реализация[править]
Слово CMOVE> в ФОРТ-ЕС было примитивом. Вот его описание и определение:
CMOVE> A1,A2,U-> ПЕРЕСЛАТЬ U БАЙТОВ ОТ АДРЕСА А1 21 ПО АДРЕСУ А2 НАЧИНАЯ С БОЛЬШИХ АДРЕСОВ Экран номер 21 ( 31.03.86 CMOVE CMOVE> ) CODE CMOVE> ( A1,A2,U->) 14 LHRW12 BAL, RW2 RMASK NR, 1 =F BZ, RW1 РМASК NR, RW1 RFORTH AR, RW1 0 BCTR, 1 FIRST 4 +(, LH, 1 RMASK NR, 1 RFORTH AR, 1 0 BCTR, DO, 0 0 (, 1 RM2 1C, 0 0 (, RW1 RW2 STC, RW2 LOOPBCT, 1 =H RSTACK 6 (, 0 RSTACK LA, RNEXT BR, END-CODE
Ссылки[править]
- Исходный текст слова CMOVE> в Каллисто Классик 1.0
- См. также слова CMOVE FILL ERASE BLANK
- Слово CMOVE> (c-move-up) и комментарий к нему в стандарте ANS Forth (англ.)
- Слово CMOVE> (c-move-up) и комментарий к нему в черновике Forth 200x (англ.)
- ВВОД-ВЫВОД в книге Л.Броуди «Начальный курс программирования на языке Форт»
- I/O and You в книге Leo Brodie Starting Forth (англ.)
Это заготовка статьи. Вы можете помочь проекту, дополнив её. |