Организация подпрограмм. Программирование на ЯВУ. Лекция 5

Содержание

Слайд 2

Организация подпрограмм

С целью создания возможности организации подпрограмм в архитектуру УМ включены специальные

Организация подпрограмм С целью создания возможности организации подпрограмм в архитектуру УМ включены
средства:
- регистр связи L; - команда " Переход к подпрограмме " (jsub); - команда " Возврат из подпрограммы" (rsub); - посылочные команды ldl и stl.

Слайд 3

Организация подпрограмм

Проблемы при работе с подпрограммами:
Связь по управлению
Связь по данным

Организация подпрограмм Проблемы при работе с подпрограммами: Связь по управлению Связь по данным

Слайд 4

Связь по управлению

Пример иллюстрирует организацию обращения к подпрограмме

// Ex41.cpp
#include "stdafx.h"
int v;
void

Связь по управлению Пример иллюстрирует организацию обращения к подпрограмме // Ex41.cpp #include
inc()
{
v++;
}
int main()
{
v = 1;
inc();
inc();
return 0;
}

Слайд 5

Связь по данным

Существуют следующие основные способы передачи данных между программными единицами:
- передача

Связь по данным Существуют следующие основные способы передачи данных между программными единицами:
данных через регистры (A и X);
- использование общих переменных;
- использование механизма формальных и фактических параметров.

Слайд 6

Связь по данным

Пример передачи параметров к подпрограмме по адресу

// Ex42.cpp :
#include

Связь по данным Пример передачи параметров к подпрограмме по адресу // Ex42.cpp
"stdafx.h"
int v = 5, w = 7;
void inc(int *i)
{ (*i)++; }
int main()
{
inc(&v);
inc(&w);
inc(&v);
return 0;
}

H Ex42 | Ex42 start 0
T 000 480019 | jsub inc
T 003 000013 | word v ;адpес v
T 006 480019 | jsub inc
T 009 000016 | word w ;адpес w
T 00C 480019 | jsub inc
T 00F 000013 | word v ;адpес v
T 012 FF | hlt
| ; данные
T 013 000005 | v word 5
T 016 000007 | w word 7
| ; подпpогpамма inc
T 019 AC21 | inc rmo l,x ;X="адpес адpеса паpаметpа"
T 01B 048000 | ldx 0,x ;X="адpес паpаметpа'
T 01E 008000 | lda 0,x ;A="значение паpаметpа"
T 021 18002F | add c1 ;A=A+1
T 024 0C8000 | sta 0,x ;"паpаметp" = A
T 027 AC20 | rmo l,a ; Коppектиpовка
T 029 180032 | add c3 ;адpеса возвpата
T 02C AC02 | rmo a,l ;на длину ТАЗ.
T 02E 4C | rsub
| ; данные п/п inc
T 02F 000001 | c1 word 1
T 032 000003 | c3 word 3
E 000 | end Ex42

Слайд 7

H Ex43 | Ex43 start 0
T 000 00001F | lda u;вызов copy(u,v)
T

H Ex43 | Ex43 start 0 T 000 00001F | lda u;вызов
003 0C0009 | sta p11
T 006 480028 | jsub copy
T 009 | p11 resb 3
T 00C 000022 | p12 word v
T 00F 000022 | lda v ;вызов copy(v,w)
T 012 0C0018 | sta p21
T 015 480028 | jsub copy
T 018 | p21 resb 3
T 01B 000025 | p22 word w
T 01E FF | hlt
| ; данные
T 01F 00000F | u word 15
T 022 | v resb 3
T 025 | w resb 3
| ; подпpогpамма copy
T 028 AC21 | copy rmo l,x ;X = "адрес ТАЗ"
T 02A 008000 | lda 0,x ;A = p1
T 02D 048003 | ldx 3,x ;X = p2
T 030 0C8000 | sta 0,x ;p2 = A
T 033 AC20 | rmo l,a ; Коppектиpовка
T 035 18003B | add c6 ;адpеса возвpата
T 038 AC02 | rmo a,l ;на длину ТАЗ.
T 03A 4C | rsub
| ; данные п/п copy
T 03B 000006 | c6 word 6
E 000 | end Ex43

Связь по данным

Пример передачи параметров к подпрограмме по адресу и по значению

// Ex43.cpp
#include "stdafx.h"
const int u = 15;
int v, w;
void copy(int x, int *y)
{ *y = x; }
int main()
{
copy(u, &v);
copy(v, &w);
return 0;
}

Слайд 8

H Ex44 | Ex44 start 0
T 000 00001F | lda u ;v=inc(u)
T

H Ex44 | Ex44 start 0 T 000 00001F | lda u
003 0C0009 | sta p11
T 006 480028 | jsub inc
T 009 | p11 resb 3
T 00C 0C0022 | sta v
T 00F 000022 | lda v ;w=inc(v)
T 012 0C0018 | sta p21
T 015 480028 | jsub inc
T 018 | p21 resb 3
T 01B 0C0025 | sta w
T 01E FF | hlt
| ; данные
T 01F 000011 | u word 17
T 022 | v resb 3
T 025 | w resb 3
| ; подпрограмма-функция inc
T 028 AC21 | inc rmo l,x ;X="адрес ТАЗ"
T 02A AC20 | rmo l,a ; Корректировка
T 02C 18003B | add c3 ;адреса возврата
T 02F AC02 | rmo a,l ;на длину ТАЗ.
T 031 008000 | lda 0,x ;A=p1
T 034 180038 | add c1
T 037 4C | rsub
| ; данные inc
T 038 000001 | c1 word 1
T 03B 000003 | c3 word 3
E 000 | end Ex44

Связь по данным

Пример организации подпрограмма, возвращающих значение

// Ex44.cpp
#include "stdafx.h"
const int u = 10;
int v, w;
int inc(int x)
{
return x + 1;
}
int main()
{
v = inc(u);
w = inc(v);
return 0;
}

Слайд 9

Пример

Обработка массива подпрограммой

#include "stdafx.h"
void mas_max(int l, int *d, int *max)
{
int max_l=d[0];
for

Пример Обработка массива подпрограммой #include "stdafx.h" void mas_max(int l, int *d, int
(int i =1; i < l; i++)
if (d[i] > max_l) max_l = d[i];
*max = max_l;
}
int main()
{
int d1[5] = { 1,2,1,2,1 };
int d2[3] = { 1,2,13};
int max1, max2;
mas_max(5, d1, &max1);
mas_max(3, d2, &max2);
return 0;
}

Слайд 10

H ExMas | ExMas start 0
T 000 480037 | jsub MasMax
T 003

H ExMas | ExMas start 0 T 000 480037 | jsub MasMax
00000F | l1 word 15 ;значение l*3
T 006 000019 | word d1 ;адpес d1
T 009 000031 | word max1 ;адpес max1
T 00C 480037 | jsub MasMax
T 00F 000009 | l2 word 9 ;значение l*3
T 012 000028 | word d2 ;адpес d2
T 015 000034 | word max2 ;адpес max2
T 018 FF | hlt
| ; данные
T 019 | d1 resb 15
T 028 | d2 resb 9
T 031 | max1 resb 3
T 034 | max2 resb 3

Пример

Обработка массива подпрограммой

Слайд 11

T 037 AC21 | MasMax rmo l,x ;X="адpес паpаметpа l (адрес ТАЗ)"
T

T 037 AC21 | MasMax rmo l,x ;X="адpес паpаметpа l (адрес ТАЗ)"
039 008000 | lda 0,x ;A="значение паpаметpа l"
T 03C 188003 | add 3,x ;A=«адрес массива»+«длина массива(А)»
T 03F 0C008A | sta ll ;ll = A(адрес ячейки памяти идущей
; следюущей после последнего элемента массива)
T 042 048003 | ldx 3,x ;X="адpес паpаметpа d"(адрес начала массива)
T 045 008000 | lda 0,x ;A="значение паpаметpа d[0]"
T 048 0C008D | sta max ;сохранение певрого элемента массива
;в лок. перем.
T 04B AC10 | rmo x,a ;i=i+1(X=X+3)
T 04D 180084 | add c3 ;X-адрес элемента d[1]
T 050 AC01 | rmo a,x
T 052 008000 | rpt lda 0,x ;A=d[i]
T 055 28008D | comp max ;A > max ?
T 058 380061 | jlt m ;Переход, если "меньше".
T 05B 300061 | jeq m ;Пеpеход, если "равно".
T 05E 0C008D | sta max ;max=A
T 061 AC10 | m rmo x,a ;i=i+1(X=X+3)
T 063 180084 | add c3
T 066 AC01 | rmo a,x
T 068 28008A | comp ll ;X < ll ?
T 06B 380052 | jlt rpt ;Переход, если "да".(Если проверели не все
;элементы массива, то возвращаемся в начало цикла)

Пример

Обработка массива подпрограммой

Слайд 12

T 06E AC21 | rmo l,x ;X="адpес (адpеса паpаметpа max(глобальной)-6)"
T 070 048006

T 06E AC21 | rmo l,x ;X="адpес (адpеса паpаметpа max(глобальной)-6)" T 070
| ldx 6,x ;X="адpес паpаметpа max(глобальной)"
T 073 00008D | lda max ;Сохранение максимального значения в глобальную
T 076 0C8000 | sta 0,x ;переменную
|
T 079 AC20 | rmo l,a ;Коppектиpовка
T 07B 180087 | add c9 ;адpеса возвpата
T 07E AC02 | rmo a,l ;на длину ТАЗ.
T 080 4C | rsub
| ; данные п/п MasMax
T 081 000001 | c1 word 1
T 084 000003 | c3 word 3
T 087 000009 | c9 word 9
T 08A | ll resb 3
T 08D | max resb 3
E 000 | end ExMas

Пример

Обработка массива подпрограммой

Слайд 13

Пример

Организация вложенных подпрограмм

#include "stdafx.h"
void inc(int *i)
{
(*i)++;
}
void inc2(int *i)
{
inc(i);
inc(i);
}
int main()
{
int v = 5;
inc2(&v);
return

Пример Организация вложенных подпрограмм #include "stdafx.h" void inc(int *i) { (*i)++; }
0;
}

Слайд 14

H VPod | VPod start 0
T 000 48000A | jsub inc2
T 003

H VPod | VPod start 0 T 000 48000A | jsub inc2
000007 | word v ;адpес v
T 006 FF | hlt
| ; данные
T 007 000005 | v word 5
|
| ; подпpогpамма inc2
T 00A AC21 | inc2 rmo l,x ;X="адpес адpеса паpаметpа"
T 00C 008000 | lda 0,x ;A="адpес паpаметpа'
T 00F 0C0020 | sta v1
T 012 0C0026 | sta v2
T 015 AC20 | rmo l,a ; Коppектиpовка
T 017 18004B | add c3 ;адpеса возвpата
T 01A 0C002F | sta ll ;на длину ТАЗ. Сохранение регистра L
T 01D 480032 | jsub inc
T 020 | v1 resb 3 ;адpес параметра
T 023 480032 | jsub inc
T 026 | v2 resb 3 ;адpес параметра
T 029 00002F | lda ll
T 02C AC02 | rmo a,l ; Восстановление регистра L
T 02E 4C | rsub
| ; данные п/п inc2
T 02F | ll resb 3
|

Пример

Организация вложенных подпрограмм