Forth http://fforum.winglion.ru/ |
|
Моя система(_KROL) http://fforum.winglion.ru/viewtopic.php?f=2&t=3127 |
Страница 2 из 36 |
Автор: | Ethereal [ Вт июн 06, 2017 14:24 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: : FORGET COMPILE' FIND IF DUP FENCE < IF !!FENCE THEN DUP HERE! NFA>LFA @ LAST! 2DROP EXIT THEN !!WORD ; Для < все адреса 8000..FFFF отрицательные. Так-что сравнение адреса с забором надо делать по U< |
Автор: | Ethereal [ Вт июн 06, 2017 14:30 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: AWORD DIVIDE,"/%" Ошибка.pop bx,ax clr dx idiv bx push ax,dx AEND AWORD DIVIDE,"/%" pop bx,ax cwd idiv bx push ax,dx AEND |
Автор: | Ethereal [ Вт июн 06, 2017 14:35 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: AWORD DDIVIDE,"D/%" Аналогично ошибка. И да, 80386 and higher;; pop ax,dx,cx,bx ;; ; BX:CX /% DX:AX ; So far is for 80286 and higher pop ebx,eax clr edx idiv ebx push eax,edx AEND AWORD DDIVIDE,"D/%" ;; pop ax,dx,cx,bx ;; ; BX:CX /% DX:AX ; So far is for 80286 and higher pop ebx,eax cdq idiv ebx push eax,edx AEND |
Автор: | Ethereal [ Вт июн 06, 2017 15:17 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: AWORD WITHIN,"WITHIN" ; ( n b1 b2 -- flag ) Даже лень разбирать тут твою логику. Сразу вижу, что тут применены знаковые сравнения, а значит с ходу ясно, что работать будет не всегда верно. Вот пример на котором споткнется :; c b a pop ax,bx,cx clr dx cmp bx,ax jg @f ; b1 < b2 cmp cx,bx jl .no cmp ax,cx jl .no jmp .yes @@: ; b1 > b2 cmp cx,ax jl .no cmp bx,cx jl .no .yes: dec dx .no: push dx AEND >HEX OK 8000 7000 9000 WITHIN . > 0 OK Неверно ! Дело в том, что WITHIN это очень красивая штука в Форте. Она должна считать единым образом, не зная имеет дело со знаковыми числами или с беззнаковыми. Главное чтобы все три числа были одного сорта. И если я использую беззнаковые, то $7000 <= $8000 < $9000 и WITHIN должна вернуть "ИСТИНУ", поскольку $8000 внутри диапазона от меньшего $7000 до большего $9000. А если диапазон взять от большего до меньшего, то "ИСТИНА" возвращается наоборот - если проверяемое число вне даипазона. И если я буду использовать знаковые числа, то именно так и выйдет. Будет иметь место такое соответствие шестнадцатеричного значения слова тому числу, которое оно кодирует : $7000 = 28672 $8000 = -32768 $9000 = -28672 и теперь диапазон $7000..$9000 станет уже диапазоном от большего 28672 до меньшего -28672. А поскольку проверяемое -32768 лежит вне этого диапазона, то опять должна возвращаться "ИСТИНА". Т.е. тут должна возвращаться "ИСТИНА" в любом случае, оперирует программист знаковыми или беззнаковыми. Знаковое или беззнаковое - это мысли программиста, WITHIN их читать не умеет. Покажу, как я записал это слово на ассемблере : Код: ; WITHIN CORE EXT ; ( n1|u1 n2|u2 n3|u3 -- flag ) ; Выполнить сравнение тестируемого значения n1|u1 с нижним пределом ; n2|u2 и верхним пределом n3|u3, возвратить "истину", если ; (n2|u2<n3|u3 и (n2|u2<=n1|u1 и n1|u1<n3|u3)) ; или (n2|u2>n3|u3 и (n2|u2<=n1|u1 или n1|u1<n3|u3)) "истина", ; иначе вернуть "ложь". ; Неопределенная ситуация возникает, если n1|u1, n2|u2 и n3|u3 ; не одного и того же типа. $CODE 6, 'WITHIN', WITHIN POP CX POP BX POP AX SUB CX, BX SUB AX, BX CMP AX, CX SBB AX, AX PUSH AX $NEXT Фишка тут в том, что в традиционных языках программирования типа Си и Паскаля, когда описывается переменная, сразу указывается знакового или беззнакового она типа. А Форт - язык с другой идеологией, в нем всего два типа - ячейка CELL (все равно знаковая или беззнаковая) и беззнаковый символ CHAR. В идеологии Форта, если знаковые и беззнаковые нельзя обрабатывать единым образом (WITHIN , к примеру, обрабатывает их как раз единым образом), то типизируются не переменные (операнды), а операторы. К примеру < и U< а также / и U/ |
Автор: | Ethereal [ Вт июн 06, 2017 15:38 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Код: _ : ABS 7FFF AND ; Упс ...FWORD ABS,"ABS" dw LIT,$7FFF,_AND FEND По такой логике ABS от -1 будет равен 32767. Видно, что есть места где ты еще плаваешь. Знаковые, беззнаковые, представление знаковых. Чтобы не было лишних ветвлений я ABS сделал вот так : Код: ; ABS CORE ; ( n -- u ) ; u - абсолютная величина n. $CODE 3, 'ABS', ABS_ POP AX CWD XOR AX, DX SUB AX, DX PUSH AX $NEXT Логика здесь такая. Если в AX не отрицательное, то CWD занулит DX. Ксорка на ноль и вычитание нуля не изменят в числе AX ничего. Если в AX отрицательное, то CWD запишет в DX число FFFF = -1 . Ксорка на FFFF инвертирует AX. А вычитание из AX минус единицы есть инкремент AX. А как известно справедливо такое равенство -X = ~X + 1 чтобы изменить знак у числа надо его инвертировать и прибавить единицу. |
Автор: | Ethereal [ Вт июн 06, 2017 16:14 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: _ : LITERAL COMPILE LIT , ; FWORDI LITERAL,"LITERAL" dw COMPILE,LIT,COMMA FEND Слово LITERAL должно быть немедленного исполнения. И должно быть для режима компиляции. И в режиме компиляции немедленно исполниться, снимать со стека число и компилировать такой код, который исполняясь после будет класть это число на стек. А в режиме интерпретации LITERAL должно ничего не делать. Ты не сделал LITERAL немедленного исполнения и не сделал его STATE-зависимым и в итоге используешь его в каком-то своем смысле : Цитата: : ," [ CHAR " LITERAL ] WORD DUP HERE SWAP ALLOT SWAP CMOVE 0 C, ; : ( [ CHAR ) LITERAL ] WORD 2DROP ; IMMEDIATE : .( [ CHAR ) LITERAL ] WORD TYPE ; IMMEDIATE А так на Форте не пишет никто. Для любого фортера [ CHAR ) LITERAL ] и [ CHAR ) ] будет означать абсолютно одно и то-же. Смысл LITERAL вот в чем. Чтобы было можно вместо чисел писать выражения, вычисляемые при компиляции программы, а не после во время ее исполнения. Если вместо : ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ 1985 . ; написать так : ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ 1967 18 + . ; то это сложение будет выполняться каждый раз при исполнении программы. А это плохо. Лучше вычислить его один раз при создании программы. : ГОД-КОГДА-Я-ПОШЕЛ-В-АРМИЮ [ 1967 18 + ] LITERAL . ; По идее должно быть вот так : : LITERAL STATE @ IF COMPILE LIT , THEN ; IMMEDIATE : ( [ CHAR ) ] LITERAL WORD 2DROP ; IMMEDIATE З.Ы. Ладно, я завязываю твой исходник разглядывать. А то понаписал тут. |
Автор: | _KROL [ Вт июн 06, 2017 19:30 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Спасибо, у меня действительно ошибок пока предостаточно... (много чего пересматривал(в том числе SP-FORTH), но пока экзамены и ЦТ, руки не доходят) --- Напоминаю! macro clr [arg] { forward sub arg,arg } и macro FWORDI name,wname { FWORD name,wname __IMMEDIATE } --- AWORD KEY?,"KEY?" clr al inc al int 0x16 xor ax,ax ; Да, здесь должно быть "clr ax" jz @f ; Зачем "mov ax,0" когда есть "sub ax,ax"? dec ax @@: push ax AEND AWORD DIVIDE,"/%" pop bx,ax clr dx ; "sub dx,dx", флаги вроде не выставляются idiv bx push ax,dx AEND Ошибка. Почему? ... За WITHIN СПАСИБО!!! А вот тут _ : LITERAL COMPILE LIT , ; FWORDI LITERAL,"LITERAL" dw COMPILE,LIT,COMMA FEND я в комментарии забыл приписать IMMDEIATE (ведь FWORDI!) Так что оно у меня просто находится внутри скобок(сам попробуй вынести). |
Автор: | Ethereal [ Ср июн 07, 2017 06:41 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
_KROL писал(а): Напоминаю! Напоминаю! XOR выставляет флаг Z по результату, так-что XOR AX,AX выставит флаг Z всегда SUB выставляет флаг Z по результату, так-что SUB AX,AX выставит флаг Z всегда MOV AX,0 и MOV AX,-1 флага Z не изменят, поскольку команды пересылок флагов не меняют |
Автор: | Ethereal [ Ср июн 07, 2017 06:44 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
_KROL писал(а): Так что оно у меня просто находится внутри скобок(сам попробуй вынести). Так внутри скобок оно не должно ничего делать Почитаем Баранова и Ноздрунова : В процессе работы текстового интерпретатора программист может переключать его из состояния компиляции в состояние исполнения и обратно с помощью слов [ (открывающая квадратная скобка) --> и ] (закрывающая квадратная скобка) -->. Слово [ имеет признак немедленного исполнения и переключает интерпретатор в состояние исполнения, а слово ] переключает его в состояние компиляции. Обычно эти слова используются внутри определения через двоеточие, чтобы вызвать исполнение слова или группы слов, не имеющих признака немедленного исполнения. Например, если в тексте определения понадобилась константа FF00 (в шестнадцатиричной системе), а текущей используемой системой является десятичная, то было бы неправильно включить в текст определения фрагмент HEX FF00 DECIMAL, поскольку слово HEX будет не выполнено, а скомпилировано и число не будет воспринято правильно. Вместо этого следует писать: [ HEX ] FF00 [ DECIMAL ] . В языке есть и другие способы, чтобы выразить это же более точно и красиво. Еще один пример дает использование слова LITERAL (литерал), имеющего признак немедленного исполнения, внутри определения через двоеточие. Оно используется в виде: [ <значение> ] LITERAL, где <значение> - слова, вычисляющие на вершине стека значение, которое словом LITERAL будет скомпилировано в код как число. Во время исполнения определения это значение будет положено на стек. Таким образом, текст [ 2 2 * ] LITERAL внутри определения через двоеточие эквивалентен употреблению слова-числа 4. Это дает большие возможности для использования констант, "вычисляемых" во время компиляции определения. Аналогичное соответствие имеет место и вне определения через двоеточие, поскольку в состоянии исполнения слово LITERAL не выполняет никаких действий, и поэтому на стеке остается вычисленное перед этим значение. |
Автор: | Ethereal [ Ср июн 07, 2017 07:05 ] | ||
Заголовок сообщения: | Re: Моя система(_KROL) | ||
А вообще, закину сюда мою старую модель 16-разрядного Форта в исходниках. С прямым шитым кодом. Можешь подглядывать туда и драть любые идеи, какие заблагорассудится. Заодно и для понимания полезно. Я ведь двигался точно также - читал Баранова и Ноздрунова и мучал SP-Forth 2.x . Подглядывал и уяснял оттуда и оттуда. Уточню, что это именно модель. Я не ставил целью написать полновесную Форт-систему для MS-DOS. Поэтому у меня там, к примеру, слов для работы с файлами нет. Для работы с портами ввода-вывода нет. Нет для работы с BIOS. Нет того, что в Форте для MS-DOS как бы обязательно. Потому-что мне нужен был не компилятор писать программы под MS-DOS, а МОДЕЛЬ ФОРТА для портирования. Отладить на ней алгоритмы Форта, ведь под MS-DOS легко отлаживать. И после перенести ее на один микроконтроллер. А на микроконтроллере отлаживать трудно. Но когда алгоритмы отлажены переносить уже легко. Смотришь на MS-DOS-оский исходник и один в один то же пишешь для микроконтроллера. Причем на том микроконтроллере я собирался хранить словарь отдельно, чтобы после написания приложения его просто тереть нулями. Поэтому тут и отработана модель со словарем отдельно от кода. Словарь тут в хвосте COM-файла. Еще я тут отрабатывал модель, чтобы на ассемблере писать только минимальное самораскручивающееся ядро, а остальную часть Форт-системы для ее досборки скармливать ядру в виде исходника на Форте. Тут так и сделано. Файл forth.bat - это пакетный файл для компиляции Форта. В нем видно как идет скармливание и досборка. Ну и последнее - я тогда еще не разобрался с этими ONLY ALSO из ANSI-Форта и словари сделал так, как понял у Баранова и Ноздрунова. Получилось не так чтобы лучшим образом и не в соответствии с каким-либо стандартом. Зато в соответствии с Барановым-Ноздруновым. А как красиво я после подсмотрел в FIG-Forth-е. Вот там действительно красота.
|
Автор: | _KROL [ Ср июн 07, 2017 18:09 ] | ||
Заголовок сообщения: | Re: Моя система(_KROL) | ||
OK. Будет тебе нормальный LITERAL. P.s. Спасибо, мне так ещё так никто не помогал!
|
Автор: | _KROL [ Ср июн 07, 2017 22:27 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Достало меня одно слово: семантика - значение(поведения, как я понимаю). Обьясни(те) пожалуйста мне, чем отличается семантика выполнения от интерпретации(а то мне кажется, что я неправильно это понимаю...). |
Автор: | _KROL [ Ср июн 07, 2017 22:48 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Цитата: Причем на том микроконтроллере я собирался хранить словарь отдельно, чтобы после написания приложения его просто тереть нулями. Поэтому тут и отработана модель со словарем отдельно от кода. Словарь тут в хвосте COM-файла. Теперь понятно, почему Winglion так в своём Форте для Sprinter поступал... Это навело меня на мысль! В последнее время я подумаваю после доработки системы переделать её в целевой компилятор(наверное исходники SP-FORTH перечитал ). 1) Сделать поля такими NFA ... флаги(Icx.....) LFA ... CFA dw ptr где c - compilied only (я понял эту мысль и она мне понравилась) x - exist (т.е. слово существует) 2) Основной цикл 1.Считать слово... 2.Если интерпретация - исполнить Если компиляция, в зависимости от переменной (допустим)DESTVOC, компилировать в нужный сегмент(системы или пользовательской системы ) (!)Даже если слово не найдено в пользовательском словаре, то создаётся запись, но без флага x. Соответственно, если раньше запись такая была(без флага), то x выставляется и "CFA:=ptr;" ... В конце(при сохранении системы) проверяются все слова на флаг x. Ну как вам идея? |
Автор: | Victor__v [ Ср июн 07, 2017 23:25 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Слово для проверки на компилируемость в СПФ : comp? state @ 0= if -312 throw then ; В Форке от mOleg существует флаг с таким же действием |
Автор: | Ethereal [ Чт июн 08, 2017 09:22 ] |
Заголовок сообщения: | Re: Моя система(_KROL) |
Victor__v писал(а): Слово для проверки на компилируемость в СПФ Ну так существуют два разных подхода к этому вопросу. Вообще куда ни плюнь подходов в Форте почему-то получается именно два. Я еще тут напишу о других таких случаях после.: comp? state @ 0= if -312 throw then ; В Форке от mOleg существует флаг с таким же действием 1.) Определение через двоеточие любого слова, что только для режима компиляции, начинать с COMP? . COMP? проверит режим и выполнит ABORT , если режим не тот. 2.) У каждого такого слова иметь соответствующий флажок в заголовке и проверять его при интерпретации этого слова внутри INTERPRET Второй подход мне нравится больше, поскольку легко сделать COMPILEONLY также слова, определенные а нативном коде. Например >R обязательно таким сделать, чтобы Форт-система меньше валилась, когда в исходнике что-то напутано. К тому-же традиционно в Форт-системах длина имен ограничена 31-м символом. А значит в том байте, что в словарной статье хранит длину имени есть 3 бесхозных бита. Один уйдет на флаг IMMEDIATE. А из двух остальных один можно сделать COMPILEONLY Это я для KROL-а поясняю |
Страница 2 из 36 | Часовой пояс: UTC + 3 часа [ Летнее время ] |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |