OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 14:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Процедура Fill по аналогии с Kernel.Erase
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 08:34 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Коллеги, в порте AGG часто требуется заполнение кусков массива одним байтом.
В С это реализуется процедурой fill или аналогичными.
Для ББ это весьма опасное занятие, и, по-хорошему, надо бы переписывать это через настоящее обращение к массивам, через FOR или COPY.

Однако, есть уже работающий код, который использует процедуру Fill (точнее, SYSTEM.FILL(address, value, len) из XDS-runtime).

Поэтому, я написал процедуру на ассемблере, по аналогии с Kernel.Erase:

Код:
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: INTEGER)
      089H, 0C7H,   (* MOV EDI, EAX *)
      031H, 0C0H,   (* XOR EAX, EAX *)
      059H,         (* POP ECX *)
      058H,         (* POP EAX *)
      0F3H, 0AAH;   (* REP STOSB *)


Процедура работает, но меня смущает то, что я вынужден был передать параметр val в виде четырехбайтного числа, потому как я не уверен, в каком виде передаются в стек параметры.

По задумке, правильный интерфейс процедуры такой:

Код:
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: SHORTCHAR)


больше того, она в таком виде работает правильно.

Т.е. получается, что параметры процедуры (кроме первого) передаются через приведение к 32 битам и складыванию в стек.
Как это можно уточнить? В документации я это не нашел.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 10:13 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
My version fill procedure is:

Код:
  PROCEDURE [ code ] agg_fill*(adr, size: INTEGER; val: SHORTCHAR)
     089H, 0C7H,   (* MOV EDI, EAX *)
     059H,         (* POP ECX *)
     058H,         (* POP EAX *)
     0F3H, 0AAH;   (* REP STOSB *)


and I dont known what is your question (for google translation)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 10:25 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
maliya писал(а):
and I dont known what is your question (for google translation)


Well, I'll ask question in a different way.

There are two procedures,

Код:
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: INTEGER)

and
Код:
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: SHORTCHAR)

with the same code.

The obvious difference is the val parameter size, 4 bytes vs. 1 byte.
Since both procedures work correctly, it seems that compiler uses 4 bytes as a placeholder for parameters of smaller size.

Does my suggestion correct?
I found no info on this topic at documentation.

And you are right, it is not necessary to do XOR on EAX.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 10:46 

Зарегистрирован: Четверг, 12 Июнь, 2008 17:30
Сообщения: 37
I use size instead of words is for more clear meaning.(the org Kernel.Erase use words(4bytes))

Цитата:
The obvious difference is the val parameter size, 4 bytes vs. 1 byte.
Since both procedures work correctly, it seems that compiler uses 4 bytes as a placeholder for parameters of smaller size.

yes, the compile push shortchar use four bytes,
but our fill procedure use REP STOSB, that only one byet(AL(shortchar)) is used, discard the other three bytes. intel doc have this detail.

be glad you continue agg work.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 11:04 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
maliya писал(а):
I use size instead of words is for more clear meaning.(the org Kernel.Erase use words(4bytes))

Цитата:
The obvious difference is the val parameter size, 4 bytes vs. 1 byte.
Since both procedures work correctly, it seems that compiler uses 4 bytes as a placeholder for parameters of smaller size.

yes, the compile push shortchar use four bytes,
but our fill procedure use REP STOSB, that only one byet(AL(shortchar)) is used, discard the other three bytes. intel doc have this detail.

be glad you continue agg work.


I use REP STOSB advisedly.
It should fill memory with 1 byte pattern.

Thanks for help!


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 15:33 

Зарегистрирован: Пятница, 26 Август, 2011 23:42
Сообщения: 339
Откуда: Россия, Самара
Димыч писал(а):
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: INTEGER)
      089H, 0C7H,   (* MOV EDI, EAX *)
      031H, 0C0H,   (* XOR EAX, EAX *)
      059H,         (* POP ECX *)
      058H,         (* POP EAX *)
      0F3H, 0AAH;   (* REP STOSB *)


Такой ассемблер я видел в turbo pascalях старых версий. На ББ можно писать на внятном ассемблере(как в комментариях)?

И ещё вопрос, неужели данную функцию нельзя написать на КП, без асма?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 15:57 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2935
Откуда: г. Ярославль
Джордан, а вы можете читать доку сначала - перед задаванием вопросов, а не после? :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 17 Декабрь, 2013 16:04 
Аватара пользователя

Зарегистрирован: Среда, 29 Март, 2006 12:09
Сообщения: 495
Jordan писал(а):
Димыч писал(а):
PROCEDURE [ code ] agg_fill*(adr, words: INTEGER; val: INTEGER)
      089H, 0C7H,   (* MOV EDI, EAX *)
      031H, 0C0H,   (* XOR EAX, EAX *)
      059H,         (* POP ECX *)
      058H,         (* POP EAX *)
      0F3H, 0AAH;   (* REP STOSB *)


Такой ассемблер я видел в turbo pascalях старых версий. На ББ можно писать на внятном ассемблере(как в комментариях)?

И ещё вопрос, неужели данную функцию нельзя написать на КП, без асма?

На первый вопрос ответ отрицательный. Можно только в опкодах.

На второй вопрос тоже отрицательный ответ. Дело в архитектуре AGG. Там часто используются куски массивов, причем начало этого массива вычисляется. Я и так по возможности заменил адресную арифметику индексной, но, к сожалению, это не везде удалось. К версии 2.0 порта, думаю, можно это будет исключить, а пока прямая работа с памятью оказалась проще, чем борьба с типами, увы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 22 Декабрь, 2013 00:21 

Зарегистрирован: Понедельник, 30 Июль, 2007 10:53
Сообщения: 1538
Откуда: Беларусь, Минск
Насколько я помню, в стек складываются данные фиксированного размера. Логично предположить, что этот размер соответствует размеру слова. Для 32-разрядных архитектур это будет 4 байта. Это зашито в процессор.


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB