Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пн дек 06, 2021 22:30

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Ответить
Имя пользователя:
Заголовок:
Текст сообщения:
Введите текст вашего сообщения. Длина сообщения в символах не более: 60000

Размер шрифта:
Цвет шрифта
Настройки:
BBCode ВКЛЮЧЕН
[img] ВЫКЛЮЧЕН
[flash] ВЫКЛЮЧЕН
[url] ВКЛЮЧЕН
Смайлики ВЫКЛЮЧЕНЫ
Отключить в этом сообщении BBCode
Не преобразовывать адреса URL в ссылки
Вопрос
Теперь гостю придется вводить здесь пароль. Не от своей учетной записи, а ПАРОЛЬ ДЛЯ ГОСТЯ, получить который можно после регистрации на форуме через ЛС.:
Этот вопрос предназначен для выявления и предотвращения автоматических регистраций.
   

Обзор темы - Еще один способ работы с параметрами на стеке
Автор Сообщение
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Как понимаю, Вы закидываете часть переменных выше вершины стека.
Но как происходит контроль измерения глубины?
При изменении этого самого стека?
Сообщение Добавлено: Вт май 18, 2021 14:15
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Использовал доп. словарь.
Вход в словарь (не_Forth) с помощью другой формы
определения слова через двоеточие.
Выход в словарь Forth по закрывающему символу ';',
переопределенному в словаре не_Forth.
Словарь поэтому практически не отсвечивает.

Код:
S+: | a1 u1 a2 u2 |
u1 u2 + DUP ALLOC | u a |
a1 a u1      MOVE
a2 a u1 + u2 MOVE
TO a1 nNIP u1
;
SEE S+
CR  S" alfa ." S" .. omega" s+  TYPE

: s+ { a1 u1 a2 u2 \ a u }
u1 u2 + DUP TO u ALLOCATE THROW TO a
a1 a u1      MOVE
a2 a u1 + u2 MOVE
a u
;
SEE s+
CR  S" alfa ." S" .. omega" s+  TYPE

лог
Код:
CODE S+
620577 8945FC           MOV     FC [EBP] , EAX
62057A 034504           ADD     EAX , 4 [EBP]
62057D 8D6DFC           LEA     EBP , FC [EBP]
620580 8945FC           MOV     FC [EBP] , EAX
620583 8D6DFC           LEA     EBP , FC [EBP]
620586 E8AC4DFFFF       CALL    615337  ( hAlloc )
62058B 8945FC           MOV     FC [EBP] , EAX
62058E 8B4510           MOV     EAX , 10 [EBP]
620591 8945F8           MOV     F8 [EBP] , EAX
620594 8B45FC           MOV     EAX , FC [EBP]
620597 8945F4           MOV     F4 [EBP] , EAX
62059A 8B450C           MOV     EAX , C [EBP]
62059D 8D6DF4           LEA     EBP , F4 [EBP]
6205A0 E8DF37F3FF       CALL    553D84  ( MOVE )
6205A5 8945FC           MOV     FC [EBP] , EAX
6205A8 8B4508           MOV     EAX , 8 [EBP]
6205AB 8945F8           MOV     F8 [EBP] , EAX
6205AE 8B45FC           MOV     EAX , FC [EBP]
6205B1 8D6DF8           LEA     EBP , F8 [EBP]
6205B4 034514           ADD     EAX , 14 [EBP]
6205B7 8945FC           MOV     FC [EBP] , EAX
6205BA 8B450C           MOV     EAX , C [EBP]
6205BD 8D6DFC           LEA     EBP , FC [EBP]
6205C0 E8BF37F3FF       CALL    553D84  ( MOVE )
6205C5 894510           MOV     10 [EBP] , EAX
6205C8 8B4500           MOV     EAX , 0 [EBP]
6205CB 8D6D10           LEA     EBP , 10 [EBP]
6205CE C3               RET     NEAR
END-CODE
( 88 bytes, 28 instructions )

alfa ... omega

CODE s+
6205DF 8945FC           MOV     FC [EBP] , EAX
6205E2 B810000000       MOV     EAX , # 10
6205E7 8D6DFC           LEA     EBP , FC [EBP]
6205EA E8F92AF3FF       CALL    5530E8  ( DRMOVE )
6205EF 8945FC           MOV     FC [EBP] , EAX
6205F2 B802000000       MOV     EAX , # 2
6205F7 8D6DFC           LEA     EBP , FC [EBP]
6205FA E8252CF3FF       CALL    553224  ( (RALLOT) )
6205FF 6818000000       PUSH    , # 18
620604 686C325500       PUSH    , # 55326C
620609 8945FC           MOV     FC [EBP] , EAX
62060C 8B442418         MOV     EAX , 18 [ESP]
620610 03442410         ADD     EAX , 10 [ESP]
620614 8945F8           MOV     F8 [EBP] , EAX
620617 89442408         MOV     8 [ESP] , EAX
62061B 8B45F8           MOV     EAX , F8 [EBP]
62061E 8D6DFC           LEA     EBP , FC [EBP]
620621 E87649F3FF       CALL    554F9C  ( ALLOCATE )
620626 E8894AF3FF       CALL    5550B4  ( THROW )
62062B 8944240C         MOV     C [ESP] , EAX
62062F 8B44241C         MOV     EAX , 1C [ESP]
620633 8945FC           MOV     FC [EBP] , EAX
620636 8B44240C         MOV     EAX , C [ESP]
62063A 8945F8           MOV     F8 [EBP] , EAX
62063D 8B442418         MOV     EAX , 18 [ESP]
620641 8D6DF8           LEA     EBP , F8 [EBP]
620644 E83B37F3FF       CALL    553D84  ( MOVE )
620649 8945FC           MOV     FC [EBP] , EAX
62064C 8B442414         MOV     EAX , 14 [ESP]
620650 8945F8           MOV     F8 [EBP] , EAX
620653 8B44240C         MOV     EAX , C [ESP]
620657 03442418         ADD     EAX , 18 [ESP]
62065B 8945F4           MOV     F4 [EBP] , EAX
62065E 8B442410         MOV     EAX , 10 [ESP]
620662 8D6DF4           LEA     EBP , F4 [EBP]
620665 E81A37F3FF       CALL    553D84  ( MOVE )
62066A 8945FC           MOV     FC [EBP] , EAX
62066D 8B44240C         MOV     EAX , C [ESP]
620671 8945F8           MOV     F8 [EBP] , EAX
620674 8B442408         MOV     EAX , 8 [ESP]
620678 8D6DF8           LEA     EBP , F8 [EBP]
62067B C3               RET     NEAR
END-CODE
( 157 bytes, 42 instructions )

