Assembler in Forth

0 views
Skip to first unread message

Duke

unread,
Mar 19, 2008, 9:13:12 PM3/19/08
to Forth On TOP @ AMCP
Товарисчи и сочувствующие, хелм.
У меня не получается написать пострейшее ассемблерное определение;
Например так определённое слово
CODE MyDup
push ebx
END-CODE
не работает, как ожидаетса, а
see MyDup
Вообще творит страшную штуку: пытается распечатать какое-то
бесконечное определение после текста слова (останавливается ескейпом).
Какого-то результата всё же добиться удалось:
CODE plus
pop eax
add ebx, eax
push ebx
c;
или
CODE plus
pop eax
add ebx, eax
push ebx
END-CODE
Вызывают внутреннюю ошибку и Win32Forth умирает с предупреждением.
Пробовал подключать словарь ASSEMBLER. Эффект нулевой.
Что делать? Как написать простейшее слово на ассемблере и так, чтобы
оно работало?

Michael Gasanenko

unread,
Mar 20, 2008, 7:08:52 AM3/20/08
to Forth On TOP @ AMCP


On 20 мар, 04:13, Duke <Sergey.Karakovs...@gmail.com> wrote:
> Товарисчи и сочувствующие, хелм.
> У меня не получается написать пострейшее ассемблерное определение;
> Например так определённое слово
> CODE MyDup
> push ebx
> END-CODE

CODE MyDup
push ebx
next \ передача управления следующему в шитом коде слову
END-CODE

Sergey Karakovskiy

unread,
Mar 20, 2008, 7:18:20 AM3/20/08
to Michael Gasanenko, Forth On TOP @ AMCP
Hello Michael,

А почему тогда see этого не показывает? Или он, как раз бежит до
"next", а не UNNEST.
Кстати, я сейчас ещё запостю вопрос об UNNEST -- я написал слово,
компилируя которое можно получить UNNSET в середине определения.

--
Best regards,
Sergey mailto:sergey.ka...@gmail.com

Michael Gasanenko

unread,
Mar 20, 2008, 7:44:54 AM3/20/08
to Forth On TOP @ AMCP
On 20 мар, 04:13, Duke <Sergey.Karakovs...@gmail.com> wrote:
> Пробовал подключать словарь ASSEMBLER. Эффект нулевой.

ASSEMBLER -- список слов, где находятся видимые внутри code-
определения команды ассемблера. Он подключается словом code и
отключается словом end-code.

order
Context: FORTH FORTH ROOT
Current: FORTH ok

code no-op ok

order
Context: ASSEMBLER FORTH FORTH ROOT
Current: FORTH ok

next ok

order
Context: ASSEMBLER FORTH FORTH ROOT
Current: FORTH ok

end-code ok

order
Context: FORTH FORTH ROOT
Current: FORTH ok

Michael Gasanenko

unread,
Mar 20, 2008, 7:57:14 AM3/20/08
to Forth On TOP @ AMCP
code first push ebx end-code ok
code second pop ebx next end-code ok
see first
FIRST IS CODE
( $404048 53 ) push ebx
( $404049 90 ) nop
( $40404A 90 ) nop
( $40404B 90 ) nop
( $40404C 50 ) push eax
( $40404D 40 ) inc eax
( $40404E 40 ) inc eax
( $40404F 005B8B ) add $8B ( $400000+$FFC00087 ) [ebx]
bl
( $404052 06 ) push es
( $404053 83C604 ) add esi, # $4
( $404056 FF20 ) jmp [eax]
ok
see second
SECOND IS CODE
( $404050 5B ) pop ebx

Нетрудно видеть, что за кодом first следует мусор, за которым следует
код second.

На самом деле это не мусор, а поле кода слова second (значение
00404050h, адрес команды pop ebx).

hex ' first . ' second . 404044 40404C ok
' first 10 dump
404044 | 48 40 40 00 53 90 90 90 50 40 40 00 5B 8B 06 83 |H@@.S悙怭@@.
[?億 ok
Reply all
Reply to author
Forward
Message has been deleted
0 new messages