Forth Forum Index Forth и другие саморасширяющиеся
системы программирования
 
 ForthFAQForthFAQ    СтатьиСтатьи    UsergroupsUsergroups    СтатьиGoogleSearch    MemberlistMemberlist  
 FAQForumFAQ  RegisterRegister   ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 
Locations of visitors to this page

Компилирующий ассемблер
Goto page Previous  1, 2, 3 ... 13, 14, 15
 
Post new topic   Reply to topic    Forth Forum Index -> Программирование (Programming)
View previous topic :: View next topic  
Author Message
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Thu May 22, 2008 17:27    Post subject: [QUOTE]

Совместное использование ассемблера и форта при создании форт-определений

Если в текст на форте вставляем законченный фрагмент на ассемблере ничего делать не надо, так как
регистры процессора внутри форт-определений инициируются параметрами либо со стека либо из памяти,
и поэтому их начальные состояния значения не имеют.
В случае же когда алгоритм кодируется на ассемблере и нужно вставить в текст на ассемблере слова на форте
может возникнуть ситуация когда форт-слова портят регистры используемые в последующем тексте на ассемблере.
В этом случае можно использовать команды PUSHAD - сохранение всех регистров в стеке возвратов(содержимое регистров при этом не меняется), а затем после исполнения фрагмента на форте восстановить их командой POPAD.

Например вывод числа с вершины стека без изменения стека будет выглядеть так.
Code:
: dup. PUSHAD . POPAD ;

STARTLOG

15 dup.

SEE dup.
лог
Code:
15

CODE dup.
5A5400 60               PUSHAD
5A5401 E88E0EFBFF       CALL    556294  ( . )
5A5406 61               POPAD
5A5407 C3               RET     NEAR
END-CODE
( 8 Bytes )

 Ok ( 15 )
Для удобства можно ввести алиасы для PUSHAD и POPAD, например !r и @r сответственно
Тогда то же самое
Code:
: dup. !rg . @rg ;

_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
Guest








PostPosted: Fri May 23, 2008 07:33    Post subject: [QUOTE]

Пожелание chessу

Оформить статью по видению проблематики предметной области и поместить ссылку на нее, например, в wikipedии/ассемблер
Back to top
Alexander





Joined: 06 Nov 2007
Posts: 156
Location: Екатеринбург

PostPosted: Fri May 23, 2008 09:49    Post subject: [QUOTE]

chess wrote:
Совместное использование ассемблера и форта при создании форт-определений...

Обычно люди пользуются словарными статьями (VOCABULARY) и переключают контекст с помощью нехитрых слов, определенных как IMMEDIATE, например, так:
Code:
: [+ASSEMBLER]  ASSEMBLER-WORDLIST +ORDER ; IMMEDIATE

Вообще в последнем посте CHESS'a идет речь об ассемблерных макросах в ЯП ФОРТ.
Back to top
View user's profile Send private message Send e-mail Visit poster's website Yahoo Messenger
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Fri May 23, 2008 15:22    Post subject: [QUOTE]

Alexander wrote:
Вообще в последнем посте CHESS'a идет речь об ассемблерных макросах в ЯП ФОРТ.

Вы заблуждаетесь. Речь идет о формировании поля кода форт-слов с помощью ранее определенных форт-слов и машинных команд совместно. Причем эти форт-слова и машинные команды используются на равных основаниях.
Компиляция машинных команд в поле кода определяемого слова происходит не по-фортовски путем компиляции
вызова форт-слова или инлайн-вставки кода этого слова, а путем формирования(генерации) кода машинных команд
в поле кода определяемого слова на основании имен машинных команд(иногда с использованием параметров со стека форт-системы), которых нет в словарях(ASSEMBLER-WORDLIST не нужен) в виде словарных статей. От переключения контекста я тут ушел, так удобнее.
Попробуйте сделать это на Swift и тогда поймете, что макросами тут и не пахнет.
_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Fri May 30, 2008 17:08    Post subject: [QUOTE]

Для упрощения синтаксиса ассемблера можно использовать, например,
прием замыкания выходного потока(код в кодофайле) на входной поток.

Простой пример использования этого приема:

Code:
REQUIRE IDN ~chess\assm\sp-assm.f

\ получаем значение литерала из его кода на вершине кодофайла
\ и кладем это значение на стек параметров,
\ а потом снимаем его оттуда и кладем на стек компиляции
I: !1  OP0 @ 4 - @ >CS ;

\ макрос немедленного исполнения делает !1, а затем корректно
\ полностью удаляет код использованного литерала с вершины кодофайла
MI" 1x  !1 DROP "MI

\ макрос дает еще один синтаксис использования команды Pa(LEA EBP, SM [EBP])
\  и теперь можно писать и так $ SM Pa и так SM P+
MI" P+  1x Pa "MI

\ EOF

: dup  -4 P+ @P=A ;
: drop  A=@P 4 P+ ;
: /string $ 4 @P+A -A A+@P 4 P+ ;

STARTLOG
SEE dup
SEE drop
SEE /string
лог
Code:
CODE dup
5A593B 8D6DFC           LEA     EBP , FC [EBP]
5A593E 894500           MOV     0 [EBP] , EAX
5A5941 C3               RET     NEAR
END-CODE
( 7 Bytes )

CODE drop
5A5953 8B4500           MOV     EAX , 0 [EBP]
5A5956 8D6D04           LEA     EBP , 4 [EBP]
5A5959 C3               RET     NEAR
END-CODE
( 7 Bytes )

CODE /string
5A596F 014504           ADD     4 [EBP] , EAX
5A5972 F7D8             NEG     EAX
5A5974 034500           ADD     EAX , 0 [EBP]
5A5977 8D6D04           LEA     EBP , 4 [EBP]
5A597A C3               RET     NEAR
END-CODE
( 12 Bytes )

 Ok

_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
Alexander





Joined: 06 Nov 2007
Posts: 156
Location: Екатеринбург

PostPosted: Sat May 31, 2008 14:55    Post subject: [QUOTE]

chess wrote:
Попробуйте сделать это на Swift и тогда поймете, что макросами тут и не пахнет

Очень интересно , что автор имеет ввиду? Вы часом не преследуете идею написать ФОРТ используя только определения ФОРТ?
Так может вспомнить, что ассемблер уже написан в определниях ФОРТ, которые заменют мнемонику на код команды.
вообщем мой мозг еще не проникся великой идеей... shuffle
Back to top
View user's profile Send private message Send e-mail Visit poster's website Yahoo Messenger
вопрос





Joined: 09 May 2006
Posts: 2285

PostPosted: Sat May 31, 2008 15:10    Post subject: [QUOTE]

Идея очень хорошая, но chess не желает сделать подробную инструкцию Very Happy .
_________________
понимаю некоторую бестолковость некоторых вопросов
Back to top
View user's profile Send private message
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Sat Jun 07, 2008 17:08    Post subject: [QUOTE]

Ввел автораспознавание наличия меток в определениях для исключения синтаксиса L: Word .... L; для
определений с метками вперед.
Теперь только стандартный синтаксис : Word .... ; это же относится и к определениям, в котором есть метки вперед и нет завершающего RET, теперь это пишется так : Word ... -;
Схема многопроходной компиляции начинает работать только в случае наличия меток в определениях,
без них идет обычная однопроходная компиляция.

Также ввел возможность писать макросы многострочно(не только для ассемблера) - подключением ~ac\lib\str5.f.
Библиотека str5.f немного кривит - в многострочных строках не любит комментариев до конца строки ( \ ....)

PS. Пример по циклам только для демонстрации, так как хотя код правильный, но делать так некорректно.
Выравнивания в циклах не делал.

Code:
REQUIRE IDN ~chess\assm\assm.f

\ пример определения с метками вперед и назад

STARTLOG

: S1
L1:
L2 JMP
L3 JMP
L2:
L1 JMP
L3: ;

SEE S1

\ Многострочные макросы(шаблоны)

\ цикл for-next
MI" for  ( n -- )
    $ -4 @X=A ( копируем начальное значение индекса цикла со стека параметров )
              ( и кладем его поверх адреса возврата на стек возврата )
    $ -4 Xa   ( устанавливаем указатель стека возвратов на ячейку с положенным индексом )
    A=@P 4 P+ ( убираем начальное значение индекса цикла со стека параметров )
    L1:       ( фиксируем адрес в теле кода создаваемого определения )
"MI
MI" next
    @X--      ( уменьшаем на единицу индекс цикла в стеке возвратов )
    L1 J0<>   ( делаем переход на ранее зафиксированный адрес в теле кода определения )
              ( если индекс не равен 0-лю, если индекс уже 0, то идем на следующую команду )
    $ 4 Xa    ( устанавливаем указатель стека возвратов на ячейку с адресом возврата )
"MI
MI" i  ( -- i )
    DUP A=@X  ( читаем текущий индекс цикла на вершине стека возвратов и кладем на стек параметров )
"MI

: cicl  for next ; SEE cicl