alfa ... omega


Ps. Увеличив число команд виртуальной форт-машины,
и поддержав прозрачный синтаксис локальных переменных
( на самом деле использование стека в стандартном Форте
это и есть оперирование локальными переменными пусть и
неявно заданными) можно получить эффективность кода
не хуже чем у форта с оптимизатором, при этом практически
исключив инструментальный динамический контекст.
Сообщение Добавлено: Сб май 15, 2021 23:53
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Наращивание возможностей транспилятора с параллельным изменением синтаксиса
Код:
\ Конкатенация строк в хипе
: S+ | a1 u1 a2 u2 |
u1 u2 s+ dup halloc | us as |
a1 as u1       move
a2 as u1 s+ u2 move
IS a1 nNIP u1
;
SEE S+
CR  S" 12 " S" ab" S+  TYPE


ЛОГ
Код:
[424+dh162V362+4V:1'N2  \ выражение S+ на первичном языке
b  2Ooo  3o 2 O1o: N

CODE S+
62072F 8945FC           MOV     FC [EBP] , EAX
620732 034504           ADD     EAX , 4 [EBP]
620735 8D6DFC           LEA     EBP , FC [EBP]
620738 8945FC           MOV     FC [EBP] , EAX
62073B 8D6DFC           LEA     EBP , FC [EBP]
62073E E8A84CFFFF       CALL    6153EB  ( hAlloc )
620743 8945FC           MOV     FC [EBP] , EAX
620746 8B4510           MOV     EAX , 10 [EBP]
620749 8945F8           MOV     F8 [EBP] , EAX
62074C 8B45FC           MOV     EAX , FC [EBP]
62074F 8945F4           MOV     F4 [EBP] , EAX
620752 8B450C           MOV     EAX , C [EBP]
620755 8D6DF4           LEA     EBP , F4 [EBP]
620758 E82736F3FF       CALL    553D84  ( MOVE )
62075D 8945FC           MOV     FC [EBP] , EAX
620760 8B4508           MOV     EAX , 8 [EBP]
620763 8945F8           MOV     F8 [EBP] , EAX
620766 8B45FC           MOV     EAX , FC [EBP]
620769 8D6DF8           LEA     EBP , F8 [EBP]
62076C 034514           ADD     EAX , 14 [EBP]
62076F 8945FC           MOV     FC [EBP] , EAX
620772 8B450C           MOV     EAX , C [EBP]
620775 8D6DFC           LEA     EBP , FC [EBP]
620778 E80736F3FF       CALL    553D84  ( MOVE )
62077D 894510           MOV     10 [EBP] , EAX
620780 8B4500           MOV     EAX , 0 [EBP]
620783 8D6D10           LEA     EBP , 10 [EBP]
620786 C3               RET     NEAR
END-CODE
( 88 bytes, 28 instructions )

12 ab

PS. В основном процесс транспиляции освоен, остались экстенсивные дополнения.
Сообщение Добавлено: Чт май 13, 2021 00:58
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Версия простейшего транспилятора
Код:
CREATE VocPar 2000 ALLOT  0 VALUE dvp \ словарь имен параметров
CREATE StrOut 1000 ALLOT  0 VALUE dso \ выходная строка на первичном языке

I: [[  { \ cw a u  }
BEGIN NextWord 2DUP TO u TO a S" ]]" COMPARE
  IF   a VocPar dvp + u MOVE
       dvp u + 1+ TO dvp
       cw 1+ TO cw
       cw '0' + VocPar dvp + C!
       dvp 2+ TO dvp 0
  ELSE 1 THEN
UNTIL
S" /[" StrOut SWAP MOVE
cw '0' +  StrOut 2 + C!
dso 3 + TO dso
;
: NOTFOUND { a u }
VocPar 2000 a u SEARCH
IF DROP u + 1+ C@ StrOut dso + C! dso 1+ TO dso
ELSE 2DROP a u NOTFOUND EXIT THEN
;
I: em  StrOut dso EVALUATE
;
I: m; ` em StrOut 1000 ERASE  ` ;
;

Проверка
Код:
: s1  /[4321441 ;
SEE s1
11 22 33 44 t[ s1 ]t
: s2 [[ a1 u1 a2 u2 ]]
a2 u1 a1 u2 u2 a1
m;
SEE s2
11 22 33 44 t[ s2 ]t


ЛОГ
Код:
[4321441
b      6

CODE s1
6201B7 8945FC           MOV     FC [EBP] , EAX
6201BA 8B4500           MOV     EAX , 0 [EBP]
6201BD 8945F8           MOV     F8 [EBP] , EAX
6201C0 8B4504           MOV     EAX , 4 [EBP]
6201C3 8945F4           MOV     F4 [EBP] , EAX
6201C6 8B4508           MOV     EAX , 8 [EBP]
6201C9 8945F0           MOV     F0 [EBP] , EAX
6201CC 8B45FC           MOV     EAX , FC [EBP]
6201CF 8945EC           MOV     EC [EBP] , EAX
6201D2 8B45FC           MOV     EAX , FC [EBP]
6201D5 8945E8           MOV     E8 [EBP] , EAX
6201D8 8B4508           MOV     EAX , 8 [EBP]
6201DB 8D6DE8           LEA     EBP , E8 [EBP]
6201DE C3               RET     NEAR
END-CODE
( 40 bytes, 14 instructions )

11 22 33 44
11 22 33 44 33 22 11 44 44 11

[4321441
b      6

CODE s2
6201EF 8945FC           MOV     FC [EBP] , EAX
6201F2 8B4500           MOV     EAX , 0 [EBP]
6201F5 8945F8           MOV     F8 [EBP] , EAX
6201F8 8B4504           MOV     EAX , 4 [EBP]
6201FB 8945F4           MOV     F4 [EBP] , EAX
6201FE 8B4508           MOV     EAX , 8 [EBP]
620201 8945F0           MOV     F0 [EBP] , EAX
620204 8B45FC           MOV     EAX , FC [EBP]
620207 8945EC           MOV     EC [EBP] , EAX
62020A 8B45FC           MOV     EAX , FC [EBP]
62020D 8945E8           MOV     E8 [EBP] , EAX
620210 8B4508           MOV     EAX , 8 [EBP]
620213 8D6DE8           LEA     EBP , E8 [EBP]
620216 C3               RET     NEAR
END-CODE
( 40 bytes, 14 instructions )

11 22 33 44
11 22 33 44 33 22 11 44 44 11

PS. 100% точный перевод на первичный язык.
Это конечно лишь часть транспилятора.
Сообщение Добавлено: Ср май 12, 2021 01:08
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Ввел операторы между содержимым ячейки и непосредсвенно заданным операндом
Результат всегда помещается в ячейку.
Код:
: t[ CR DEPTH .SN CR ;
: ]t DEPTH .SN stack0 ;
1 TO OTL
: pr1 /[31`2'+ ; SEE pr1  16 2 32 t[ pr1 ]t
: pr2 /[33`2'- ; SEE pr2  16 2 32 t[ pr2 ]t
: pr3 /[31`2'* ; SEE pr3  16 2 32 t[ pr3 ]t
: pr4 /[33`2'/ ; SEE pr4  16 2 32 t[ pr4 ]t
: pr5 /[31`2'% ; SEE pr5  16 2 32 t[ pr5 ]t
: pr6 /[33`2'| ; SEE pr6  16 2 32 t[ pr6 ]t
: pr7 /[31`2'& ; SEE pr7  16 2 32 t[ pr7 ]t
: pr8 /[33`2'^ ; SEE pr8  16 2 32 t[ pr8 ]t
: pr9 /[31`2'M ; SEE pr9  16 2 32 t[ pr9 ]t
: prA /[33`2'm ; SEE prA  16 2 32 t[ prA ]t
: prB /[31`2'l ; SEE prB  16 2 32 t[ prB ]t
: prC /[33`2'r ; SEE prC  16 2 32 t[ prC ]t


ЛОГ.
Код:
[31`2'+
b c_#_o

CODE pr1
61DCD7 83450402         ADD     4 [EBP] , # 2
61DCDB C3               RET     NEAR
END-CODE
( 5 bytes, 2 instructions )

16 2 32
18 2 32

[33`2'-
b c_#_o

CODE pr2
61DCEF 8D40FE           LEA     EAX , FE [EAX]
61DCF2 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )

16 2 32
16 2 30

[31`2'*
b c_#_o

CODE pr3
61DD03 695D0402000000   IMUL    EBX , 4 [EBP] , # 2
61DD0A 895D04           MOV     4 [EBP] , EBX
61DD0D C3               RET     NEAR
END-CODE
( 11 bytes, 3 instructions )

16 2 32
32 2 32

[33`2'/
b c_#_o

CODE pr4
61DD1F C7C102000000     MOV     ECX , # 2
61DD25 99               CDQ
61DD26 F7F9             IDIV    ECX
61DD28 C3               RET     NEAR
END-CODE
( 10 bytes, 4 instructions )

16 2 32
16 2 16

[31`2'%
b c_#_o

CODE pr5
61DD3B 8BD8             MOV     EBX , EAX
61DD3D 8B4504           MOV     EAX , 4 [EBP]
61DD40 C7C102000000     MOV     ECX , # 2
61DD46 99               CDQ
61DD47 F7F9             IDIV    ECX
61DD49 895504           MOV     4 [EBP] , EDX
61DD4C 8BC3             MOV     EAX , EBX
61DD4E C3               RET     NEAR
END-CODE
( 20 bytes, 8 instructions )

16 2 32
0 2 32

[33`2'|
b c_#_o

CODE pr6
61DD5F 81C802000000     OR      EAX , # 2
61DD65 C3               RET     NEAR
END-CODE
( 7 bytes, 2 instructions )

16 2 32
16 2 34

[31`2'&
b c_#_o

CODE pr7
61DD77 81650402000000   AND     4 [EBP] , # 2
61DD7E C3               RET     NEAR
END-CODE
( 8 bytes, 2 instructions )

16 2 32
0 2 32

[33`2'^
b c_#_o

CODE pr8
61DD8F 81F002000000     XOR     EAX , # 2
61DD95 C3               RET     NEAR
END-CODE
( 7 bytes, 2 instructions )

16 2 32
16 2 34

[31`2'M
b c_#_o

CODE pr9
61DDA7 C7C302000000     MOV     EBX , # 2
61DDAD 395D04           CMP     4 [EBP] , EBX
61DDB0 0F4F5D04         CMOVG   EBX , 4 [EBP]
61DDB4 895D04           MOV     4 [EBP] , EBX
61DDB7 C3               RET     NEAR
END-CODE
( 17 bytes, 5 instructions )

16 2 32
16 2 32

[33`2'm
b c_#_o

CODE prA
61DDCB C7C202000000     MOV     EDX , # 2
61DDD1 3BD0             CMP     EDX , EAX
61DDD3 0F4CC2           CMOVL   EAX , EDX
61DDD6 C3               RET     NEAR
END-CODE
( 12 bytes, 4 instructions )

16 2 32
16 2 2

[31`2'l
b c_#_o

CODE prB
61DDE7 C1650402         SHL     4 [EBP] , 2
61DDEB C3               RET     NEAR
END-CODE
( 5 bytes, 2 instructions )

16 2 32
64 2 32

[33`2'r
b c_#_o

CODE prC
61DDFF C1E802           SHR     EAX , 2
61DE02 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )

16 2 32
16 2 8

PS. Кратко пройдусь по всему набору операторов
(с - ячейка, # - непосредственное значение, o - оператор)

с1с2o - результат на вершину стека
с1с2'o - результат в ячейку с1
c#'o - результат в ячейку с
##o - результат на вершину стека
co - результат на вершину стека( оператор между вершиной стека и ячейкой )
o - фортовские операторы
с - содержимое ячейки на стек
с1:c2 - пересылка из ячейки в ячейку
:c - снять со стека в ячейку(':c - скопировать со стека в ячейку)
есть еще операторы укорочения стека nDROP ( ]n ) и nNIP( 'Nn )
Несмотря на введение доп. операторов язык остается по прежнему стековым.
Сообщение Добавлено: Вт май 04, 2021 00:55
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Ввел прямые операции между ячейками стека в общем случае минуя вершину стека.
Форт-операторы идут как их подмножество с более коротким синтаксисом.
Примеры реализации операторов + и - :
Код:
: s. DEPTH .SN stack0 ;
1 TO OTL
: pr1 /[312'+ ; SEE pr1  1 2 3 pr1 s.
: pr2 /[313'+ ; SEE pr2  1 2 3 pr2 s.
: pr3 /[323'+ ; SEE pr3  1 2 3 pr3 s.
: pr4 /[321'+ ; SEE pr4  1 2 3 pr4 s.
: pr5 /[331'+ ; SEE pr5  1 2 3 pr5 s.
: pr6 /[332'+ ; SEE pr6  1 2 3 pr6 s.
: pr7 /[312'- ; SEE pr7  1 2 3 pr7 s.
: pr8 /[313'- ; SEE pr8  1 2 3 pr8 s.
: pr9 /[323'- ; SEE pr9  1 2 3 pr9 s.
: prA /[321'- ; SEE prA  1 2 3 prA s.
: prB /[331'- ; SEE prB  1 2 3 prB s.
: prC /[332'- ; SEE prC  1 2 3 prC s.


ЛОГ.
Код:
[312'+
b cc_o

CODE pr1
60C6BB 8B4D00           MOV     ECX , 0 [EBP]
60C6BE 014D04           ADD     4 [EBP] , ECX
60C6C1 C3               RET     NEAR
END-CODE
( 7 bytes, 3 instructions )
3 2 3

[313'+
b cc_o

CODE pr2
60C6D3 014504           ADD     4 [EBP] , EAX
60C6D6 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
4 2 3

[323'+
b cc_o

CODE pr3
60C6E7 014500           ADD     0 [EBP] , EAX
60C6EA C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 5 3

[321'+
b cc_o

CODE pr4
60C6FB 8B4D04           MOV     ECX , 4 [EBP]
60C6FE 014D00           ADD     0 [EBP] , ECX
60C701 C3               RET     NEAR
END-CODE
( 7 bytes, 3 instructions )
1 3 3

[331'+
b cc_o

CODE pr5
60C713 034504           ADD     EAX , 4 [EBP]
60C716 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 2 4

[332'+
b cc_o

CODE pr6
60C727 034500           ADD     EAX , 0 [EBP]
60C72A C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 2 5

[312'-
b cc_o

CODE pr7
60C73B 8B4D00           MOV     ECX , 0 [EBP]
60C73E 294D04           SUB     4 [EBP] , ECX
60C741 C3               RET     NEAR
END-CODE
( 7 bytes, 3 instructions )
4294967295(-1) 2 3

[313'-
b cc_o

CODE pr8
60C753 294504           SUB     4 [EBP] , EAX
60C756 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
4294967294(-2) 2 3

[323'-
b cc_o

CODE pr9
60C767 294500           SUB     0 [EBP] , EAX
60C76A C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 4294967295(-1) 3

[321'-
b cc_o

CODE prA
60C77B 8B4D04           MOV     ECX , 4 [EBP]
60C77E 294D00           SUB     0 [EBP] , ECX
60C781 C3               RET     NEAR
END-CODE
( 7 bytes, 3 instructions )
1 1 3

[331'-
b cc_o

CODE prB
60C793 2B4504           SUB     EAX , 4 [EBP]
60C796 C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 2 2

[332'-
b cc_o

CODE prC
60C7A7 2B4500           SUB     EAX , 0 [EBP]
60C7AA C3               RET     NEAR
END-CODE
( 4 bytes, 2 instructions )
1 2 1
Ok

PS. Такие операторы нужны для работы с ячейками стека как с локальными переменными.
Сообщение Добавлено: Пн апр 26, 2021 00:56
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Ввел поддержку операций над непосредственно заданными операндами
Код:
: tst /`5`4*`3-`A*`4/`5+`A* ;
SEE tst
tst
: tst1 5 4 * 3 - 10 * 4 / 5 + 10 *  ;
SEE tst1
tst1

LOG
Код:
CODE tst
60C197 8945FC           MOV     FC [EBP] , EAX
60C19A B8D6010000       MOV     EAX , # 1D6
60C19F 8D6DFC           LEA     EBP , FC [EBP]
60C1A2 C3               RET     NEAR
END-CODE
( 12 bytes, 4 instructions )


CODE tst1
60C1B7 8945FC           MOV     FC [EBP] , EAX
60C1BA B8AA000000       MOV     EAX , # AA
60C1BF B904000000       MOV     ECX , # 4
60C1C4 99               CDQ
60C1C5 F7F9             IDIV    ECX
60C1C7 8D4005           LEA     EAX , 5 [EAX]
60C1CA 69C00A000000     IMUL    EAX , EAX , # A
60C1D0 8D6DFC           LEA     EBP , FC [EBP]
60C1D3 C3               RET     NEAR
END-CODE
( 29 bytes, 9 instructions )

Ok ( 470 470 )

PS Использовал прием модификации исходного текста во время компиляции,
поэтому все вылилось в добавку двух строчек в текст транслятора.
Сообщение Добавлено: Сб апр 17, 2021 16:16
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Ввел слова прямого изменения содержимого ячеек стека.
Как правило такие ячейки используются как счетчики в циклах.
Код:
: d. CR DEPTH .SN S0 @ SP! ;

1 TO OTL \ вкл декомпилятор

\ примеры увеличения-уменьшения содержимого ячеек
: tst /[4"1A'2F"32'41 ; SEE tst
10 20 30 40 tst  d.

: tst1 /[2"13'25* ;  SEE tst1
3 12 tst1 d.

LOG
Код:
[4"1A'2F"32'41   \ (1c + 10) (2c - 15) (3c + 2) (4c - 1)
b +c#-c#+c#-c#

CODE tst
60B133 8345080A         ADD     8 [EBP] , # 10
60B137 836D040F         SUB     4 [EBP] , # 15
60B13B 83450002         ADD     0 [EBP] , # 2
60B13F 8D40FF           LEA     EAX , FF [EAX]
60B142 C3               RET     NEAR
END-CODE
( 16 bytes, 5 instructions )

20 5 32 39

[2"13'25*
b +c#-c#o

CODE tst1
60B153 83450003         ADD     0 [EBP] , # 3
60B157 8D40FB           LEA     EAX , FB [EAX]
60B15A F76D00           IMUL    0 [EBP]
60B15D 8D6D04           LEA     EBP , 4 [EBP]
60B160 C3               RET     NEAR
END-CODE
( 14 bytes, 5 instructions )

42

PS.
Синтаксис на данном этапе может меняться.
В конечном итоге можно написать транспилятор
для более удобного представления таких выражений, например аналогичных SPF-му
виду для локальных переменных, только с возможностью многократного применения
конструкций типа { a b c | d e f ... } и использования имен обычных слов форта.
Сама текущая нотация будет первичным(промежуточным) языком.
Сообщение Добавлено: Чт апр 08, 2021 23:54
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Более сложный случай применения принятой модели вычислений:
определим форму записи чисел с плав. точкой как 3,14159265,
и напишем преобразователь из нее в форму, принятую в SPF.

Код:
\ 12 3456 1-a 2-u 3-sq 4-sz 5-pt 6-an
: NOTFOUND
/[20ddd12+1$Ib(0(:H?'3tIb(-=?I1-:5'4tL
/321b(,-?`it`i=4y=&Z?12`N"1X;t
/2iih:6162V(e62+w(.65+w62iv"1X ;

Проверяем как это работает
Код:
\ длина окружности
: Lkr. ( R -- Lkr) 2,0 /`*`P`*`. ; SEE Lkr.
10,0 Lkr.
\ площадь круга
: Skr. ( R -- Skr) /`d`*`P`*`. ; SEE Skr.
10,0 Skr.

LOG
Код:
CODE Lkr.
60C1AB E8B87AF4FF       CALL    553C68  ( _FLIT-CODE8 )
60C1B0  A;   0 C,  0 C,  0 C,  0 C,  0 C,  0 C,  0 C, 40 C,
60C1B8 DEC9             FMULP   ST(1)
60C1BA D9EB             FLDPI
60C1BC DEC9             FMULP   ST(1)
60C1BE E8DC67FAFF       CALL    5B299F  ( F. )
60C1C3 C3               RET     NEAR
END-CODE
( 25 bytes, 6 instructions )
62,831853

CODE Skr.
60C1D7 D9C0             FLD     ST(0)
60C1D9 DEC9             FMULP   ST(1)
60C1DB D9EB             FLDPI
60C1DD DEC9             FMULP   ST(1)
60C1DF E8BB67FAFF       CALL    5B299F  ( F. )
60C1E4 C3               RET     NEAR
END-CODE
( 14 bytes, 6 instructions )
314,15927
Ok
Сообщение Добавлено: Ср мар 31, 2021 23:39
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Увлекаться сокращением текста сильно не стоит, иначе будут получаться нечитаемые тексты.
Вот пример слова определяющего мин. мах. и сумму байтов в строке.
Код:
: MaxMinSumBytes /[2{1b12GIb}M{Lcys}x1mx2x1+L"1. ;
S" 325435463ehgfdchgGFFGKJH" MaxMinSumBytes

LOG
Код:
h 2 1837
Ok
Сообщение Добавлено: Вт мар 30, 2021 00:50
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
О реализация повторного использования кода на примере.
Код:
: example \ a1 (1) u1 (2) a2 (3) u2 (4) --
\   1                2
/[4{24+dh}162V362+4V{65T}x1364V164+2V\x2"1X ;

Выделяем кусок текста скобками { } а затем пишем х1
если повторяем первый выделенный таким образом кусок
Сам выделенный кусок будет исполнятся, а x1 в коде
будет компиляцией выделенного текста в другом месте.
Следующий выделенный кусок обозначается как х2 и тд.
Получается распределенный по коду словарик с именами х1.. хn.
Разница только в том, что код в каждой позиции повторения может быть
для одного выделения разным, так как в общем случае код позиционно зависимый.
Семантика одинакова и соответствует исходному тексту.
Сообщение Добавлено: Пн мар 29, 2021 19:46
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
KPG писал(а):
При дублировании 2-ух элементов стэка (2DUP) по необходимости вычисления ещё по этим числам,
промежуточные результаты также "попадают" в новую ячейку стэка.

Я не пытаюсь улучшить эффективность форт-кода до максимума.
Целью моих экспериментов является стековый язык без оперативного инструментального контекста,
который в широком ассортименте представлен в традиционном форте:
- контекст текущего расположения параметров на стеке
- контекст текущего состояния вновь определенных слов - обычные и немедленного исполнения
- контекст текущего состояние контекстных словарей
- практика создания большого количества имен слов за короткие интервалы времени при программировании
- ошибки в кодировании алгоритма приводят к погружению не только в сам алгоритм но и в инструментальный
оперативный контекст при программировании этого алгоритма.
- ... здесь можно добавить ваши замечания
Это обстоятельство на мой взгляд заметно замедляет процесс создания надежного ПО на форте.
Сообщение Добавлено: Вт мар 16, 2021 15:17
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
При дублировании 2-ух элементов стэка (2DUP) по необходимости вычисления ещё по этим числам,
промежуточные результаты также "попадают" в новую ячейку стэка.

: DCRT3 \ { a b c }
\ b c + a * b c * +
2DUP + >R * SWAP R> * +
;
SEE DCRT3
Код:
DCRT3
( 004D45D0    8BD3 )                  MOV       EDX, EBX
( 004D45D2    035D00 )                ADD       EBX, [EBP]
( 004D45D5    53 )                    PUSH      EBX
( 004D45D6    0FAF5500 )              IMUL      EDX, [EBP]
( 004D45DA    5B )                    POP       EBX
( 004D45DB    0FAF5D04 )              IMUL      EBX, [EBP+04]
( 004D45DF    03DA )                  ADD       EBX, EDX
( 004D45E1    8D6D08 )                LEA       EBP, [EBP+08]
( 004D45E4    C3 )                    NEXT,
( 21 bytes, 9 instructions )


P.S. Скорее здесь срабатывает шаблон на 2DUP + и подобные в макрооптимизаторе SPF4,
по предложенному способу, наверное, мог бы быть дополнен штатный макрооптимизатор SPF4, если "подводные камни" не так значительны.

Для VFX Forth

: S+ { a1 u1 a2 u2 \ a u }
u1 u2 + DUP TO u ALLOCATE THROW TO a a1 a u1 MOVE a2 a u1 + u2 MOVE a u ;
see S+
Код:
( 00498E00    E8E3B7F6FF07000000 )    CALL      004045E8        MAKELVS  #args = 0007, #locals = 0000 cells
( 00498E09    8B5714 )                MOV       EDX, [EDI+14]
( 00498E0C    03571C )                ADD       EDX, [EDI+1C]
( 00498E0F    895708 )                MOV       [EDI+08], EDX
( 00498E12    8D6DFC )                LEA       EBP, [EBP+-04]
( 00498E15    895D00 )                MOV       [EBP], EBX
( 00498E18    8BDA )                  MOV       EBX, EDX
( 00498E1A    FF1591604100 )          CALL      [00416091]      ALLOCATE
( 00498E20    E8E7A3F7FF )            CALL      0041320C        THROW
( 00498E25    895F0C )                MOV       [EDI+0C], EBX
( 00498E28    8D6DF8 )                LEA       EBP, [EBP+-08]
( 00498E2B    8B5F1C )                MOV       EBX, [EDI+1C]
( 00498E2E    8B570C )                MOV       EDX, [EDI+0C]
( 00498E31    895500 )                MOV       [EBP], EDX
( 00498E34    8B5720 )                MOV       EDX, [EDI+20]
( 00498E37    895504 )                MOV       [EBP+04], EDX
( 00498E3A    E841BAF6FF )            CALL      00404880        MOVE
( 00498E3F    8B571C )                MOV       EDX, [EDI+1C]
( 00498E42    03570C )                ADD       EDX, [EDI+0C]
( 00498E45    8D6DF4 )                LEA       EBP, [EBP+-0C]
( 00498E48    895500 )                MOV       [EBP], EDX
( 00498E4B    8B5718 )                MOV       EDX, [EDI+18]
( 00498E4E    895504 )                MOV       [EBP+04], EDX
( 00498E51    895D08 )                MOV       [EBP+08], EBX
( 00498E54    8B5F14 )                MOV       EBX, [EDI+14]
( 00498E57    E824BAF6FF )            CALL      00404880        MOVE
( 00498E5C    8D6DF8 )                LEA       EBP, [EBP+-08]
( 00498E5F    8B570C )                MOV       EDX, [EDI+0C]
( 00498E62    895500 )                MOV       [EBP], EDX
( 00498E65    895D04 )                MOV       [EBP+04], EBX
( 00498E68    8B5F08 )                MOV       EBX, [EDI+08]
( 00498E6B    8B6704 )                MOV       ESP, [EDI+04]
( 00498E6E    8B3F )                  MOV       EDI, 0 [EDI]
( 00498E70    C3 )                    NEXT,
( 113 bytes, 34 instructions )


: MAXMIN { a b c }
a b MAX c MIN DROP ;
SEE MAXMIN

Код:
( 00498EA0    8BD4 )                  MOV       EDX, ESP
( 00498EA2    FF7504 )                PUSH      [EBP+04]
( 00498EA5    FF7500 )                PUSH      [EBP]
( 00498EA8    53 )                    PUSH      EBX
( 00498EA9    52 )                    PUSH      EDX
( 00498EAA    57 )                    PUSH      EDI
( 00498EAB    8BFC )                  MOV       EDI, ESP
( 00498EAD    81EC00000000 )          SUB       ESP, 00000000
( 00498EB3    8B5D08 )                MOV       EBX, [EBP+08]
( 00498EB6    8D6D0C )                LEA       EBP, [EBP+0C]
( 00498EB9    8B5710 )                MOV       EDX, [EDI+10]
( 00498EBC    8B4F0C )                MOV       ECX, [EDI+0C]
( 00498EBF    3BD1 )                  CMP       EDX, ECX
( 00498EC1    0F4CD1 )                CMOVL/NGE EDX, ECX
( 00498EC4    8B4F08 )                MOV       ECX, [EDI+08]
( 00498EC7    3BD1 )                  CMP       EDX, ECX
( 00498EC9    0F4FD1 )                CMOVNLE/G EDX, ECX
( 00498ECC    8B6704 )                MOV       ESP, [EDI+04]
( 00498ECF    8B3F )                  MOV       EDI, 0 [EDI]
( 00498ED1    C3 )                    NEXT,
( 50 bytes, 20 instructions )


: MAXMIN \ { a b c }
\ a b MAX c MIN DROP ;
>R MAX R> MIN DROP ;
SEE MAXMIN
Код:
MAXMIN
( 004D45E0    53 )                    PUSH      EBX
( 004D45E1    8B5D04 )                MOV       EBX, [EBP+04]
( 004D45E4    8B5500 )                MOV       EDX, [EBP]
( 004D45E7    3BDA )                  CMP       EBX, EDX
( 004D45E9    0F4CDA )                CMOVL/NGE EBX, EDX
( 004D45EC    5A )                    POP       EDX
( 004D45ED    3BDA )                  CMP       EBX, EDX
( 004D45EF    0F4FDA )                CMOVNLE/G EBX, EDX
( 004D45F2    8B5D08 )                MOV       EBX, [EBP+08]
( 004D45F5    8D6D0C )                LEA       EBP, [EBP+0C]
( 004D45F8    C3 )                    NEXT,
( 25 bytes, 11 instructions )
Сообщение Добавлено: Вт мар 16, 2021 11:55
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
При такой модели использования стека параметров (без слов манипуляции параметрами типа DUP и тп)
пробую делать контроль корректности форт-текстов на этапе компиляции
на основе контроля баланса стековых эффектов слов.
Всплывают интересные детали. Для пояснения, например:
- Стековый эффект ветвей структуры IF ELSE THEN должен
по идее быть одинаковым, а на деле это мб и не так.
- Стек мб физически не опустошен, а на деле для слов он "пуст",
так как содержит не те параметры, которые предполагал программист, а
более глубокого "залегания". Все это из-за ошибок, которые на этапе
компиляции как раз не отлавливаются.
А так, как многообразие новых мелких слов это не путь при программировании на форте, да и на любом языке(по моему мнению), то должно быть мало новых слов, но их сложность должна соответствовать сложности решаемой задачи, поэтому на этапе компиляции должно вычерпываться максимум ошибок.
Сообщение Добавлено: Чт мар 04, 2021 00:54
  Заголовок сообщения:  Re: Еще один способ работы с параметрами на стеке  Ответить с цитатой
Mодель использования стека параметров та же что и предыдущая.
Стековый кадр заданного размера является одним из источников
параметров для вычислений и в процессе этих вычислений остается неизменным.
В конце вычислений он модифицируется путем записи в его начальные ячейки
полученных выходных данных и удаления уже ненужных параметров
путем уменьшения глубины стека переустановкой указателя стека.
Но реализация этой модели изменена - оказалось возможным использовать
лишь один указатель для стека, что с одной стороны упростило реализацию
(около 200 строк текста), а с другой стороны повысило эффективность
генерируемого кода.

Представление об эффективности кода можно получить из небольшого количества примеров
в сравнении с кодом с использованием локальных переменных в SPF. Алгоритмы в примерах
абсолютно одинаковы для SPF и предложенного подхода.

Код:
\ конкатенация строк
: S+ { a1 u1 a2 u2 \ a u }
u1 u2 + DUP TO u ALLOCATE THROW TO a a1 a u1 MOVE a2 a u1 + u2 MOVE a u ;
SEE S+
: TST2 S" 123" S" ABС" S+ ;
METER0 TST2

: s+ \ a1 u1 a2 u2 -- a u
\[424+dh162V362+4V:15:2]2 ;
SEE s+
: tst2 S" 123" S" ABС" s+ ;
METER0 tst2

\ функции макс-мин
: MAXMIN { a b c }
a b MAX c MIN DROP ;
SEE MAXMIN
: TST 8 4 9 MAXMIN ;
METER0 TST

: maxmin \[312M3m"1 ;
SEE maxmin
: tst 8 4 9 maxmin ;
METER0 tst

\ сумма попарных произведений 3х параметров
: DCRT3 { a b c }
b c + a * b c * + ;
SEE DCRT3
: TST1 2 3 4 DCRT3 ;
METER0 TST1

: dcrt3 \[323+1*23*+"1 ;
SEE dcrt3
: tst1 2 3 4 dcrt3 ;
METER0 tst1

лог
Код:
CODE S+
5FCC5F 8945FC           MOV     FC [EBP] , EAX
5FCC62 B810000000       MOV     EAX , # 10
5FCC67 8D6DFC           LEA     EBP , FC [EBP]
5FCC6A E87564F5FF       CALL    5530E4  ( DRMOVE )
5FCC6F 8945FC           MOV     FC [EBP] , EAX
5FCC72 B802000000       MOV     EAX , # 2
5FCC77 8D6DFC           LEA     EBP , FC [EBP]
5FCC7A E8A165F5FF       CALL    553220  ( (RALLOT) )
5FCC7F 6818000000       PUSH    , # 18
5FCC84 6868325500       PUSH    , # 553268
5FCC89 8945FC           MOV     FC [EBP] , EAX
5FCC8C 8B442418         MOV     EAX , 18 [ESP]
5FCC90 03442410         ADD     EAX , 10 [ESP]
5FCC94 8945F8           MOV     F8 [EBP] , EAX
5FCC97 89442408         MOV     8 [ESP] , EAX
5FCC9B 8B45F8           MOV     EAX , F8 [EBP]
5FCC9E 8D6DFC           LEA     EBP , FC [EBP]
5FCCA1 E8F282F5FF       CALL    554F98  ( ALLOCATE )
5FCCA6 E80584F5FF       CALL    5550B0  ( THROW )
5FCCAB 8944240C         MOV     C [ESP] , EAX
5FCCAF 8B44241C         MOV     EAX , 1C [ESP]
5FCCB3 8945FC           MOV     FC [EBP] , EAX
5FCCB6 8B44240C         MOV     EAX , C [ESP]
5FCCBA 8945F8           MOV     F8 [EBP] , EAX
5FCCBD 8B442418         MOV     EAX , 18 [ESP]
5FCCC1 8D6DF8           LEA     EBP , F8 [EBP]
5FCCC4 E8B770F5FF       CALL    553D80  ( MOVE )
5FCCC9 8945FC           MOV     FC [EBP] , EAX
5FCCCC 8B442414         MOV     EAX , 14 [ESP]
5FCCD0 8945F8           MOV     F8 [EBP] , EAX
5FCCD3 8B44240C         MOV     EAX , C [ESP]
5FCCD7 03442418         ADD     EAX , 18 [ESP]
5FCCDB 8945F4           MOV     F4 [EBP] , EAX
5FCCDE 8B442410         MOV     EAX , 10 [ESP]
5FCCE2 8D6DF4           LEA     EBP , F4 [EBP]
5FCCE5 E89670F5FF       CALL    553D80  ( MOVE )
5FCCEA 8945FC           MOV     FC [EBP] , EAX
5FCCED 8B44240C         MOV     EAX , C [ESP]
5FCCF1 8945F8           MOV     F8 [EBP] , EAX
5FCCF4 8B442408         MOV     EAX , 8 [ESP]
5FCCF8 8D6DF8           LEA     EBP , F8 [EBP]
5FCCFB C3               RET     NEAR
END-CODE
( 157 bytes, 42 instructions )

8394  nsec

CODE s+
5FCD3B 8945FC           MOV     FC [EBP] , EAX
5FCD3E 8B45FC           MOV     EAX , FC [EBP]
5FCD41 8D6DFC           LEA     EBP , FC [EBP]
5FCD44 034508           ADD     EAX , 8 [EBP]
5FCD47 8945FC           MOV     FC [EBP] , EAX
5FCD4A 8D6DFC           LEA     EBP , FC [EBP]
5FCD4D E83D82FFFF       CALL    5F4F8F  ( hAlloc )
5FCD52 8945FC           MOV     FC [EBP] , EAX
5FCD55 8B4510           MOV     EAX , 10 [EBP]
5FCD58 8945F8           MOV     F8 [EBP] , EAX
5FCD5B 8B45FC           MOV     EAX , FC [EBP]
5FCD5E 8945F4           MOV     F4 [EBP] , EAX
5FCD61 8B450C           MOV     EAX , C [EBP]
5FCD64 8D6DF4           LEA     EBP , F4 [EBP]
5FCD67 E81470F5FF       CALL    553D80  ( MOVE )
5FCD6C 8945FC           MOV     FC [EBP] , EAX
5FCD6F 8B4508           MOV     EAX , 8 [EBP]
5FCD72 8945F8           MOV     F8 [EBP] , EAX
5FCD75 8B45FC           MOV     EAX , FC [EBP]
5FCD78 8D6DF8           LEA     EBP , F8 [EBP]
5FCD7B 034514           ADD     EAX , 14 [EBP]
5FCD7E 8945FC           MOV     FC [EBP] , EAX
5FCD81 8B450C           MOV     EAX , C [EBP]
5FCD84 8D6DFC           LEA     EBP , FC [EBP]
5FCD87 E8F46FF5FF       CALL    553D80  ( MOVE )
5FCD8C 894510           MOV     10 [EBP] , EAX
5FCD8F 8B5D00           MOV     EBX , 0 [EBP]
5FCD92 895D0C           MOV     C [EBP] , EBX
5FCD95 8B450C           MOV     EAX , C [EBP]
5FCD98 8D6D10           LEA     EBP , 10 [EBP]
5FCD9B C3               RET     NEAR
END-CODE
( 97 bytes, 31 instructions )

5288  nsec

CODE MAXMIN
5FCDDF 8945FC           MOV     FC [EBP] , EAX
5FCDE2 B80C000000       MOV     EAX , # C
5FCDE7 8D6DFC           LEA     EBP , FC [EBP]
5FCDEA E8F562F5FF       CALL    5530E4  ( DRMOVE )
5FCDEF 680C000000       PUSH    , # C
5FCDF4 6868325500       PUSH    , # 553268
5FCDF9 8945FC           MOV     FC [EBP] , EAX
5FCDFC 8B442410         MOV     EAX , 10 [ESP]
5FCE00 8945F8           MOV     F8 [EBP] , EAX
5FCE03 8B44240C         MOV     EAX , C [ESP]
5FCE07 8D6DF8           LEA     EBP , F8 [EBP]
5FCE0A E86155F5FF       CALL    552370  ( MAX )
5FCE0F 8945FC           MOV     FC [EBP] , EAX
5FCE12 8B442408         MOV     EAX , 8 [ESP]
5FCE16 8D6DFC           LEA     EBP , FC [EBP]
5FCE19 E86E55F5FF       CALL    55238C  ( MIN )
5FCE1E C3               RET     NEAR
END-CODE
( 64 bytes, 17 instructions )

130  nsec

CODE maxmin
5FCE63 8945FC           MOV     FC [EBP] , EAX
5FCE66 8B4500           MOV     EAX , 0 [EBP]
5FCE69 8D6DFC           LEA     EBP , FC [EBP]
5FCE6C 8B5508           MOV     EDX , 8 [EBP]
5FCE6F 3BD0             CMP     EDX , EAX
5FCE71 0F4FC2           CMOVG   EAX , EDX
5FCE74 8B5500           MOV     EDX , 0 [EBP]
5FCE77 3BD0             CMP     EDX , EAX
5FCE79 0F4CC2           CMOVL   EAX , EDX
5FCE7C 8D6D0C           LEA     EBP , C [EBP]
5FCE7F C3               RET     NEAR
END-CODE
( 29 bytes, 11 instructions )

85  nsec

CODE DCRT3
5FCEC7 8945FC           MOV     FC [EBP] , EAX
5FCECA B80C000000       MOV     EAX , # C
5FCECF 8D6DFC           LEA     EBP , FC [EBP]
5FCED2 E80D62F5FF       CALL    5530E4  ( DRMOVE )
5FCED7 680C000000       PUSH    , # C
5FCEDC 6868325500       PUSH    , # 553268
5FCEE1 8945FC           MOV     FC [EBP] , EAX
5FCEE4 8B44240C         MOV     EAX , C [ESP]
5FCEE8 03442408         ADD     EAX , 8 [ESP]
5FCEEC 8945F8           MOV     F8 [EBP] , EAX
5FCEEF 8B442410         MOV     EAX , 10 [ESP]
5FCEF3 F76DF8           IMUL    F8 [EBP]
5FCEF6 8945F8           MOV     F8 [EBP] , EAX
5FCEF9 8B44240C         MOV     EAX , C [ESP]
5FCEFD 8945F4           MOV     F4 [EBP] , EAX
5FCF00 8B442408         MOV     EAX , 8 [ESP]
5FCF04 F76DF4           IMUL    F4 [EBP]
5FCF07 0345F8           ADD     EAX , F8 [EBP]
5FCF0A 8D6DFC           LEA     EBP , FC [EBP]
5FCF0D C3               RET     NEAR
END-CODE
( 71 bytes, 20 instructions )

700  nsec

CODE dcrt3
5FCF53 8945FC           MOV     FC [EBP] , EAX
5FCF56 8B45FC           MOV     EAX , FC [EBP]
5FCF59 8D6DFC           LEA     EBP , FC [EBP]
5FCF5C 034504           ADD     EAX , 4 [EBP]
5FCF5F F76D08           IMUL    8 [EBP]
5FCF62 8945FC           MOV     FC [EBP] , EAX
5FCF65 8B4500           MOV     EAX , 0 [EBP]
5FCF68 8D6DFC           LEA     EBP , FC [EBP]
5FCF6B F76D08           IMUL    8 [EBP]
5FCF6E 034500           ADD     EAX , 0 [EBP]
5FCF71 8D6D10           LEA     EBP , 10 [EBP]
5FCF74 C3               RET     NEAR
END-CODE
( 34 bytes, 12 instructions )

238  nsec

PS
1. Код попроще и побыстрее.
2. Писать такой код тоже попроще и побыстрее (исчезает основная составляющая
оперативного инструментального контекста)
3. Время поиска имен операторов в предложенной форме записи можно свести
к теоретическому минимуму - к одному обращению к памяти.
Интерпретация(как следствие быстрого поиска имен) может быть предельно ускорена.
Ну и компиляция по той же причине тоже ускоряется.
4. Введение внешнего флага немедленного исполнения(как атрибута имени - в виде, например, суффикса)
исключает понятие слова немедленного исполнения (таким образом исключается еще одна составляющая
оперативного инструментального контекста).
PPS
Некоторое уточнение, источником параметров является не только неизменный исходный стековый кадр,
но и содержимое всех ячеек текущего стека. "Именем" параметра является номер ячейки-контейнера
стека. По "имени" выкладывается на стек содержимое ячейки-контейнера. Начальная ячейка исходного
стекового кадра имеет номер 1.
В записи \[312+22*43*2- фрагмент [3 означает что исходный стековый кадр имеет размер 3 ячейки,
ячейки нумеруются 1 2 3. Фрагмент 12+ означает, что в ячейке 4 будет сумма содержимого 1 и 2 ячейки,
а ячейке 5 будет квадрат содержимого ячейки 2, а фрагмент 43*2- поместит в ячейку 6 результат 43*2-.
Таким образом стек будет содержать 6 ячеек. Имеем таким образом несколько другой порядок
работы с параметрами на стеке, с более "прямым" к ним доступом.
Сообщение Добавлено: Чт фев 25, 2021 21:03

Часовой пояс: UTC + 3 часа [ Летнее время ]


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB