- •Пояснительная записка
- •1.4.2. Диапазон и погрешность представления чисел
- •1.4.3. Форматы команд, данных и слова состояния процессора
- •1.4.4. Организация виртуальной памяти
- •1.4.5. Способы организации ввода-вывода информации
- •1.4.6. Способ оценки производительности эвм
- •1.4.7. Приращение производительности эвм
- •2.2. Функциональная модель эвм
- •2.3. Алгоритм функционирования эвм
- •2.4. Средства управления прерываниями
- •2.5. Организация виртуальной памяти
- •Алгоритм работы виртуальной памяти
- •2.6. Оценка производительности эвм
- •3. Модификация созданной эвм
- •3.1. Возможности повышения производительности эвм
- •3.2. Организация конвейерной обработки команд
- •3.3. Расчет прироста производительности эвм
- •4. Тестовая задача
- •4.1. Алгоритм и программа для тестирования эвм
- •4.2. Моделирование процесса выполнения программы
- •5. Программирование ввода и вывода
- •5.1. Пример использования системных функций для ввода
- •5.2. Общие сведения об интерфейсе Win32 api
4. Тестовая задача
Пусть дан линейный массив двоичных чисел. Нужно определить индексы (местоположение) нечетных чисел в массиве. Получится новый линейный массив.
Дано:[0001 0010 0000 0110 0100 0000 0000 0100 1010 1100 0101 0000]
1 2 3 4 5 6 7 8 9 10 11 12
Получим: [1 11] и [0001 0101]
4.1. Алгоритм и программа для тестирования эвм
Тестирование заключается в моделировании процесса, выполняющий программу, которая в исходном линейном массиве А двоичных чисел выделяет числа, индекс которых определяется арифметической прогрессией с разностью равной трем. Требуется создать новый массив из выделенных элементов. Вi=A3i (i=0, 1, 2, …).
Start: PtrRk R1; из регистра R1 в регистр Rk - Rk←RAM(R1)
Read [Rk]; читаем i-элемент исходного А-массива в Акк
PtrRk R2; из регистра R2 в регистр Rk - Rk←RAM(R2)
And M; логическое умножение по заданной маске
CMP #0; если в аккумуляторе 0, то переходим по метке L1
JZ L1; если нет, то считываем следующий элемент исходного массива
L1: Read R2; читаем регистр R2
Wr [Rk]; записываем в i-элемент нового В-массива из Акк
Add #4; сложение R2+4→Aкк
Wr R2; записываем в R2←Aкк
Jmp Next;
Next: Read R1; читаем регистр R1
Add #4; сложение R1+С→Aкк
Wr R1; записываем в R1←Aкк
Cmp R3; проверка – не вышли ли за предел исходного массива
Jz Exit; если вышли – на метку Exit
Jmp Start; если нет – переходим на метку Start
Exit: HLT; остановка Tп=0
Программа команды.
Ад- рес Нex |
Обозначение команды |
Объектный код (двоичное представление) |
Комментарий |
100 |
Start:PtrRkR1 |
10101 01 000000000000011000000000 |
Rk←Ram(R1) |
104 |
Read[Rk] |
01001 11 000000000000000000000000 |
Akk←Ram(Rk) |
108 |
PtrRkR2 |
1010101 000000000000011000000100 |
Rk←Ram(R2) |
10C |
And M |
01100 00 000000000000000000000001 |
AccAcc&M |
110 |
CMP #0 |
11010 01 000000000000000000000000 |
Если Acc-M=0 тоZF=1, иначеZF=0 |
114 |
JZ L1 |
00100 00 000000000000101100001000 |
Если IF=1 тоIPIP+L1 |
118 |
L1: ReadR2 |
01001 01 000000000000011000000100 |
Akk←Ram(R2) |
11C |
Wr[Rk] |
0011011 000000000000000000000000 |
Ram(Rk)←Akk |
120 |
Add#4 |
1100110 000000000000000000000100 |
Akk←Akk+4 |
124 |
WrR2 |
0011001 000000000000011000000100 |
Ram(R2)←Akk |
128 |
Jmp Next |
01011 00 000000000000011000100000 |
IPNext |
12C |
Next: ReadR1 |
0100101 000000000000011000000000 |
Akk←Ram(R1) |
130 |
Add#4 |
1100110 000000000000000000000100 |
Akk←Akk+4 |
134 |
WrR1 |
0011001 000000000000011000000000 |
Ram(R1)←Akk |
138 |
CmpR3 |
11010 01 000000000000011000001000 |
Если(Akk-R3)=0, тоZF=1 иначе(Akk-R3)≠0, то ZF=0 |
13C |
JzExit |
0010001 000000000000000100110100 |
Если(ZF=1), тоIP=exit(144) |
140 |
JmpStart |
0101101 000000000000000100000000 |
IP=start(100) |
144 |
Exit: HLT |
0100001 000000000000000000000000 |
Tп=0 |
Программа данных.
Адрес Нex |
Идентификатор |
Объектный код (двоичного представления) |
Комментарий |
400 |
A0 |
00000000 00000000 00000000 00000001 |
1 |
404 |
A1 |
00000000 00000000 00000000 00000010 |
2 |
408 |
A2 |
00000000 00000000 00000000 00000000 |
0 |
40С |
A3 |
00000000 00000000 00000000 00001100 |
12 |
410 |
A4 |
00000000 00000000 00000000 00000100 |
8 |
414 |
A5 |
00000000 00000000 00000000 00000000 |
0 |
418 |
A6 |
00000000 00000000 00000000 00000000 |
0 |
41C |
A7 |
00000000 00000000 00000000 00000100 |
4 |
420 |
A8 |
00000000 00000000 00000000 00000010 |
2 |
424 |
A9 |
00000000 00000000 00000000 00000100 |
8 |
428 |
A10 |
00000000 00000000 00000000 00000101 |
5 |
42C |
A11 |
00000000 00000000 00000000 00000000 |
0 |
… |
… |
… |
|
500 |
B0 |
00000000 00000000 00000000 00000001 |
1 |
504 |
B1 |
00000000 00000000 00000000 00000101 |
5 |
… |
… |
… |
|
600 |
R1 |
00000000 00000000 00000100 00000000 |
400 |
604 |
R2 |
00000000 00000000 00000101 00000000 |
500 |
608 |
R3 |
00000000 00000000 00000100 00110000 |
430 |
60C |
Rk |
00000000 00000000 00000100 00000000 |
0 |
610 |
M |
00000000 00000000 00000000 00000000 |
1 |
R1 – регистр для обращения к исходному массиву А.
R2 – регистр адреса по которому хранится новый массив В.
R3 – адрес за последним элементом исходного массива.
Rk – регистр косвенного адреса.
M – регистр хранения маски.