- •Цикл команды процессора.
- •2. Методы повышения производительности. Кэш-память. Конвейеризация. Суперскалярные процессоры.
- •Микроархитектура Intel Pentium 4.
- •4. Регистры и режимы адресации процессора Intel Pentium 4.
- •5. Язык Ассемблер. Области применения Ассемблера. Программы на ассемблере. Общая схема трансляции программы.
- •6. Команды пересылки данных. Косвенная адресация памяти. Команды работы со стеком.
- •7. Команды сложения и вычитания. Команды умножения и деления. Команды распространения знака.
- •8. Команды работы с битами. Логические команды. Операции сдвига.
- •9. Команды передачи управления. Команда безусловного перехода. Команды условного перехода.
- •10. Команды вызова процедур. Команды организации циклов.
- •11. Работа с массивами. Одномерные массивы, двумерные статические массивы.
- •12. Работа с массивами. Двумерные динамические массивы.
- •13. Команды обработки строк.
- •14. Консольные приложения: api-функции для работы с консольными приложениями.
- •15. Обработка событий в консольных приложениях.
- •17. Структура gui-приложения. Регистрация класса окон.
- •21. Оптимизация: цель, критерии, требования, методика, средства.
- •22. Алгоритмическая оптимизация: временная сложность, сравнение алгоритмов, примеры.
- •23. Способы измерения времени. Применение рекурсии. Примеры.
- •24. Программная оптимизация: связь с архитектурой процессора, приемы оптимизации, векторизация, оптимизация циклов.
10. Команды вызова процедур. Команды организации циклов.
Команды вызова процедур.
call цель
Передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата.
push источник
Размещение содержимого операнда источник в стеке.
pop приемник
Извлечение слова или двойного слова из стека.
ret ret число
Возврат управления из процедуры вызывающей программе.
Команды организации циклов.
loop метка
Организация цикла со счетчиком в регистре cx.
loope/loopz метка loopne/loopnz метка
Организация цикла со счетчиком в регистре cx с учетом флага zf.
11. Работа с массивами. Одномерные массивы, двумерные статические массивы.
Одномерные массивы.
Объявление массива на языке Си:
short mas[3];
short *pt;
pt = mas;
Адрес элемента массива:
pt + 1 ≡ mas + 1 ≡ &mas[1]
Значение элемента массива:
*(pt + 1) ≡ *(mas + 1) ≡ mas[1]
Имя массива является его начальным адресом
Пример. Найти сумму элементов одномерного массива целых чисел
void InputArrKey(int *a, int n);
void PrintArr(int *a, int n);
extern "C" int const n = 5;
extern "C" int a[5];
extern "C" int s;
extern "C” void sum();
.MODEL FLAT, C
.DATA
EXTRN a : DWORD, n : DWORD, s : DWORD
.CODE
PUBLIC C sum
sum PROC
XOR EBX, EBX
XOR EAX, EAX
MOV ECX, n
JECXZ end1
cycle: ADD EAX, DWORD PTR a[EBX]
ADD EBX, 4
LOOP cycle
end1: MOV s, EAX
RET
sum ENDP
END
add EAX, DWORD PTR a[EBX]
add EAX, DWORD PTR [a + EBX]
add EAX, DWORD PTR [EBX]+a
В качестве индексного регистра можно использовать регистры EBX, ESI, EDI
Двумерные статические массивы.
Объявление статического массива на языке Си:
short mas[3][2];
Адрес элемента массива:
mas ≡ &mas[0][0]
Значение элемента массива:
**mas ≡ mas[0][0]
Адрес элемента массива:
mas + 1 ≡ &mas[1][0]
Значение элемента массива:
**(mas + 1) ≡ mas[1][0]
Пример. Найти сумму элементов двумерного массива целых чисел
#include <time.h>
extern "C" int const n = 3;
extern "C" int const m = 2;
extern "C" int a[n][m];
extern "C" int s;
extern "C" void sum2x();
.MODEL FLAT, C
.DATA
EXTRN a : DWORD, n : DWORD, m : DWORD, s : DWORD
m4 DD ?
.CODE
PUBLIC C sum2x
Sum2x PROC
XOR EBX, EBX
XOR EAX, EAX
MOV EDX, m
SHL EDX, 2
MOV m4, EDX
MOV ECX, n
JECXZ endl
cycle1: PUSH ECX
XOR ESI, ESI
MOV ECX, m
JECXZ endl
cycle2:
ADD EAX, DWORD PTR a[EBX][ESI]
ADD ESI, 4
LOOP cycle2
ADD EBX, m4
POP ECX
LOOP cycle1
endl: MOV s, EAX
RET
sum2x ENDP
END
12. Работа с массивами. Двумерные динамические массивы.
Двумерные динамические массивы.
Объявим динамический массив на языке Си:
short **mas;
mas ≠ &mas[0][0]
mas + 1 ≠ &mas[1][0]
Адрес элемента массива:
*mas ≡ &mas[0][0]
Значение элемента массива:
**mas ≡ mas[0][0]
Адрес элемента массива:
*(mas + 1) ≡ mas[1][0]
Значение элемента массива:
**(mas + 1) ≡ mas[1][0]
Пример. Найти сумму элементов двумерного массива целых чисел.
void InputArrDyn(int **b,int n,int m)
{
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
b[i][j] = rand()/1000;
}
void PrintArrDyn(int **b,int n,int m)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cout << b[i][j] << "\t";
cout << endl;
}
}
.DATA
EXTRN b : DWORD, n : DWORD,
m : DWORD, s : DWORD
.CODE
PUBLIC C sum2xDyn
sum2xDyn PROC
MOV EDX, b
MOV EBX, [EDX]
XOR EAX, EAX
MOV ECX, n
JECXZ endl
cycle1: PUSH ECX
XOR ESI, ESI
MOV ECX, m
JECXZ endl
cycle2:
ADD EAX, DWORD PTR [ESI][ESI]
ADD ESI, 4
LOOP cycle2
MOV EBX, [EDX+4]
POP ECX
LOOP cycle1
endl: MOV s, EAX
RET
sum2xDyn ENDP
END