Программирование в кодах ЦВМ
Программирование в кодах ЦВМ
Программирование в кодах ЦВМ
Программирование в кодах ЦВМ
Программирование в кодах ЦВМ
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
Программирование на языке Ассемблер
922.50K
Категория: ПрограммированиеПрограммирование

Программирование в кодах ЦВМ. Программирование на ЯВУ. Лекция 4

1. Программирование в кодах ЦВМ

Основные шаги при программировании в кодах:
1) разработка подробной схемы алгоритма;
2) распределение памяти (определение адресов
ячеек для размещения констант и
переменных, определение пускового адреса
программы);
3) составление программы на специальном
бланке (таблица с колонками «адрес», «код
команды», «примечание»).

2. Программирование в кодах ЦВМ

Разработать программу для
увеличения переменной data
на 1.
1) разработка подробной
схемы алгоритма;
А – аккумулятор
data – переменная
С1 – константа равная единице

3. Программирование в кодах ЦВМ

Разработать программу для увеличения
переменной data на 1.
2) распределение памяти (определение
адресов ячеек для размещения констант
и переменных, определение пускового
адреса программы);
data – 01Е16
С1
– 02116
пусковой адрес (адрес начала программы)
- 01416

4. Программирование в кодах ЦВМ

Разработать программу для увеличения
переменной data на 1.
3) составление программы на специальном
бланке (таблица с колонками «адрес»,
«код команды», «примечание»).

5. Программирование в кодах ЦВМ

| ; Пример 1
H inc
| inc
start
T 014 00001E |
lda
T 017 180021 |
add
T 01A 0C001E |
sta
T 01D FF
|
hlt
20
data
c1
data
| ; Данные
T 01E
| data
resb
T 021 000001 | c1
word
E 014
|
end
3
1
inc

6. Программирование на языке Ассемблер

Ассемблер – машинно-ориентированный язык,
расширенный средствами управления
трансляцией, средствами связывания
программ и макросредствами.
Ассемблер – это программа, генерирующая
машинный код из исходного кода на языке
Ассемблер.

7. Программирование на языке Ассемблер

Упрощённая схема трансляции
ИК
транслятор
Ассемблера
МК
загрузчик
МК в ОП
Реальная схема трансляции
ИК
транслятор
Ассемблера
МК
ОК
компоновщик
другие
объектные коды
загрузчик
МК в ОП

8. Программирование на языке Ассемблер

Характерные черты языка Ассемблер:
1) использование символических имён операций;
2) использование символических имён полей памяти
вместо адресов:
45h
1
7
3
Имя поля заменяет его адрес,
а не значение, т.е. Summa = 45h
Summa – имя поля
3) автоматическое распределение памяти;
4) исходный текст программы на Ассемблере состоит из
операторов, каждый из которых занимает отдельную
строку.

9. Программирование на языке Ассемблер

Операторы в УЦВМ:
1) оператор машинной команды – символическая запись
машинной команды:
[<метка>] <симв. КОп> [<операнд>] [;<комментарий>]
2) оператор псевдокоманды (директива):
[<метка>] <директива> <операнд> [; <комментарий>]
Машинные команды управляют процессором,
а псевдокоманды – транслятором.

10. Программирование на языке Ассемблер

Псевдокоманды в УЦВМ:
1) [<имя>] start <адрес> – первая запись программы,
<имя> – имя всей программы
<адрес> – адрес загрузки программы
2) [<имя>] end <адрес> – последний оператор программы,
<адрес> – пусковой адрес (точка входа в программу)
3) [<метка>] word <операнд> – резервирование места для
инициализированной переменной
4) [<метка>] resb <операнд> – резервирование
определённого операндом количества байтов памяти

11. Программирование на языке Ассемблер

