4 laba

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Разработать на языке 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