-------- Пересылаемое сообщение--------
29.03.2014, 21:15, "makarov@bmstu.ru" <makarov@bmstu.ru>:
Разработать на языке Macro-11 функцию, соответствующую приведённому ниже коду на языке C:
int test( int ac, char **av )
{ // \r = 15 \n = 12 (octal)
char buf[ 64 ];
static char str[ 1000 ];
char *d, *p;
char *s;
int f;
d = ac < 2 ? "(), \t" : av[1];
s = ac < 3 ? "; " : av[2];
for (;;) {
&nbs p; f = 0;
gets( buf );
p = xstrtok( buf, d );
if ( !p ) break;
while ( p ) {
if ( *p ) {
if ( f ) strcat( str, s );
strcat( str, xstrlwr( p ) );
f = 1;
}
p = xstrtok( 0, d );
&nbs p; }
strcat( str, "\r\n" );
}
printf( "\r%s", str );
return 6;
}
I) Разрабатываемая функция должна соответствовать соглашению языка Decus C
1. имена функций регистро-зависимые
2. аргументы передаются через стек справа-налево (в памяти располагаются в порядке возрастания адресов)
3. стек от аргументов очищает вызывающий код
4. результат типа char или int возвращается в R0, результат типа long - в пар? ? R0,R1
5. регистры R2-R5 должны сохранять свои значения после возврата из подпрограммы
II) Функции, имена которых начинаются на 'x', приводятся в машинном коде. Их надо перевести на ассемблер,
по одной функции на модуль, и собрать из них библиотеку. При компиляции задачи должна использоваться эта библиотека.
III) Остальные необходимые функции принадлежат библиотеке языка C и содержатся в стандартной библиотеке sy:cc.obj
IV) Программа main, примерно соответствующая такому коду
(дополнительно включены некоторы е проверки корректности работы функции test):
int main( int ac, char **av )
{
printf( "Returned value is %d\r\n", test(ac,av) );
return 0;
}
даётся в виде объектного файла main.obj, размещённого в образе дискеты lab4.dsk
при сборке в образ задачи должны войти
1) объектные файлы main.obj и модуль, содержащий разрабатываемую вами функцию test
2) библиотека, содержащая "x-функции"
3) стандартная библиотека языка C (sy:cc.obj)
V) Функции, приводимые в машинном коде:
=== strlwr ===========================================
Функция "strlwr" переводит строку в нижний регистр.
С 1000 адреса располагается основная программа.
С 2000 адреса -- функция "strlwr".
С 3000 -- сама строка.
Передача аргументов в функцию реализована через регистры.
d 2000=012702
d 2002=000101
d 2004=012703
d 2006=000132
d 2010=012704
d 2012=000040
d 2014=000406
d 2016=020102
d 2020=103403
d 2022=020103
d 2024=101001
d 2026=060401
d 2030=110120
d 2032=111001
d 2034=001370
d 2036=000207
=== strtok ===========================================
Функция char *strtok(char *s, char *delim) (разделить строку s на токены, отделяемые сиволами из набора delim)
Способы и пор ядок передачи аргументов в функцию:
1) адрес строки s (исследуемой) следует поместить в регистр R0 (при втором и последующих вызовах в R0 следует положить нуль-терминатор)
2) адрес строки delim (разделителей) следует поместить в регистр R1
Работа функции и способ возвращения результата ее выполнения:
Функция обнуляет первое вхождение любого символа строки delim в переданную ей строку s и возвращает в регистре R0 адрес начала исследуемой строки. Если функция достигнет конца строки - она вернет 0.
Использование регистров и памяти:
Функция и спользует регистры R0,R1,R2,R3,R4,R5 и резервирует адрес 4000.
Способ вызова функции:
Вызов функции осуществляется с помощью call dest(в примере - 1060), возврат - с помощью return.
d 1060=005700
d 1062=001002
d 1064=013700
d 1066=4000
d 1070=010003
d 1072=001415
d 1074=010102
d 1076=010201
d 1100=112005
d 1102=001412
d 1104=112104
d 1106=001773
d 1110=120405
d 1112=001374
d 1114=005300
d 1116=105020
d 1120=010037
d 1122=4000
d 1124=010300
d 1126=000207
d 1130=010300
d 1132=005037
d 1134=4000
d 1136=000207
-------- Завершение пересылаемого сообщения --------