Пример составления программы на Ассемблере
начало
A:=y
нет
y>0
да
y:=y-1
конец
; begin if y>0 then y:=y-1 end.
dec
start 0 ; адрес загрузки программы = 0
lda y
; A=y
comp c0 ; (A-c0)>0?
jlt k
; если меньше переход на метку k
jeq k
; если равно переход на метку k
sub c1 ; A=A-1
k
sta y
; y=A
hlt
; останов
; данные
с1
word 1 ; поместить в слово по адресу с1 - 1
c0
word 0 ; поместить в слово по адресу с0 - 0
y
resb 3 ; выделить 3 байта под переменную y
end dec ; начать выполнение программы с
; метки dec

12. Программирование на языке Ассемблер

Индексирование элементов массива
y указывает на первый элемент массива.
Адрес элемента массива – адрес младшего байта элемента.
Для одномерного массива справедлива формула определения
адреса заданного элемента:
E[i] = y + i*3

13. Программирование на языке Ассемблер

Способы обращения к элементам массива
1. Способ модификации команд (нереентерабельные
программы):
КОп
Адрес
+
3

14. Программирование на языке Ассемблер

H
T
T
T
T
T
T
T
T
T
T
Ex31
000 00001C
003 1C001F
006 200022
009 0C0025
00C 000028
00F 180025
012 0C0015
015
018 0C002B
01B FF
T
T
T
T
T
T
T
T
T
T
T
E
01C
01F
022
025
028
02B
02E
031
034
037
03A
000
000003
000001
000003
00002E
000020
000021
000022
000023
000024
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ex31
start
lda
sub
mul
sta
lda
add
sta
read resb
sta
hlt
; данные
i
word
c1
word
c3
word
index resb
com
lda
y
resb
d
word
word
word
word
word
end
0
i
c1
c3
index
com
index
read
3
y
3
1
3
3
d
3
32
33
34
35
36
Ex31
Программирование
на языке Ассемблер
Пример: Загрузка в
аккумулятор 3-его
элемента массива

15. Программирование на языке Ассемблер

Способы обращения к элементам массива
2. Использование индексного регистра:
КОп
Адрес
x=
0, прямая адресация
1, индексная адресация
x
Вычисление исполнительного адреса:
TA =
Адрес, если x=0
Адрес+(X), если x=1
При операциях с массивом в регистре X обычно хранится
смещение адреса элемента массива относительно
базового адреса этого массива.

16. Программирование на языке Ассемблер

Пример работы с одномерным массивом:
поиск максимального элемента массива
program ExArray;
var d: array[1..5] of integer;
max: integer;
i: integer;
begin
max:=d[1];
for i:=2 to 5 do
if d[i]>max then max:=d[i];
end.
ExArray start 0
lda d
sta max
ldx c3
rpt
lda d,x
comp max
jlt cont
jeq cont
then
sta max
cont
rmo x, a
add c3
rmo a, x
comp c15
jlt rpt
hlt
; данные
c3
c15
max
d
ExArray
word 3
word 15
resb 3
resb 15
end

17. Программирование на языке Ассемблер

Многомерные массивы
При использовании в программе многомерных массивов
производится линеаризация массива.
После линеаризации элементы многомерного массива
располагаются в памяти друг за другом:
E[i,j] = y + i*3*l+j*3
y – адрес начала массива
l – кол-во элементов в строке
i – номер строки
j – номер столбца

18. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждой строки
матрицы m
#include "stdafx.h"
int main()
{
const int l = 4, h = 3;
int m[h][l];
int n[h];
m[0][0] = 1; m[0][1] = 2; m[0][2] = 3;
m[1][0] = 5; m[1][1] = 6; m[1][2] = 7;
m[2][0] = 9; m[2][1] = 0; m[2][2] = 1;
for (int i = 0; i < h; i++)
n[i] = 0;
for (int i = 0; i < h; i++)
for (int j = 0; j < l; j++)
n[i] = n[i] + m[i][j];
return 0;
}
m[0][3] = 4;
m[1][3] = 8;
m[2][3] = 2;

19. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждой строки
матрицы m (данные)
H sumSt
T
T
T
T
T
T
T
T
T
T
T
T
T
T
000
003
006
009
00C
00F
012
015
018
01B
01E
021
024
027
000004
000003
000001
000002
000003
000004
000005
000006
000007
000008
000009
000000
000001
000002
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
; Записать с массив n суммы элементов каждой строки
матрицы m
sumSt
start
0
; Данные
l1
word
4 ;кол-во элементов в строке
h
word
3 ;кол-во элементов в столбце
m
word
1
word
2
word
3
word
4
word
5
word
6
word
7
word
8
word
9
word
0
word
1
word
2

20. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждой строки
матрицы m (данные)
T
T
T
T
T
T
T
T
T
T
02A
| n
033
| ln
036
| lm
039
| lmw
03C
| in
03F
| im
042
| i
045 000000 | c0
048 000001 | c1
04B 000003 | c3
|
resb
resb
resb
resb
resb
resb
resb
word
word
word
9
3
3
3
3
3
3
0
1
3
;длина массива n в байтах
;длина массива m в байтах
;длина строки массива m в байтах
;смещение по n
;смещение по m
;индекс текущего элемента в строке

21. Программирование на языке Ассемблер

T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
04E
051
054
057
05A
05C
05F
062
065
068
06A
06D
06F
072
075
078
07B
07E
081
084
087
08A
000003
20004B
0C0033
040045
AC10
280033
300072
000045
0C802A
AC10
18004B
AC01
3C005C
000000
20004B
0C0039
200003
0C0036
000045
0C0042
0C003C
0C003F
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;Программа
st
lda
mul
sta
ldx
rmo
p2
comp
jeq
lda
sta
rmo
add
rmo
j
p1
lda
mul
sta
mul
sta
lda
sta
sta
sta
h
c3
ln
c0
x,a
ln
p1
c0
n,x
x,a
c3
a,x
p2
l1
c3
lmw
h
lm
c0
i
in
im
Программирован
ие на языке
Ассемблер
Пример: Записать в массив
n суммы элементов
каждой строки
матрицы m (установка
начальных занчений)

22. Программирование на языке Ассемблер

T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
08D
090
093
096
099
09C
09F
0A2
0A5
0A8
0AB
0AE
0B1
0B4
0B7
0BA
0BD
0C0
0C3
0C6
0C9
0CC
0CF
0D2
00003F
280036
3000D5
000042
280000
3000C3
04003F
008006
04003C
18802A
0C802A
000042
180048
0C0042
00003F
18004B
0C003F
3C008D
000045
0C0042
00003C
18004B
0C003C
3C008D
| p5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| p3
|
|
|
|
|
lda
comp
jeq
lda
comp
jeq
ldx
lda
ldx
add
sta
lda
add
sta
lda
add
sta
j
lda
sta
lda
add
sta
j
im
lm
p4
i
l1
p3
im
m,x
in
n,x
n,x
i
c1
i
im
c3
im
p5
c0
i
in
c3
in
p5
Программирова
ние на языке
Ассемблер
Пример: Записать в
массив n суммы
элементов
каждой строки
матрицы m
T 0D5 FF
E 04E
| p4
|
|
hlt
end
st

23. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждой
строки матрицы m

24. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждой
строки матрицы m

25. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждого
столбца матрицы m
#include "stdafx.h"
int main()
{
const int l = 4, h = 3;
int m[h][l];
int n[l];
m[0][0] = 1; m[0][1] = 2; m[0][2] = 3;
m[1][0] = 5; m[1][1] = 6; m[1][2] = 7;
m[2][0] = 9; m[2][1] = 0; m[2][2] = 1;
for (int j = 0; j < 4; j++)
n[j] = 0;
for (int i = 0; i < h; i++)
for (int j = 0; j <l; j++)
n[j] = n[j] + m[i][j];
return 0;
}
m[0][3] = 4;
m[1][3] = 8;
m[2][3] = 2;

26. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждого
столбца матрицы m (данные)
H sumSt
T
T
T
T
T
T
T
T
T
T
T
T
T
T
000
003
006
009
00C
00F
012
015
018
01B
01E
021
024
027
000004
000003
000001
000002
000003
000004
000005
000006
000007
000008
000009
000000
000001
000002
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sumSt
start
; Данные
l1
word
h
word
m
word
word
word
word
word
word
word
word
word
word
word
word
0
4 ;кол-во элементов в строке
3 ;кол-во элементов в столбце
1 ;массив из 12 элементов
2
3
4
5
6
7
8
9
0
1
2

27. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждого
столбца матрицы m (данные)
T
T
T
T
T
T
T
T
T
T
02A
| n
036
| ln
039
| lm
03C
| lmw
03F
| in
042
| im
045
| i
048 000000 | c0
04B 000001 | c1
04E 000003 | c3
|
T 02A
T 033
resb
resb
resb
resb
resb
resb
resb
word
word
word
| n
| ln
12 ;;;;массив из 4 элементов
3 ;длина массива n в байтах
3 ;длина массива m в байтах
3 ;длина строки массива m в байтах
3 ;смещение по n
3 ;смещение по m
3 ;индекс текущего элемента в строке
0
1
3
resb
resb
9
3 ;длина массива n в байтах

28.

T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
051
054
057
05A
05D
05F
062
065
068
06B
06D
070
072
075
078
07B
07E
081
084
087
08A
08D
000000
20004E
0C0036
040048
AC10
280036
300075
000048
0C802A
AC10
18004E
AC01
3C005F
000000
20004E
0C003C
200003
0C0039
000048
0C0045
0C003F
0C0042
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;Программа
st
lda
mul
sta
ldx
rmo
p2
comp
jeq
lda
sta
rmo
add
rmo
j
p1
lda
mul
sta
mul
sta
lda
sta
sta
sta
l1 ;;;; T 04E 000003 | st
lda
c3
Вычисление длинны массива n
ln
//ln=l1*3
c0
Заполнение массива n нулями
x,a
for (int j = 0; j < 4; j++) n[j] = 0;
ln
j < 4; //X-ln>0
p1
c0
n[j] = 0;
n,x
x,a
c3
j++; //X=X+3
a,x
p2
Установка длинны строки
l1
массива m в байтах
c3
//lmw=l1*3
lmw
Установка длинны
h
массива m в байтах
lm
//mw=lmw*h
c0
//i=0
i
//in=0
in
//im=0
im
h

29.

T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
T
090
093
096
099
09C
09F
0A2
0A5
0A8
0AB
0AE
0B1
0B4
0B7
0BA
0BD
0C0
0C3
0C6
0C9
0CC
0CF
0D2
0D5
0D8
000042
280039
3000DB
000045
280000
3000CF
040042
008006
04003F
18802A
0C802A
000045
18004B
0C0045
00003F
18004E
0C003F
000042
18004E
0C0042
3C0090
000048
0C0045
0C003F
3C0090
| p5
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| p3
|
|
|
lda
comp
jeq
lda
comp
jeq
ldx
lda
ldx
add
sta
lda
add
sta
lda
add
sta
lda
add
sta
j
lda
sta
sta
j
im //im=lm for (int i = 0; i < h; i++)
lm если =,
p4 то выход for (int j = 0; j <l; j++)
n[j] = n[j] + m[i][j];
i
//i=l1
l1 если конец строки, то переходим
p3 к следующей в блоке p3
im
n[j] = n[j] + m[i][j];
//X=im
m,x
//A=W[m+X]
in
//X=in
n,x
//A=A+W[n+X]
n,x
//W[n+X]=A
i
//i++
c1
i
T 0B4 0C0042 | sta I
in ;;;;
//in++ T 0B7 00003F | lda im
c3 ;;;;
in ;;;;
im
//im=im+3
c3
im
T 0C6 0C0042 | sta i
p5
T 0C9 00003C | lda in
c0
T 0CC 18004B | add c3
i
T 0CF 0C003C | sta in
//i=0
in ;;;; //in=0 T 0D2 3C008D | j
p5
p5

30. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов
каждого столбца матрицы m
T 0DB FF
E 051
| p4 hlt
|
|
end st

31. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждого
столбца матрицы m

32. Программирование на языке Ассемблер

Пример: Записать в массив n суммы элементов каждого
столбца матрицы m
English     Русский Правила