\ сумма кубов чисел
: sum-cubes.
0 SWAP for i DUP DUP * * + next CR . ; SEE sum-cubes.

1000 sum-cubes.

\ циклы begin-again(until)
MI" begin  L1: "MI
MI" again  L1 JMP "MI           : cicl1  begin   again ;  SEE cicl1
MI" until  A|A DROP L1 J0= "MI  : cicl2  begin 0 until ;  SEE cicl2

лог (SEE теперь считает кроме числа байтов еще количество инструкций в определении)
Code:
CODE S1 (7 bytes)
5A8FA7 EB02             JMP     5A8FAB  --|     <--|
5A8FA9 EB02             JMP     5A8FAD    | --|    |
5A8FAB EBFA             JMP     5A8FA7  <-|   | ---|
5A8FAD C3               RET     NEAR    <-----|
END-CODE (4 instructions)

CODE cicl (24 bytes)
5A9083 894424FC         MOV     FC [ESP] , EAX
5A9087 8D6424FC         LEA     ESP , FC [ESP]
5A908B 8B4500           MOV     EAX , 0 [EBP]
5A908E 8D6D04           LEA     EBP , 4 [EBP]
5A9091 FF0C24           DEC     [ESP]
5A9094 75FB             JNE     5A9091
5A9096 8D642404         LEA     ESP , 4 [ESP]
5A909A C3               RET     NEAR
END-CODE (8 instructions)

CODE sum-cubes. (67 bytes)
5A90B3 C745FC00000000   MOV     FC [EBP] , # 0
5A90BA 8D6DFC           LEA     EBP , FC [EBP]
5A90BD 894424FC         MOV     FC [ESP] , EAX
5A90C1 8D6424FC         LEA     ESP , FC [ESP]
5A90C5 8B4500           MOV     EAX , 0 [EBP]
5A90C8 8D6D04           LEA     EBP , 4 [EBP]
5A90CB 8945FC           MOV     FC [EBP] , EAX
5A90CE 8D6DFC           LEA     EBP , FC [EBP]
5A90D1 8B0424           MOV     EAX , [ESP]
5A90D4 8945FC           MOV     FC [EBP] , EAX
5A90D7 F7E8             IMUL    EAX
5A90D9 F76DFC           IMUL    FC [EBP]
5A90DC 034500           ADD     EAX , 0 [EBP]
5A90DF 8D6D04           LEA     EBP , 4 [EBP]
5A90E2 FF0C24           DEC     [ESP]
5A90E5 75E4             JNE     5A90CB
5A90E7 8D642404         LEA     ESP , 4 [ESP]
5A90EB E8C0CBFAFF       CALL    555CB0  ( CR )
5A90F0 E803D2FAFF       CALL    5562F8  ( . )
5A90F5 C3               RET     NEAR
END-CODE (20 instructions)

1392146832

CODE cicl1 (3 bytes)
5A9167 EBFE             JMP     5A9167
5A9169 C3               RET     NEAR
END-CODE (2 instructions)

CODE cicl2 (19 bytes)
5A91B7 8945FC           MOV     FC [EBP] , EAX
5A91BA 33C0             XOR     EAX , EAX
5A91BC 8D6DFC           LEA     EBP , FC [EBP]
5A91BF 0BC0             OR      EAX , EAX
5A91C1 8B4500           MOV     EAX , 0 [EBP]
5A91C4 8D6D04           LEA     EBP , 4 [EBP]
5A91C7 74EE             JE      5A91B7
5A91C9 C3               RET     NEAR
END-CODE (8 instructions)

 Ok

_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
вопрос





Joined: 09 May 2006
Posts: 2285

PostPosted: Sat Jun 07, 2008 18:10    Post subject: [QUOTE]

Quote:
Библиотека str5.f немного кривит - в многострочных строках не любит комментариев до конца строки ( \ ....)
То есть как это не любит? Надо поправить ... Sad
_________________
понимаю некоторую бестолковость некоторых вопросов
Back to top
View user's profile Send private message
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Wed Jun 11, 2008 16:53    Post subject: [QUOTE]

вопрос wrote:
То есть как это не любит? Надо поправить ...

Эта библиотека заточена именно на строки.
Организовывать на ее базе многострочные макросы не стал. Вернулся к однострочным.
Для макросов нужно делать по-другому - проще.
Измененый ассм по прежнему там же http://www.chess2007.nm.ru/~chess.zip
Скриптом SPF4A.spf можно встроить ассм в СПФ(поместив его в корень и запустив).
_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Tue Jun 17, 2008 15:51    Post subject: [QUOTE]

chess wrote:
Для макросов нужно делать по-другому - проще.

Попробовал сделать многострочные макросы.

Формируется строка в PAD, затем словом SLIT, помещается в словарную статью макроса,
которую заканчивает отложенный код слова EVALUATE.

Синтаксис создания макросов такой:

M: Name .....
.....
.....
;

Реализация:
Code:
: lex+ \ добавить очередную лексему в буфер
NextWord 2DUP >R >R NIP DUP 1 =
IF DROP R@ C@ [CHAR] ; =
   IF RDROP RDROP PAD 500 + HLD @ SLIT,
      POSTPONE EVALUATE POSTPONE ;  HLD 0! EXIT
   THEN
ELSE 0= IF REFILL DROP THEN THEN
R> PAD 500 + HLD @ + R@ CMOVE>  HLD @ R> + 1+ HLD !
;
: M: : IMMEDIATE
     PAD 500 + 500 0 FILL HLD 0!
     BEGIN lex+ HLD @ 0= UNTIL  ;

\ Примеры

M: S1 L1: *A L1 JMP ;

M: S2
L1: L2 JMP
L2: L1 JMP
;

: s1 S1 ;
: s2 S2 ;

STARTLOG
SEE S1 SEE s1
SEE S2 SEE s2

лог
Code:
CODE S1 (27 bytes)
5A7F97 E8C0A1FAFF       CALL    55215C  ( _SLITERAL-CODE )
5A7F9C   0E 4C 31 3A  00 2A 41 00  4C 31 00 4A  4D 50 00 00 .L1:.*A.L1.JMP..
5A7FAC E8DFFBFBFF       CALL    567B90  ( EVALUATE )
5A7FB1 C3               RET     NEAR
END-CODE                (3 instructions)

CODE s1 (5 bytes)
5A7FFB F7E8             IMUL    EAX
5A7FFD EBFC             JMP     5A7FFB
5A7FFF C3               RET     NEAR
END-CODE                (3 instructions)

CODE S2 (38 bytes)
5A7FC3 E894A1FAFF       CALL    55215C  ( _SLITERAL-CODE )
5A7FC8   19 00 4C 31  3A 00 4C 32  00 4A 4D 50  00 00 4C 32 ..L1:.L2.JMP..L2
5A7FD8   3A 00 4C 31  00 4A 4D 50  00 00 00 E8  A8 FB FB FF :.L1.JMP...иЁыыя
5A7FE3 E8A8FBFBFF       CALL    567B90  ( EVALUATE )
5A7FE8 C3               RET     NEAR
END-CODE                (3 instructions)

CODE s2 (5 bytes)
5A800F EB00             JMP     5A8011
5A8011 EBFC             JMP     5A800F
5A8013 C3               RET     NEAR
END-CODE                (3 instructions)

PS.
По хорошему-то еще надо бы сделать пропуск возможных комментариев.
А вообще, по-моему, громоздко получилось.
Может в конкурс задач выложить?
_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
mOleg
Moderator




Joined: 03 May 2006
Posts: 3517
Location: Крым

PostPosted: Tue Jun 17, 2008 20:11    Post subject: [QUOTE]

chess wrote:
А вообще, по-моему, громоздко получилось.
Может в конкурс задач выложить?

можете, но, я думаю, для конкурса тяжеловато может оказаться.
_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur
Back to top
View user's profile Send private message Send e-mail Visit poster's website
forther





Joined: 13 May 2006
Posts: 173

PostPosted: Tue Jun 17, 2008 23:27    Post subject: [QUOTE]

mOleg wrote:
chess wrote:
А вообще, по-моему, громоздко получилось.
Может в конкурс задач выложить?

можете, но, я думаю, для конкурса тяжеловато может оказаться.


Я не согласен. Очень хорошая задача для конкурса. И полезная. Я не думаю, что можно сделать лучше того решения, которое я уже видел, но будет приятно ошибиться.
Back to top
View user's profile Send private message
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Wed Jun 18, 2008 11:30    Post subject: [QUOTE]

chess wrote:
По хорошему-то еще надо бы сделать пропуск возможных комментариев.

Для простоты, да и для практики считаю достаточным, ввел возможность делать комментарии типа \ ....
Реализация:
Code:
: lex+ \ добавить очередную лексему в буфер
NextWord 2DUP >R >R NIP DUP 1 =
IF DROP R@ C@ [CHAR] ; =
   IF RDROP RDROP PAD 500 + HLD @ SLIT,
      POSTPONE EVALUATE POSTPONE ;  HLD 0! EXIT
   ELSE R@ C@ [CHAR] \ =
        IF R@ 13 PARSE DROP R@ - 0 FILL THEN THEN \ тут не помню что впереди 10 или 13
