Коллеги, в порте 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 битам и складыванию в стек.
Как это можно уточнить? В документации я это не нашел.