Forth http://fforum.winglion.ru/ |
|
Еще один способ работы с параметрами на стеке http://fforum.winglion.ru/viewtopic.php?f=2&t=3141 |
Страница 2 из 5 |
Автор: | mOleg [ Ср янв 31, 2018 14:00 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
_KROL писал(а): Хм, но это же область пользователя, да и слова пользовательские, или я что-то недопонимаю? похоже на то. У тебя есть главный процесс, внутри него можно запустить еще несколько потоков, у которых будет общая память, за исключением как раз пользовательской области. Т.е. если у тебя крутится два потока, то изменение одной глобальной переменной будет влиять на другой. Чем тебя пользовательская область памяти смущает мне не ясно, тем более, что стек каждого потока тоже в ней находится. |
Автор: | Victor__v [ Ср янв 31, 2018 14:02 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
mOleg писал(а): Victor__v писал(а): А вот использование юзер-области для ЛОКАЛЬНЫХ служебных слов т.е. работающих не повсеместно в форте, не есть хорошо (личное мнение) А обосновать можете? Обычно, как раз наоборот считается. юзверь должен использоваться для конечной задачи, которую решает форт. А, к примеру, механизм лок. переменных, явно вспомогателен. Если же новый стек активно используется в многопоточном приложении, то пусть будет. Но ежели это что-то вспомогательное, стреляющее отсюда и до обеда, (лок. переменные) то смысл это в пользовательскую память засовывать? |
Автор: | chess [ Чт апр 12, 2018 23:00 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Вспомнил еще одну свою-же старую идею варианта работы с параметрами на стеке - вариант, похоже наиболее для меня подходящий. Код: \ два стека параметров с одним указателем - "качалка" |<--60 байтов -->| \ ------|----|---------|------| \ sp1 s1beg sp0 s0beg S0 @ CONSTANT s0beg S0 @ 60 - CONSTANT s1beg USER AddrSt s0beg AddrSt ! : ~ \ переключатель стеков S0 @ s0beg = IF s1beg DUP s0beg ELSE s0beg DUP s1beg THEN AddrSt ! S0 ! SP! ; : ~0 \ исходное сосстояние качалки s0beg DUP S0 ! SP! ; : [1 AddrSt @ 4 - @ ; : [2 AddrSt @ 8 - @ ; : [3 AddrSt @ 12 - @ ; : [4 AddrSt @ 16 - @ ; : [5 AddrSt @ 20 - @ ; : [6 AddrSt @ 24 - @ ; : [7 AddrSt @ 28 - @ ; : [8 AddrSt @ 32 - @ ; : [9 AddrSt @ 36 - @ ; : SumSq \ 1 2 -- 11* 22* + ~ [1 [1 * [2 [2 * + ; \ тоже в стенографической форме : SumSq \ 1 2 -- 11* 22* + /[11*22*+ ; \ здесь символ '[' это переключатель стеков - слово ~ 1 2 SumSq . Пс. В принципе вариант безопасный - не надо помнить какой из 2-х стеков текущий(выходной), а какой входной. По сравнению с предыдущим вариантом нет пересылки параметров единым массивом. |
Автор: | Victor__v [ Пт апр 13, 2018 20:10 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Код: S0 @ CONSTANT s0beg S0 @ 60 - CONSTANT s1beg А ничего так, что S0 это USER-переменная? А при вложенности качалка будет переключаться. Правильно понял? |
Автор: | chess [ Пт апр 13, 2018 20:44 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Victor__v писал(а): А ничего так, что S0 это USER-переменная? Ну так и задумано в SPF для поддержки многозадачности, а я не выключаю эту поддержку, закидывая значения адресов оснований стеков 1 и 2 также в USER-переменную ( AddrSt ). Victor__v писал(а): А при вложенности качалка будет переключаться. Правильно понял? Смысл качалки в чем? В том, что на исходном стеке лежат параметры, например так 1 2 3, где 1 - самый нижний параметр, а 3 - самый верхний. Теперь мы начинаем выкладывать параметры с 1-го стека на второй в нужном нам порядке для обработки этих выложенных на 2-ой стек параметров соответствующими процедурами-словами( второй стек перед этим очищается). После обработки на 2-м стеке могут остаться новые параметры, которые в свою очередь могут быть выложены на 1-й стек, также предварительно очищенный и т.д. Как такового вложения здесь не наблюдается. В этом варианте нет нужды в словах типа SWAP OVER ROT >R R> и им подобным. Стеки рассматриваются как пары массив1-стек2, а затем как стек1-массив2. На каком стеке мы остановимся не имеет значения, поэтому тут не вводится новый инструментальный контекст. |
Автор: | diver [ Пт апр 13, 2018 22:03 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Блин...вся тема - из серии - "а месье знает толк в извращениях" |
Автор: | chess [ Сб апр 14, 2018 18:23 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
diver писал(а): Блин...вся тема - из серии - "а месье знает толк в извращениях" Ну вот и нашелся ценитель мастерства |
Автор: | chess [ Ср апр 25, 2018 16:55 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Небольшое усовершенствование механизма качалки. Иногда нужно дополнить набор параметров на исходном стеке небольшим количеством дополнительных параметров, получаемых из исходных параметров на этом стеке. Код: : ~s s1beg DUP S0 @ <> 60 AND + AddrSt ! ; \ после ~s параметры добавляются на тот же стек откуда они берутся И тогда, например: Код: \ конкатенация строк в хипе \ 1 2 3 4 5 2+4 : s+ \ a1 u1 a2 u2 -- a u ~s 2> 4> + ALLOCATE THROW \ к существующим параметрам a1 u1 a2 u2 на исходном стеке добавляется \ адрес результирующей строки в хипе ~ 1> 5> 2> MOVE 3> 5> 2> + 4> MOVE 5> 2> 4> + ; \ или стенографическая форма \ 1 2 3 4 5 2+4 : s+ \ a1 u1 a2 u2 -- a u /]24+h[152V352+4V524+ ; \ символ ']' это слово ~s : tst S" 12 " S" AB " s+ S" cdef" s+ ; tst TYPE ПС. Интересный момент - полностью отсутствуют присвоения, все становится похожим на функциональный язык. Не привожу примеры где параметры именуются произвольно - там все по-старому. |
Автор: | _KROL [ Ср апр 25, 2018 21:29 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
diver писал(а): Блин...вся тема - из серии - "а месье знает толк в извращениях" Это скорее не совсем извращения, а неординарный подход к проблеме. Мне вот вспомнился процессор Z80 с двумя регистровыми парами, где нельзя сразу знать, какая именно активна... |
Автор: | chess [ Вс дек 16, 2018 22:50 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Еще один вариант. Похож на используемый в SPF, но без пересылки параметров на стек возвратов. На стек возвратов пересылаются только адреса выбранных областей на стеке параметров. Используется факт асимметрии числа входных параметров и числа выходных параметров( входных гораздо больше чем выходных). Код: \ копия кода R@ для его последующей модификации при использовании внутри циклов со счетчиком :NONAME $ -4 Pa @P=A $ 4 A=@X ; CONSTANT r@ \ адрес копии кода R@ \ переопределение кода циклов со счетчиком M: Do DO 16 r@ 9 + C! ; M: ?Do ?DO 16 r@ 9 + C! ; M: Loop LOOP 4 r@ 9 + C! ; M: +Loop +LOOP 4 r@ 9 + C! ; \ положить адрес зафиксированной области параметров на стеке параметров на стек возврата M: a>r 4 * SP@ + >R ; \ положить выбранный параметр из зафиксированной области параметров на стеке на вершину стека параметров M: 1> r@ EXECUTE @ ; M: 2> r@ EXECUTE 4 - @ ; M: 3> r@ EXECUTE 8 - @ ; M: 4> r@ EXECUTE 12 - @ ; M: 5> r@ EXECUTE 16 - @ ; M: 6> r@ EXECUTE 20 - @ ; M: 7> r@ EXECUTE 24 - @ ; M: 8> r@ EXECUTE 28 - @ ; M: 9> r@ EXECUTE 32 - @ ; \ положить параметр с вершины стека в выбранную ячейку зафиксированной области параметров на стеке M: >1 r@ EXECUTE ! ; M: >2 r@ EXECUTE 4 - ! ; M: >3 r@ EXECUTE 8 - ! ; M: >4 r@ EXECUTE 12 - ! ; M: >5 r@ EXECUTE 16 - ! ; M: >6 r@ EXECUTE 20 - ! ; M: >7 r@ EXECUTE 24 - ! ; M: >8 r@ EXECUTE 28 - ! ; M: >9 r@ EXECUTE 32 - ! ; M: rx RDROP ; \ сохранить несколько верхних параметров стека в регистрах : !5 B=@P $ 4 C=@P $ 8 D=@P $ C S=@P ; : !4 B=@P $ 4 C=@P $ 8 D=@P ; : !3 B=@P $ 4 C=@P ; : !2 B=@P ; \ удалить несколько верхних параметров со стека : x1 $ 04 Pa ; : x2 $ 08 Pa ; : x3 $ 0C Pa ; : x4 $ 10 Pa ; : x5 $ 14 Pa ; : x6 $ 18 Pa ; : x7 $ 1C Pa ; : x8 $ 20 Pa ; : x9 $ 24 Pa ; \ положить сохраненные в регистрах параметры на вершину стека : @5 @P=B $ 4 @P=C $ 8 @P=D $ C @P=S ; : @4 @P=B $ 4 @P=C $ 8 @P=D ; : @3 @P=B $ 4 @P=C ; : @2 @P=B ; \ Пример : fibo \ n -- fn 1 1 3 a>r 1> 0 ?Do 3> 3> 2> + >3 >2 Loop rx x2 ; 10 fibo log Код: Ok ( 144 ) \ тоже на стенофорт Код: : fibo \ n -- fn 1 1 /`3[10$332+:3:2L]_2 ; PS. Используется модификация кода путем изменения в нем одного байта. При этом код для циклов со счетчиком работает и как раньше и по новому ( в отличие от SPF) |
Автор: | chess [ Ср дек 26, 2018 22:19 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Oчередной вариант ориентирован на максимальное быстродействие. Адрес начала стекового кадра данных сохраняем не в стеке возвратов, а в регистре ESI, т.к. он редко используется. Перед переходом к слову, код которого портит ESI, сохраняем ESI в стеке возвратов PUSH ESI , и после возврата из кода такого слова восстанавливам ESI из стека возвратов POP ESI. Для ускорения присвоение данных между ячейками выбранного стекового кадра делаем через регистр EDX. Код: \ Собственно реализация \ положить адрес выбранного самого нижнего параметра на стеке в регистр ESI M: a>s \ n -- выбранное число параметров на стеке 1- 4 * S=A S+P DROP ; M: rs RS=S ; \ положить ESI на стек возвратов M: sr S=RS ; \ снять со стека возвратов и положить в ESI \ положить выбранный параметр на вершину стека или в EDX M: 1> DUP A=@S ; M: <1 D=@S ; M: 2> DUP $ -4 A=@S ; M: <2 $ -4 D=@S ; M: 3> DUP $ -8 A=@S ; M: <3 $ -8 D=@S ; M: 4> DUP $ -C A=@S ; M: <4 $ -C D=@S ; M: 5> DUP $ -10 A=@S ; M: <5 $ -10 D=@S ; M: 6> DUP $ -14 A=@S ; M: <6 $ -14 D=@S ; M: 7> DUP $ -18 A=@S ; M: <7 $ -18 D=@S ; M: 8> DUP $ -1C A=@S ; M: <8 $ -1C D=@S ; M: 9> DUP $ -20 A=@S ; M: <9 $ -20 D=@S ; M: a> DUP $ -24 A=@S ; M: <a $ -24 D=@S ; M: b> DUP $ -28 A=@S ; M: <b $ -28 D=@S ; M: c> DUP $ -2C A=@S ; M: <c $ -2C D=@S ; M: d> DUP $ -30 A=@S ; M: <d $ -30 D=@S ; M: e> DUP $ -34 A=@S ; M: <e $ -34 D=@S ; M: f> DUP $ -38 A=@S ; M: <f $ -38 D=@S ; \ положить параметр с вершины стека или из EDX в выбранную ячейку стека M: >1 @S=A DROP ; M: 1< @S=D ; M: >2 $ -4 @S=A DROP ; M: 2< $ -4 @S=D ; M: >3 $ -8 @S=A DROP ; M: 3< $ -8 @S=D ; M: >4 $ -C @S=A DROP ; M: 4< $ -C @S=D ; M: >5 $ -10 @S=A DROP ; M: 5< $ -10 @S=D ; M: >6 $ -14 @S=A DROP ; M: 6< $ -14 @S=D ; M: >7 $ -18 @S=A DROP ; M: 7< $ -18 @S=D ; M: >8 $ -1C @S=A DROP ; M: 8< $ -1C @S=D ; M: >9 $ -20 @S=A DROP ; M: 9< $ -20 @S=D ; M: >a $ -24 @S=A DROP ; M: a< $ -24 @S=D ; M: >b $ -28 @S=A DROP ; M: b< $ -28 @S=D ; M: >c $ -2C @S=A DROP ; M: c< $ -2C @S=D ; M: >d $ -30 @S=A DROP ; M: d< $ -30 @S=D ; M: >e $ -34 @S=A DROP ; M: e< $ -34 @S=D ; M: >f $ -38 @S=A DROP ; M: f< $ -38 @S=D ; \ сохранить несколько верхних параметров стека в регистрах : !2 B=@P ; : !3 B=@P $ 4 C=@P ; : !4 B=@P $ 4 C=@P $ 8 D=@P ; \ удалить несколько верхних параметров со стека : x1 $ 04 Pa ; : x2 $ 08 Pa ; : x3 $ 0C Pa ; : x4 $ 10 Pa ; : x5 $ 14 Pa ; : x6 $ 18 Pa ; : x7 $ 1C Pa ; : x8 $ 20 Pa ; : x9 $ 24 Pa ; : xa $ 28 Pa ; : xb $ 2C Pa ; : xc $ 30 Pa ; : xd $ 34 Pa ; : xe $ 38 Pa ; \ положить сохраненные в регистрах параметры на вершину стека : @2 @P=B ; : @3 @P=B $ 4 @P=C ; : @4 @P=B $ 4 @P=C $ 8 @P=D ; Код: \ Примеры с измерением быстродействия \ конкатенация строк в хипе : S+ { a1 u1 a2 u2 \ a u } u1 u2 + DUP ALLOCATE THROW TO a TO u a1 a u1 MOVE a2 a u1 + u2 MOVE a u ; : T_S+ 1000 0 DO S" 123" S" abc" S+ 2DROP LOOP ; : s+ /`4[24+d(h)162362+4(VV)65:d_6'd ; : T_s+ 1000 0 DO S" 123" S" abc" s+ 2DROP LOOP ; DMETER T_S+ DMETER T_s+ \ мажоритар из 5 параметров на стеке : MAJ5 { a b c d e } a b = a c = AND a b = a d = AND OR a b = a e = AND OR a c = a d = AND OR a c = a e = AND OR a d = a e = AND OR b c = b d = AND OR b c = b e = AND OR b d = b e = AND OR c d = c e = AND OR ; : T_MAJ5 10000 0 DO 1 2 2 1 2 MAJ5 DROP LOOP ; : maj5 /`5 /[12=13=&12=14=&| /12=15=&|13=14=&| /13=15=&|14=15=&| /23=24=&|23=25=&| /24=25=&|34=35=&|_5 ; : T_maj5 10000 0 DO 1 2 2 1 2 maj5 DROP LOOP ; DMETER T_MAJ5 DMETER T_maj5 \ числа Фибоначчи : FIBO 1 1 { n a b } n 0 DO b a b + TO b TO a LOOP b ; : T_FIBO 100 0 DO 45 1 DO I FIBO DROP LOOP LOOP ; : fibo 1 1 /`3[10$2'3"2+L_2 ; : T_fibo 100 0 DO 45 1 DO I fibo DROP LOOP LOOP ; DMETER T_FIBO DMETER T_fibo лог Код: 154 MKCEK 106 MKCEK 204 MKCEK 193 MKCEK 222 MKCEK 181 MKCEK Ok PS. 1. Быстродействие по сравнению с SPF выше. 2. Коррекция слов, использующих стек возвратов при использовании таких локальных переменных не нужна. |
Автор: | Victor__v [ Чт дек 27, 2018 09:29 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Жаль для Новы не подойдёт Можно ещё для винды сделать стек областей в сегменте FS: (GS: если разрядность 64). |
Автор: | chess [ Пт мар 15, 2019 21:08 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Victor__v писал(а): Жаль для Новы не подойдёт Непонятно почему. Ничего нового для этого не требуется. Добавил в поддержку использования модели стека с двумя указателями немного автоматики. К примеру, всё таже конкатенация строк в хипе, теперь может быть выражена так: Код: \ номер-> 1 2 3 4 : S+ ( a1 u1 a2 u2 -- a u ) /4[24+dh162V362+4V65]2 ; Исходно на стеке 4 параметра. Для получения места под результирующую строку получаем длину этой строки сложив длины исходных строк u1 u2 + ( 24+ ), затем дублируем ее на стеке ( d это DUP ) для ALLOCATE THROW ( это h ). После этого на стеке шесть параметров a1 u1 a2 u2 u a , где u (пятый параметр) - длина результирующей строки, a (шестой параметр) - адрес начала строки в дин. памяти. Затем пересылаем с помощью MOVE (это V) сначала первую строку a1 u1, затем вторую строку a2 u2, предварительно размещая на стеке необходимые для MOVE параметры. Теперь на стеке остались 6 параметров a1 u1 a2 u2 u a. Кладем на стек параметры 6 и 5 ( a u ). На стеке 8 параметров. Сохраняем 2 верхних параметра в регистрах и удаляем оставшиеся 6 параметров, затем кладем на стек 2 сохраненых параметра( ]2 ). На стеке теперь два параметра ( a u ), что и требуется. Автоматика здесь в том, что число удаляемых параметров не задается программистом, а определяется по максимальному номеру параметра в определении. В данном случае это 6. PS. 1. Такой алгоритм передачи параметров между словами допускает полное исключение слов типа SWAP, ROT, OVER, >R, R> и т.п., что упрощает программирование без уменьшения эффективности кода программ. 2. Кроме того не возникает необходимость присвоений, как при введении локальных переменных, что также упрощает программирование. |
Автор: | chess [ Вс мар 31, 2019 19:43 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Можно работать со стеком и на уровне инструкций процессора Код: 0 VALUE gst : NOTFOUND { a u \ s1 s2 c>pr } a C@ DUP TO s1 48 58 WITHIN a 1+ C@ DUP TO s2 97 101 WITHIN s2 112 = OR s2 115 = OR AND DUP TO c>pr s1 97 101 WITHIN s2 48 58 WITHIN s2 97 101 WITHIN OR AND OR u 2 = AND 0= IF a u NOTFOUND EXIT THEN c>pr IF s2 115 = IF s1 48 - TO gst ELSE gst 1- s1 48 - - 4 * s2 CASE 97 OF 0x458B ENDOF 98 OF 0x5D8B ENDOF 99 OF 0x4D8B ENDOF 100 OF 0x558B ENDOF 112 OF 0x6D8D ENDOF ENDCASE W, C, THEN ELSE s2 97 101 WITHIN s2 97 101 WITHIN AND IF s1 97 - 10 * s2 97 - + CASE 01 OF 0xD88B ENDOF 02 OF 0xC88B ENDOF 03 OF 0xD08B ENDOF 10 OF 0xC38B ENDOF 12 OF 0xCB8B ENDOF 13 OF 0xD38B ENDOF 20 OF 0xC18B ENDOF 21 OF 0xD98B ENDOF 23 OF 0xD18B ENDOF 30 OF 0xC28B ENDOF 31 OF 0xDA8B ENDOF 32 OF 0xCA8B ENDOF ENDCASE W, ELSE gst 1- s2 48 - - 4 * s1 CASE 97 OF 0x4589 ENDOF 98 OF 0x5D89 ENDOF 99 OF 0x4D89 ENDOF 100 OF 0x5589 ENDOF ENDCASE W, C, THEN THEN ; \ Cинтаксис, cформированный вышеопределенным NOTFOUND: \ регистры: a - eax, b - ebx, c - ecx, d - edx, p - ebp \ ячейки стека: 1 2 3 .. n ( ячейка n находится в регистре eax ), nmax = 9 \ направление передачи --> ( с1 - из регистра с в ячейку 1, 4b - из ячейки 4 в регистр b, ab - из регистра a в регистр b ) \ установка указателя на ячейку ( 4p - установка указателя p на ячейку 4 ) \ установка кол-ва параметров на стеке( 6s - стек рассматриваем как 1 2 3 4 5 6, яч-ка 6 в регистре a ) \ Пример : 2rot \ 1 2 3 4 5 6 --> 3 4 5 6 1 2 6s 4b a4 2a b2 1b 3c c1 5c c3 b5 ; SEE 2rot 1 2 3 4 5 6 2rot LOG Код: CODE 2rot
5F9D8B 8B5D04 MOV EBX , 4 [EBP] 5F9D8E 894504 MOV 4 [EBP] , EAX 5F9D91 8B450C MOV EAX , C [EBP] 5F9D94 895D0C MOV C [EBP] , EBX 5F9D97 8B5D10 MOV EBX , 10 [EBP] 5F9D9A 8B4D08 MOV ECX , 8 [EBP] 5F9D9D 894D10 MOV 10 [EBP] , ECX 5F9DA0 8B4D00 MOV ECX , 0 [EBP] 5F9DA3 894D08 MOV 8 [EBP] , ECX 5F9DA6 895D00 MOV 0 [EBP] , EBX 5F9DA9 C3 RET NEAR END-CODE ( 31 bytes, 11 instructions ) Ok ( [6].. 4 5 6 1 2 ) |
Автор: | chess [ Ср апр 03, 2019 22:13 ] |
Заголовок сообщения: | Re: Еще один способ работы с параметрами на стеке |
Более логичный, и как следствие, более простой и оптимальный вариант. Сохраняем выходные параметры в нужном порядке и в нужном количестве в самом начале исходного стекового кадра стека параметров, а затем укорачиваем стековый кадр до ячеек с сохраненными выходными параметрами. Пример тот же. Код: : s+ /4[24+dh162V362+4V5:26:1]2 ; \ было 6 параметров на стеке, сохранили 5-й параметр в ячейке 2, 6-й в ячейке 1, \ а затем укоротили стек до 2-х ячеек. Синтаксис тот же, семантика другая. LOG Код: SEE s+ S" 123" S" abc" s+ CODE s+ 5F9E67 8BF5 MOV ESI , EBP 5F9E69 83C608 ADD ESI , # 8 5F9E6C 8945FC MOV FC [EBP] , EAX 5F9E6F 8B46FC MOV EAX , FC [ESI] 5F9E72 0346F4 ADD EAX , F4 [ESI] 5F9E75 8D6DFC LEA EBP , FC [EBP] 5F9E78 8945FC MOV FC [EBP] , EAX 5F9E7B 8D6DFC LEA EBP , FC [EBP] 5F9E7E E870B0FFFF CALL 5F4EF3 ( hAlloc ) 5F9E83 8945FC MOV FC [EBP] , EAX 5F9E86 8B4600 MOV EAX , 0 [ESI] 5F9E89 8945F8 MOV F8 [EBP] , EAX 5F9E8C 8B46EC MOV EAX , EC [ESI] 5F9E8F 8945F4 MOV F4 [EBP] , EAX 5F9E92 8B46FC MOV EAX , FC [ESI] 5F9E95 8D6DF4 LEA EBP , F4 [EBP] 5F9E98 E81EB4FFFF CALL 5F52BB ( Move ) 5F9E9D 8945FC MOV FC [EBP] , EAX 5F9EA0 8B46F8 MOV EAX , F8 [ESI] 5F9EA3 8945F8 MOV F8 [EBP] , EAX \ Press <enter> | q | any 5F9EA6 8B46EC MOV EAX , EC [ESI] 5F9EA9 0346FC ADD EAX , FC [ESI] 5F9EAC 8D6DF8 LEA EBP , F8 [EBP] 5F9EAF 8945FC MOV FC [EBP] , EAX 5F9EB2 8B46F4 MOV EAX , F4 [ESI] 5F9EB5 8D6DFC LEA EBP , FC [EBP] 5F9EB8 E8FEB3FFFF CALL 5F52BB ( Move ) 5F9EBD 8B56F0 MOV EDX , F0 [ESI] 5F9EC0 8956FC MOV FC [ESI] , EDX 5F9EC3 894600 MOV 0 [ESI] , EAX 5F9EC6 8D6D10 LEA EBP , 10 [EBP] 5F9EC9 8B45FC MOV EAX , FC [EBP] 5F9ECC C3 RET NEAR END-CODE ( 102 bytes, 33 instructions ) Ok ( 7564484 6 ) TYPE 123abc Ok Ссылка на модифицированный spf4, который поддерживает подобную модель стека https://cloud.mail.ru/public/2fvr/4Q6VibKVi |
Страница 2 из 5 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |