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

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

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

Подпрограмма-некоторый поименованный
участок кода программы синтаксически
оформленный так, что имеется возможность
его вызова из любого места программы.
Назначение подпрограмм:
1. Программирование на более высоком уровне.
2. Уменьшение размеров программы.

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

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

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

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

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

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

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

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

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

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

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

H
T
T
T
T
T
T
T
T
T
T
T
Ex43
000 00001F
003 0C0009
006 480028
009
00C 000022
00F 000022
012 0C0018
015 480028
018
01B 000025
01E FF
T 01F 00000F
T 022
T 025
T
T
T
T
T
T
T
T
028
02A
02D
030
033
035
038
03A
AC21
008000
048003
0C8000
AC20
18003B
AC02
4C
T 03B 000006
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ex43
Связь по данным
start 0
lda
u;вызов copy(u,v)
sta
p11
jsub
copy
p11
resb
3
p12
word
v
lda
v
;вызов copy(v,w)
sta
p21
jsub
copy
p21
resb
3
p22
word
w
hlt
; данные
u
word
15
v
resb
3
w
resb
3
; подпpогpамма copy
copy rmo
l,x ;X = "адрес ТАЗ"
lda
0,x ;A = p1
ldx
3,x ;X = p2
sta
0,x ;p2 = A
rmo
l,a ; Коppектиpовка
add
c6
;адpеса возвpата
rmo
a,l ;на длину ТАЗ.
rsub
; данные п/п copy
c6
word
6
Пример передачи
параметров к
подпрограмме
по адресу и по
значению
// 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
T
T
T
T
T
T
T
T
T
T
T
Ex44
000 00001F
003 0C0009
006 480028
009
00C 0C0022
00F 000022
012 0C0018
015 480028
018
01B 0C0025
01E FF
T 01F 000011
T 022
T 025
T
T
T
T
T
T
T
028
02A
02C
02F
031
034
037
AC21
AC20
18003B
AC02
008000
180038
4C
T 038 000001
T 03B 000003
E 000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ex44
start 0
lda
u
;v=inc(u)
sta
p11
jsub
inc
p11
resb
3
sta
v
lda
v
;w=inc(v)
sta
p21
jsub
inc
p21
resb
3
sta
w
hlt
; данные
u
word
17
v
resb
3
w
resb
3
; подпрограмма-функция inc
inc
rmo
l,x ;X="адрес ТАЗ"
rmo
l,a ; Корректировка
add
c3
;адреса возврата
rmo
a,l ;на длину ТАЗ.
lda
0,x ;A=p1
add
c1
rsub
; данные inc
c1
word
1
c3
word
3
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 (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
T
T
T
T
T
T
T
T
T
ExMas
000 480037
003 00000F
006 000019
009 000031
00C 480037
00F 000009
012 000028
015 000034
018 FF
T
T
T
T
019
028
031
034
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ExMas start
jsub
l1
word
word
word
jsub
l2
word
word
word
hlt
; данные
d1
resb
d2
resb
max1 resb
max2 resb
0
MasMax
15
;значение l*3
d1
;адpес d1
max1 ;адpес max1
MasMax
9
;значение l*3
d2
;адpес d2
max2 ;адpес max2
15
9
3
3

11. Пример

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

12. Пример

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

14. Пример

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

15. Пример

Организация вложенных подпрограмм
T
T
T
T
T
T
T
T
T
032
034
037
03A
03D
040
042
045
047
AC21
048000
008000
180048
0C8000
AC20
18004B
AC02
4C
T 048 000001
T 04B 000003
E 000
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; подпpогpамма inc
inc
rmo
l,x ;X="адpес адpеса паpаметpа"
ldx
0,x ;X="адpес паpаметpа'
lda
0,x ;A="значение паpаметpа"
add
c1
;A=A+1
sta
0,x ;"паpаметp" = A
rmo
l,a ; Коppектиpовка
add
c3
;адpеса возвpата
rmo
a,l ;на длину ТАЗ.
rsub
; данные п/п inc
c1
word
1
c3
word
3
end
VPod
English     Русский Правила