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

...
Google Search
Forth-FAQ Spy Grafic

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




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 15:59 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Да-да, именно сложить два числа.
Условие:

1. на стеке лежат адреса двух многоразрядных чисел (беззнаковые целые с количеством разрядов 16*N, N задано изначально)
Достаточно получить решение для N=4,8,16 и не обязательно для всех остальных.
2. Надо эти два числа сложить имея 16 разрядный процессор с минимальным набором Форт-команд:
DUP DROP, SWAP, >R, R>, - стандартные
BSWAP - обмен байтов в слове на вершине стека
ADD, SUB, AND, OR, XOR, - стандартные
@, !, - стандартные
LIT, - 16-битный литерал
CALL, - вызов подпрограммы
RET, - возврат из подпрограммы
JMPZ, - переход, если на стеке 0 (флаг со стека не убирается)
JMPZm, - переход, если на стеке 0 (флаг со стека убирается)
NOP - нет операции
(Последнее для задачи явно не нужно, но из песни (процессора) слов не выкинешь)

Все команды шестнадцатиразрядные, флага переноса нет

Результатом должна быть сумма, расположенная на месте одного из операндов
Ограничений на занимаемую память формально нет. Можно делать переменные, константы, буферы и т.п. нельзя только наглеть и делать мега/гигабайтные таблицы.
Так же нельзя делать циклы, ожидающие, когда помрет Ишак или Эмир...

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 17:22 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
Если речь о форт-процессоре, можно организовать флаг переноса. Но если все-таки не хочется, имитируем перенос на 8-битных порциях - складываем младшие байты, если больше 255, то запоминаем эту единичку в переменной, прикидывающуюся флагом переноса.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 17:35 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
Хищник писал(а):
Если речь о форт-процессоре, можно организовать флаг переноса. Но если все-таки не хочется, имитируем перенос на 8-битных порциях - складываем младшие байты, если больше 255, то запоминаем эту единичку в переменной, прикидывающуюся флагом переноса.


Во-во... Я эту тему поднял только лишь потому, что на другом форуме в обсуждении форт-процессора один "знаток" заявляет, что там этого сделать нельзя (флаг переноса реализовать на VHDL - для него проблема, а складывать не имея флага переноса он не умеет)

: ADC ... ; \ место под определение команды сложения с переносом

: ADD_N \ сложение N-словных чисел
0 >R \ закидываем на стек возвратов нулевой флаг переноса
\ ------
OVER @ OVER @ \ достаем первые слова операндов
ADC \ складываем - этой операции нет в процесоре, но она эмулируется программно
\ при этом используется флаг переноса на стеке возвратов и туда же он
\ записывается после исполнения сложения
OVER ! \ достаем адрес второго операнда и записываем в него результат
1+ SWAP 1+ SWAP \ увеличиваем адреса, чтобы достать следующие слова операндов
\ повторяем N раз в коде все от \ --- до этого места
\ или организовываем цикл
; \ завершаем фортовое определение

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 17:46 
Хищник писал(а):
если больше 255, то запоминаем эту единичку в переменной, прикидывающуюся флагом переноса.
Это называется "полусумматор". Cравнений и переменных там не надо, просто два сложения - сначала с "флагом", затем со следующим
байтом. Возможно, проще будет сначала слагаемые "разрядить" (XXYY -- 00XX 00YY). Кстати, надо учесть, что порядок байтов в слове для разных процессоров может отличаться.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 17:47 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
WingLion писал(а):
флаг переноса реализовать на VHDL - для него проблема

В XST (который основной синтезатор в ISE) при сложении 16-разрядных чисел можно получить как 16-разрядный результат, так и 17-разрядный.

Код:
signal sum : std_logic_vector(16 downto 0); --  тут 17 разрядов
signal a, b : std_logic_vector(15 downto 0); -- а тут 16

...

sum <= a + b;

В старшем разряде sum бит переноса появится сам собой. Если же sum будет определен как 15 downto 0, бит переноса проигнорируется.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 17:50 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 22:48
Сообщения: 7968
Благодарил (а): 25 раз.
Поблагодарили: 144 раз.
gudleifr писал(а):
Cравнений и переменных там не надо, просто два сложения - сначала с "флагом", затем со следующим
байтом.

Это уже вопросы улучшения кода. Часто сначала удобнее написать "лобовое" решение, которое позволит увидеть каждое действие воочию. А потом уже будем добиваться такого же результата, но более эффективно.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Сб фев 18, 2012 18:40 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
: ADCB \ на стеке два слова с зануленными старшими байтами
ADD \ простое сложение
R> \ читаем флаг со стека возвратов
IF 1+ THEN \ прибавляем единицу, если флаг был взведен
\ кто не знает, как на форт-процессоре элементарный
\ оператор IF делается - идет лесом-лесом-налево-направо-и-снова-лесом
DUP FF00 AND \ вытаскивание переноса
>R \ и сохранение его на стеке возвратов
0FF AND \ результат в младшем байте
; \ конец определения сложения двух байтов с переносом

: ADC \ сложение двух слов с переносом
OVER @ 0FF AND \ достаем первый байт операнда 1
OVER @ 0FF AND \ достаем первый байт операнда 2
ADCB \ складываем байты с переносом
\ перенос на стеке возвратов результат не больше байта
OVER @ FF00 AND OR \ микшируем частичный результат
OVER ! \ и записываем его
OVER @ BSWAP 0FF AND \ достаем второй байт операнда 1
OVER @ BSWAP 0FF AND \ достаем второй байт операнда 2
ADCB \ складываем байты с переносом перенос на стеке возвратов
BSWAP \ результат пермещаем в старший байт
OVER @ 0FF AND OR \ микшируем вторую часть результата
OVER ! \ и записываем его
; \ заканчиваем определение

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Вс фев 19, 2012 14:29 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
WingLion писал(а):
: ADCB \ на стеке два слова с зануленными старшими байтами
ADD \ простое сложение
R> \ читаем флаг со стека возвратов
IF 1+ THEN \ прибавляем единицу, если флаг был взведен

Если флаг представлен 0..1, то можно его просто прибавлять, не проверяя IF-ом!
Например, так:
Код:
BSWAP ADD

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Вс фев 19, 2012 18:20 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
in4 писал(а):
Если флаг представлен 0..1, то можно его просто прибавлять, не проверяя IF-ом!


Тогда IF перелезет на проверку результата и превращение переноса со значением 256 в единицу.

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Задача: Сложить два числа
СообщениеДобавлено: Чт фев 23, 2012 18:45 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Не перелезет, IF вообще не будет нужен! Нет переноса (флаг =0) - его прибавление ничего не изменит. Есть перенос (флаг =1) - он прибавлением и учтется.
Может, не заметился BSWAP , который переносит перенос в младший байт?

Это мое предложение было навеяно идеями Броуди о совмещении арифметических и логических выражений. А также идеей о том, что лучше попробовать сначала вычислить значение, а если не получается, использовать таблицы и в последнюю очередь проверку условий. Если надо, могу найти точные цитаты.

_________________
With best wishes, in4.


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

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


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

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


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

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