Forth http://fforum.winglion.ru/ |
|
Еще один способ работы с параметрами на стеке http://fforum.winglion.ru/viewtopic.php?f=2&t=3141 |
Страница 3 из 5 |
Автор: | chess [ Чт фев 25, 2021 21:03 ] |
Заголовок сообщения: | 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 ячеек. Имеем таким образом несколько другой порядок работы с параметрами на стеке, с более "прямым" к ним доступом. |
Автор: | chess [ Чт мар 04, 2021 00:54 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
При такой модели использования стека параметров (без слов манипуляции параметрами типа DUP и тп) пробую делать контроль корректности форт-текстов на этапе компиляции на основе контроля баланса стековых эффектов слов. Всплывают интересные детали. Для пояснения, например: - Стековый эффект ветвей структуры IF ELSE THEN должен по идее быть одинаковым, а на деле это мб и не так. - Стек мб физически не опустошен, а на деле для слов он "пуст", так как содержит не те параметры, которые предполагал программист, а более глубокого "залегания". Все это из-за ошибок, которые на этапе компиляции как раз не отлавливаются. А так, как многообразие новых мелких слов это не путь при программировании на форте, да и на любом языке(по моему мнению), то должно быть мало новых слов, но их сложность должна соответствовать сложности решаемой задачи, поэтому на этапе компиляции должно вычерпываться максимум ошибок. |
Автор: | KPG [ Вт мар 16, 2021 11:55 ] |
Заголовок сообщения: | 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 ) |
Автор: | chess [ Вт мар 16, 2021 15:17 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
KPG писал(а): При дублировании 2-ух элементов стэка (2DUP) по необходимости вычисления ещё по этим числам, промежуточные результаты также "попадают" в новую ячейку стэка. Я не пытаюсь улучшить эффективность форт-кода до максимума. Целью моих экспериментов является стековый язык без оперативного инструментального контекста, который в широком ассортименте представлен в традиционном форте: - контекст текущего расположения параметров на стеке - контекст текущего состояния вновь определенных слов - обычные и немедленного исполнения - контекст текущего состояние контекстных словарей - практика создания большого количества имен слов за короткие интервалы времени при программировании - ошибки в кодировании алгоритма приводят к погружению не только в сам алгоритм но и в инструментальный оперативный контекст при программировании этого алгоритма. - ... здесь можно добавить ваши замечания Это обстоятельство на мой взгляд заметно замедляет процесс создания надежного ПО на форте. |
Автор: | chess [ Пн мар 29, 2021 19:46 ] |
Заголовок сообщения: | 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. Разница только в том, что код в каждой позиции повторения может быть для одного выделения разным, так как в общем случае код позиционно зависимый. Семантика одинакова и соответствует исходному тексту. |
Автор: | chess [ Вт мар 30, 2021 00:50 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Увлекаться сокращением текста сильно не стоит, иначе будут получаться нечитаемые тексты. Вот пример слова определяющего мин. мах. и сумму байтов в строке. Код: : MaxMinSumBytes /[2{1b12GIb}M{Lcys}x1mx2x1+L"1. ; S" 325435463ehgfdchgGFFGKJH" MaxMinSumBytes LOG Код: h 2 1837
Ok |
Автор: | chess [ Ср мар 31, 2021 23:39 ] |
Заголовок сообщения: | 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 |
Автор: | chess [ Чт апр 08, 2021 23:54 ] |
Заголовок сообщения: | 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 ... } и использования имен обычных слов форта. Сама текущая нотация будет первичным(промежуточным) языком. |
Автор: | chess [ Сб апр 17, 2021 16:16 ] |
Заголовок сообщения: | 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 Использовал прием модификации исходного текста во время компиляции, поэтому все вылилось в добавку двух строчек в текст транслятора. |
Автор: | chess [ Пн апр 26, 2021 00:56 ] |
Заголовок сообщения: | 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. Такие операторы нужны для работы с ячейками стека как с локальными переменными. |
Автор: | chess [ Вт май 04, 2021 00:55 ] |
Заголовок сообщения: | 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 ) Несмотря на введение доп. операторов язык остается по прежнему стековым. |
Автор: | chess [ Ср май 12, 2021 01:08 ] |
Заголовок сообщения: | 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% точный перевод на первичный язык. Это конечно лишь часть транспилятора. |
Автор: | chess [ Чт май 13, 2021 00:58 ] |
Заголовок сообщения: | 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. В основном процесс транспиляции освоен, остались экстенсивные дополнения. |
Автор: | chess [ Сб май 15, 2021 23:53 ] |
Заголовок сообщения: | 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. Увеличив число команд виртуальной форт-машины, и поддержав прозрачный синтаксис локальных переменных ( на самом деле использование стека в стандартном Форте это и есть оперирование локальными переменными пусть и неявно заданными) можно получить эффективность кода не хуже чем у форта с оптимизатором, при этом практически исключив инструментальный динамический контекст. |
Автор: | Victor__v [ Вт май 18, 2021 14:15 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Как понимаю, Вы закидываете часть переменных выше вершины стека. Но как происходит контроль измерения глубины? При изменении этого самого стека? |
Страница 3 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |