Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 23, 2024 10:12

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Ассемблер в SPF
СообщениеДобавлено: Чт фев 08, 2007 09:32 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Я думаю эта тема будет полезна для начинающих в разборе слов forth. Я постараюсь проанализировать код, если вдруг ошибусь, то пожалуйста подправте меня, все таки синтаксис асма forth немного отличается от стандартного асма.

Слово: ! - записывает число по адресу. ( n addr -> )
в EAX - адрес куда запишем число т.к. он на вершине стека
MOV EDX , 0 [EBP] - взять число в edx из стека данных
MOV [EAX] , EDX - записать число по адресу
MOV EAX , 4 [EBP] - записать на вершину стека число со смещением 4
LEA EBP , 8 [EBP] - сдвинуть стек данных на 8 т.к. нам нужно выкинуть число которое мы записывали в стек и число которое мы перенесли на вершину стека (EAX)
RET NEAR - возврат из слова (во flat всегда NEAR)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 09:45 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Наткнулся на слово W! увидел D16: Что бы это значило?

8B5500 MOV EDX , 0 [EBP]
66 D16:
8910 MOV [EAX] , DX
8B4504 MOV EAX , 4 [EBP]
8D6D08 LEA EBP , 8 [EBP]
C3 RET NEAR

Посмотрел в отладчике оказалось это:
668910 mov [eax],dx
хм, получается дизассемблер forth показывает так команду работы со словом.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 09:59 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Разбирал слово 2@, очень удивился что дизассемблер показывает FC, а не -4 (было бы удобней -4).

MOV EDX , 4 [EAX]
LEA EBP , FC [EBP] <-
MOV 0 [EBP] , EDX
MOV EAX , [EAX]
RET NEAR


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 10:21 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Команды понятны, но вот что значит ( :-SET+5 ) и ( J-SET+5 ) я тк и не понял, кто знает поясните плиз.

HERE

CALL 547254 ( DP )
MOV EAX , [EAX]
MOV 54742D ( :-SET+5 ) , EAX (MOV [54742D],EAX)
MOV 54744D ( J-SET+5 ) , EAX (MOV [54744D],EAX)
RET NEAR


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 12:22 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Pretorian писал(а):
Команды понятны, но вот что значит ( :-SET+5 ) и ( J-SET+5 ) я тк и не понял, кто знает поясните плиз.


Смотри src\compiler\spf_compile.f
Код:
: HERE ( -- addr ) \ 94
\ addr - указатель пространства данных.
  DP @
  DUP TO :-SET
  DUP TO J-SET
;


Это занесение значений в поле параметров словарным статьям и
именами :-SET и J-SET.
Где 5 это размер поля кода.
Слово >BODY, преобразующий CFA в PFA, просто прибавляет 5.

0 TO :-SET
равносильно
0 ' :-SET >BODY !

В :-SET и J-SET устанавливается ограничение оптимизатору.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 12:32 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Кстати, объясните непонятливому, почему используется LEA EBP , 8 [EBP], а не например, ADD EBP,8


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 12:44 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
oco писал(а):
Кстати, объясните непонятливому, почему используется LEA EBP , 8 [EBP], а не например, ADD EBP,8


На некоторых процессорах, быстрее работает (лучше парится).
LEA не портит флаги.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 13:10 
Не в сети

Зарегистрирован: Ср май 10, 2006 13:51
Сообщения: 202
Благодарил (а): 3 раз.
Поблагодарили: 4 раз.
Да, конечно, LEA - странная команда...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 14:14 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Pretorian писал(а):
Наткнулся на слово W! увидел D16: Что бы это значило?


Префикс для шестнадцатеричной работы, если я правильно понял...

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 16:03 
Слегка опоздал, ну ладно...

Цитата:
Я думаю эта тема будет полезна для начинающих в разборе слов forth.

Разбирать все слова SPF переводя их из "непривычной" фортовской записи в более "удобную" и более "привычную" ассемблерную (!) -- это не лучший способ осваивать язык, думаю. Да и "начинающие" тоже интересные. Маш. код читают-понимают, Форт -- нет.