ELSE 0= IF REFILL DROP THEN THEN
R> PAD 500 + HLD @ + R@ CMOVE>  HLD @ R> + 1+ HLD !
;
: M: : IMMEDIATE
     PAD 500 + 500 0 FILL HLD 0!
     BEGIN lex+ HLD @ 0= UNTIL  ;

\ Пример

M: S1 \ комментарии
L1: L2 JMP  \ комментарии
            \ комментарии
L2: L1 JMP  \ комментарии
;
: s1 S1 ;

STARTLOG

SEE S1 SEE s1

лог

Code:
CODE S1 (47 bytes)
5A7FD7 E880A1FAFF       CALL    55215C  ( _SLITERAL-CODE )
5A7FDC   22 00 00 00  4C 31 3A 00  4C 32 00 4A  4D 50 00 00 "...L1:.L2.JMP..
5A7FEC   00 00 00 00  00 4C 32 3A  00 4C 31 00  4A 4D 50 00 .....L2:.L1.JMP.
5A7FFC   00 00 00 00  E8 8B FB FB  FF C3 17 80  5A 00 00 02 ....и‹ыыяГ.ЂZ...
5A8000 E88BFBFBFF       CALL    567B90  ( EVALUATE )
5A8005 C3               RET     NEAR
END-CODE                (3 instructions)

CODE s1 (5 bytes)
5A8017 EB00             JMP     5A8019
5A8019 EBFC             JMP     5A8017
5A801B C3               RET     NEAR
END-CODE                (3 instructions)

 Ok

forther wrote:
Я не согласен. Очень хорошая задача для конкурса. И полезная.

Полезная, но по-моему неинтересная.
_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
chess





Joined: 20 Jul 2006
Posts: 1121
Location: Екб

PostPosted: Fri Jun 20, 2008 14:03    Post subject: [QUOTE]

Однострочные макросы в исходниках заменил на многострочные.
Устранил краевой эффект в схеме многопроходной компиляции -
иногда из-за этого были глюки c комментариями.

Добавил группу команд циклических сдвигов ROL, ROR.
Могут быть полезны для быстрых манипуляций байтами в числах.
Все залил на http://www.chess2007.nm.ru/~chess.zip

примеры - перестановки байтов в ячейке

Code:
STARTLOG
: swapb ( n[4321] -- n[4312] )
$ 8 #wAo<< ;   SEE swapb

0x44332211 swapb  HEX CR U. DECIMAL

: 2swapb ( n[4321] -- n[2143] )
$ 10 #Ao<< ;   SEE 2swapb

0x44332211 2swapb HEX CR U. DECIMAL

: rotb ( n[4321] -- n[4123] )
$ 8 #wAo<< A0123 $ 8 #Ao>> ; SEE rotb

0x44332211 rotb   HEX CR U. DECIMAL
\ и т.д.

лог
Code:
CODE swapb (5 bytes)
5ABD07 66               D16:
5ABD08 C1C008           ROL     AX , 8
5ABD0B C3               RET     NEAR
END-CODE                (3 instructions)

44331122

CODE 2swapb (4 bytes)
5ABD1F C1C010           ROL     EAX , 10
5ABD22 C3               RET     NEAR
END-CODE                (2 instructions)

22114433

CODE rotb (10 bytes)
5ABD37 66               D16:
5ABD38 C1C008           ROL     AX , 8
5ABD3B 0FC8             BSWAP   EAX
5ABD3D C1C808           ROR     EAX , 8
5ABD40 C3               RET     NEAR
END-CODE                (5 instructions)

44221133
 Ok

_________________
С уважением, chess
Back to top
View user's profile Send private message Send e-mail
ВНИМАНИЕ: Вы не зарегистрированы на форуме или не залогинились!
Username
Message body

Emoticons
Very Happy Smile Sad Surprised
Looool rupor shuffle weep
dizzy_mad Shocked Confused Cool
Laughing Mad Razz Embarassed
Crying or Very sad Evil or Very Mad Twisted Evil Rolling Eyes
View more Emoticons
 

 
Display posts from previous:   
Post new topic   Reply to topic    Forth Forum Index -> Программирование (Programming) All times are GMT + 3 Hours
Goto page Previous  1, 2, 3 ... 13, 14, 15
Page 15 of 15

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
Яндекс цитирования


Powered by phpBB © 2001−2005 phpBB Group

хост winglion.ru