Цитата:
Наткнулся на слово W! увидел D16: Что бы это значило?

Насколько я помню, такие вещи называются префиксами кажется. Определённое байтовое значение перед собственно маш. командой даёт понять процессору что на время этой команды все операции становятся 16-ричными. То есть не EAX, a AX, и так далее... А "толстые" ассемблеры насколько знаю "прячут" эту механику.

Цитата:
Команды понятны, но вот что значит ( :-SET+5 ) и ( J-SET+5 ) я тк и не понял...

А мне не понятны.. Как-то не нарастил я в себе дизассемблер...

Во-первых, само слово в натуральном своём виде выглядит так:

Код:
: HERE ( -- addr ) \ 94
\ addr - указатель пространства данных.
  DP @
  DUP TO :-SET
  DUP TO J-SET
;


То есть :-SET и J-SET являются VALUE-переменными. Код:

Код:
0 TO VAR


Компилируется как:

Код:
MOV [123456], # 0 \ 123456=адрес VAR


А так как 123456 ничего никому не скажет, то дизассемблер угадывает что это оказывается адрес ячейки от переменной VAR и вежливо подсказывает тебе об этом в комментариях (скобки).

В-вторых, эти вещи нужны только для оптимизатора и мимо-проходящих людей они совершенно не должны колыхать.

В-третьих, я вроде бы знаю что переменная :-SET нужна для обозначения границы между маш. кодами для оптимизационных целей.

Добрый совет: абсолютно всё учить (даже знать о существовании) совершенно необязательно. Только то что понадобится по ходу дела.

Ещё один добрый совет: ИСПОЛЬЗУЙ [СОDE][/СОDE] !!


Последний раз редактировалось profiT Чт фев 08, 2007 17:06, всего редактировалось 1 раз.

Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 16:04 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Pretorian писал(а):
66 D16:

66- код префикса смены размера данных, подробнее в описании прификсов.

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт фев 08, 2007 16:05 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
Pretorian писал(а):
Наткнулся на слово W! увидел D16: Что бы это значило?

Посмотрел в отладчике оказалось это:
668910 mov [eax],dx
хм, получается дизассемблер forth показывает так команду работы со словом.

Это я вобще то сразу же сказал когда задал вопрос сам себе.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 26, 2007 15:55 
Не в сети

Зарегистрирован: Ср сен 13, 2006 10:06
Сообщения: 636
Откуда: Омск
Благодарил (а): 0 раз.
Поблагодарили: 3 раз.
LEA EAX, [EDI] [EAX] что бы это значило?
EDI указатель данных потока в спф, eax вершина стека

_________________
Меня нет, не будет и не было.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн фев 26, 2007 16:09 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
Pretorian писал(а):
LEA EAX, [EDI] [EAX] что бы это значило?
EDI указатель данных потока в спф, eax вершина стека


LEA EAX, [EDI] [EAX] в обычном ассемблере: LEA EAX, [EDI+EAX]
можно использовать команду ADD EAX, EDI

В EAX запишется адрес USER переменной, если EAX содержал смещение этой
переменной относительно указателя потока(EDI).


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср фев 28, 2007 16:56 
Не в сети

Зарегистрирован: Пт дек 29, 2006 15:32
Сообщения: 27
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Код:
CODE MAX ( n1 n2 -- n3 )
     CMP EAX, [EBP]
     JL  # ' DROP
     LEA EBP, 4 [EBP]
     RET
END-CODE

# ' DROP по-видимому формирует адрес перехода на машкод DROP, не понятно как.
Что здесь делает # - форматное преобразование?
Или в контексте CODE- блока это другой # ?
В CODE-блоке позволительны вызовы высокоуровневых слов ?
Сначала исполняются они после ассемблерного оператора а потом он работает с результатом?
Или # в CODE-блоке это метка начала высоуровневой вставки, типа CODE- наоборот?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

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


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

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