Системное и прикладное программное обеспечение — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Типы оградительных сооружений в морском порту: По расположению оградительных сооружений в плане различают волноломы, обе оконечности...

Системное и прикладное программное обеспечение

2023-01-01 32
Системное и прикладное программное обеспечение 0.00 из 5.00 0 оценок
Заказать работу

Системное и прикладное программное обеспечение

 

Цикл команды процессора.

Программа в компьютере реализуется центральным процессором (ЦП)
путем последовательного исполнения команд этой программы. Действия, требуемые для выборки (извлечения из оперативной памяти) и выполнения команды, называют циклом команды

Этапы цикла команды:

1) выборка команды (Instruction Fetch)

2) декодирование (Decode)

3) выполнение (Execute)

4) запись результата (Retire)

Этапы цикла команды:

1) выборка команды – процессор считывает команду из оперативной памяти или кэша по адресу, хранящемуся в специальном регистре – счетчике команд (IP – Instruction Pointer)

2) декодирование – считанная команда преобразуется в последовательность элементарных внутренних команд процессора – микроопераций

3) выполнение – происходят арифметические или логические операции над данными;

4) запись результата – полученный ответ записывается в оперативную память или кэш

 

Методы повышения производительности. Кэш-память. Конвейеризация. Суперскалярные процессоры.

Кэш-память - очень быстрое запоминающее устройство небольшого объема, которое используется при обмене данными между процессором и оперативной памятью для компенсации разницы в скорости обработки информации процессором и несколько менее быстродействующей оперативной памятью. Между основной памятью и процессором размещается небольшая, но быстродействующая буферная память. В кэш-память копируются те участки основной памяти, к которым происходит обращение процессора. Выигрыш достигается за счет принципа локальности. Принцип заключается в том, что при выполнении программы с высокой вероятностью адрес следующей команды либо следует непосредственно за адресом текущей команды, либо находится вблизи него.

Конвейеризация.

Идея конвейера (pipeline) –можно не дожидаться завершения выполнения одной команды, а сразу переходить к следующей. Команда состоит из этапов, и за каждый этап отвечает отдельный блок процессора, образующий ступень конвейера. Для увеличения эффективности конвейера каждый этап делят на несколько подэтапов (суперконвейеризация). При использовании конвейера могут возникать конфликты.

1) Несколько команд одновременно обращаются к одному ресурсу
(чаще всего к памяти).

2) Несколько команд обращаются к одной ячейке памяти в неверной последовательности.

3) неизвестно, какая команда будет выполняться после команды перехода.

Суперскалярные процессоры. В суперскалярных процессорах содержится несколько исполнительных блоков, работающих параллельно. Например, блоки целочисленной арифметики, арифметики с плавающей точкой, блоки чтения и записи из памяти. В таких процессорах обязателен
блок диспетчеризации (Scheduler), отвечающий за распределение команд по исполнительным блокам. Наличие нескольких функциональных блоков приводит к тому, что наибольшая скорость выполнения может достигаться при внеочередном исполнении операций (Out-of-Order Execution). Более поздние операции могут исполняться перед ранними, если не зависят от порождаемых ими результатов. Механизм внеочередного исполнения позволяет в значительной степени сгладить эффект от ожидания считывания данных из кэшей верхних уровней и из оперативной памяти, что может занимать десятки и сотни тактов.

 

Команды пересылки данных. Косвенная адресация памяти. Команды работы со стеком.

Команды пересылки данных.

Команда mov используется для копирования значения из одного места в другое. Это "место" может быть регистр, ячейка памяти или непосредственное значение. Синтаксис команды:

mov приемник, источник.

Команда mov производит копирование источника в назначение.

Команда lea используется для загрузки эффективного адреса. Команду lea еще иногда используют для получения адреса какой-либо процедуры.

lea приемник, источник.

Команда lea помещает адрес источника в назначение.

Отличие lea от mov состоит в том, что используется механизм блока адресации процессора, а не арифметико-логического блока.

Косвенная адресация памяти.

Косвенная адресация памяти, когда в определении адреса ячейки памяти участвует один или несколько регистров процессора. Рассмотрим последовательно эти режимы.

Регистровая косвенная (базовая и индексная). Адресуется память (байт или слово). Относительный адрес ячейки памяти находится в регистре, обозначение которого заключается в прямые скобки. В МП 86 косвенная адресация допустима только через регистры ВХ, ВР, SI и DI. При использовании регистров ВХ или ВР адресацию называют базовой, при использовании регистров SI или DI - индексной.

Команды работы со стеком.

Push источник – сохраняет информацию в стек.

Pop назначение – извлекает информацию из стека.

Pushadd – помещает в стек все основные регистры.

 

Команды работы с битами.

bsf результат,источник

Для проверки наличия единичных битов в операнде источник. Команду bsf используют при работе на битном уровне для определения позиции в операнде крайних справа единичных битов.

bsr результат,источник

Проверка наличия единичных битов в операнде источник. Команду bsr используют при работе на битном уровне для определения позиции крайних слева единичных битов.

bt источник,индекс

Извлечение значения заданного бита в флаг cf. Команду bt используют для определения значения конкретного бита в операнде источник.

btr источник,индекс

Извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.

bts источник,индекс

Извлечение значения заданного бита операнда в флаг cf и установка этого бита в единицу.

btc источник,индекс

Извлечение значения заданного бита в флаг cf и изменение его значения в операнде на обратное.

Логические команды.

and приемник,источник

Операция логического умножения для операндов приемник и источник размерностью байт, слово или двойное слово. Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда.

or приемник,маска

Операция логического ИЛИ над битами операнда назначения. Команду or можно использовать для работы с операндами на уровне битов. Типичное использование команды — установка определенных разрядов первого операнда в единицу.

xor приемник,источник

Операция логического исключающего ИЛИ над двумя операндами размерностью байт, слово или двойное слово. Команда xor используется для выполнения операции логического исключающего ИЛИ двух операндов. Результат операции помещается в первый операнд. Эту операцию удобно использовать для инвертирования или сравнения определенных битов операндов.

not источник

Инвертирование всех битов операнда источник. Команду not можно использовать для изменения байта, выполняющего роль некоторого флага, с целью отслеживания некоторых логических условий в программе.

Операции сдвига.

shl операнд,количество_сдвигов

Логический сдвиг операнда влево. Команда shl используется для сдвига разрядов операнда влево.

shr операнд,кол-во_сдвигов

Логический сдвиг операнда вправо. Команда shr используется для логического сдвига разрядов операнда вправо.

sal операнд,количество_сдвигов

Арифметический сдвиг операнда влево.

sar операнд,количество_сдвигов

Арифметический сдвиг операнда вправо.

 

Команды условного перехода.

Команды для работы с беззнаковыми числами: JA/JNBE – переход, если больше; JAE/JNB/JNC - переход, если больше или равно; JB/JNAE/JC - переход, если меньше; JBE/JNA - переход, если меньше или равно.

Команды для работы со знаковыми числами: JG/JNLE - переход, если больше; JGE/JNL - переход, если больше или равно; JL/JNGE - переход, если меньше; JLE/JNG - переход, если меньше или равно; JNS - переход, если больше нуля; JS - переход, если меньше нуля.

Команды, общие для знаковых и беззнаковых чисел: JE/JZ - переход, если равно переход, если ноль; JNE/JNZ - переход, если не равно переход, если не ноль.

 

Команды вызова процедур.

call цель

Передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата.

push источник

Размещение содержимого операнда источник в стеке.

pop приемник

Извлечение слова или двойного слова из стека.

ret ret число

Возврат управления из процедуры вызывающей программе.

Команды организации циклов.

loop метка

Организация цикла со счетчиком в регистре cx.

loope/loopz метка loopne/loopnz метка

Организация цикла со счетчиком в регистре cx с учетом флага zf.

 

Одномерные массивы.

Объявление массива на языке Си:

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

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

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

 

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

 

Команды обработки строк.

Команды обработки строк позволяют работать с последовательностью символов (байт) как с единым целым. В языке Си строка – последовательность символов, оканчивающаяся символом
с кодом ноль «\0». Нулевой символ не входит в строку. Для Ассемблера содержимое строки не имеет значения, главное – длина символа. Длина символа равна байту, слову или двойному слову.

Для обработки последовательности символов (байт, слов, двойных слов) используются команды-префиксы:

· REP – повторять, пока ECX ¹ 0

· REPE/REPZ – повторять, пока ECX ¹ 0 или пока ZF = 1

· REPNE/REPNZ – повторять, пока ECX ¹ 0 или пока ZF = 0

Адрес строки-источника находится в регистре ESI. Адрес строки-приемника находится в регистре EDI. В процессе выполнения строковых команд регистры ESI и EDI автоматически изменяются на длину символа строки в зависимости от флага направления (DF – Direction Flag).

Если DF = 0, то значения ESI и EDI увеличиваются (строка обрабатывается слева направо – в сторону больших адресов). Если DF = 1, то значения ESI и EDI уменьшаются (строка обрабатывается справа налево – в сторону меньших адресов). Флаг DF устанавливается и сбрасывается командами STD и CLD

Команды пересылки:

· MOVSB – копирование строки байтов

· MOVSW – копирование строки слов

· MOVSD – копирование строки двойных слов

Команды сравнения:

· CMPSB – сравнение строк байтов

· CMPSW – сравнение строк слов

· CMPSD – сравнение строк двойных слов

Команды поиска (сканирования):

· SCASB – сканирование строки байт (сравнение элементов строки с AL)

· SCASW – сканирование строки слов (регистр AX)

· SCASD – сканирование строки двойных слов (регистр EAX)

· Изменяется регистр EDI

Команды чтения из строки:

· LODSB – чтение байта из строки в AL

· LODSW – чтение слова из строки в AX

· LODSD – чтение двойного слова из строки в регистр EAX

· Изменяется регистр ESI

Команды записи в строку:

· STOSB – запись байта из регистра AL в элемент строки

· STOSW – запись слова из регистра AX в элемент строки

· STOSD – запись двойного слова из регистра EAX в элемент строки

· Изменяется регистр EDI

 

BOOL WriteConsole (

HANDLE hConsoleOutput,; дескриптор выходного буфера консоли

const VOID * lpBuffer,; адрес строки для вывода на консоль

DWORD nNumberOfCharsToWrite,; длина строки

LPDWORD lpNumberOfCharsWritten,; адрес переменной, куда будет помещено количество действительно выведенных символов

LPVOID lpReserved); зарезервировано, нужно 0

Для завершения приложения используется функция ExitProcess:

VOID ExitProcess(UINT uExitCode)

Для создания консоли из процесса можно воспользоваться двумя способами:

1) функция AllocConsole (без аргументов)

2) функция CreateProcess с параметром CREATE_NEW_CONSOLE

При завершении программы консоль автоматически освобождается.

Установку позиции курсора осуществляет функция SetConsoleCursorPosition:

BOOL SetConsoleTitle (

LPCTSTR lpConsoleTitle);

где lpConsoleTitle – адрес строки, оканчивающейся на ноль (в OEM-кодировке).

Всего консольных функций около 60

При правильном их завершении возвращается ненулевое значение

В случае ошибки в EAX помещается ноль

Отладку консольных приложений можно осуществлять в дизассемблерах (W32Dasm, OllyDbg)

 

Регистрация класса окон

Прежде чем создавать окно, должен быть зарегистрирован класс окон. Окно затем создается как экземпляр данного класса.

Для регистрации используется API-функция RegisterClass, с одним параметром – адресом структуры, имеющей тип WNDCLASS:

ATOM RegisterClass(

    CONST WNDCLASS * lpWndClass

);

typedef struct _WNDCLASS {

UINT style;

WNDPROC lpfnWndProc;

int cbClsExtra;

int cbWndExtra;

HANDLE hInstance;

HICON hIcon;

HCURSOR hCursor;

HBRUSH hbrBackground;

LPCTSTR lpszMenuName;

LPCTSTR lpszClassName;

} WNDCLASS;

Style – стиль окна:перерисовывать окно при перемещении,деактивировать кнопку «Закрыть»,эффекты Windows XP и др.

lpfnWndProc – адрес процедуры обработки сообщений окна. Для всех окон данного класса объявляется одна процедура окна.Каждое окно при создании имеет собственный дескриптор. Часто для каждого окна создают свой класс.

cbClsExtra – количество дополнительных байт для класса. Должен быть равен нулю.

cbWndExtra – количество дополнительных байт для окна. Должен быть равен нулю.

hInstance – дескриптор приложения, которое содержит процедуру для данного класса.

hIcon – дескриптор пиктограммы окна. Если ноль, то по умолчанию.

hCursor – дескриптор курсора мыши. Если ноль, то по умолчанию.

hbrBackground – цвет окна.

lpszMenuName – имя ресурса, содержащего меню.

lpszClassName – адрес строки, содержащей имя класса.

 

HWND CreateWindow(

    LPCTSTR lpClassName,

    LPCTSTR lpWindowName,

    DWORD dwStyle,

    int x,

    int y,

    int nWidth,

    int nHeight,

    HWND hWndParent,

    HMENU hMenu,

    HINSTANCE hInstance,(=0)

    LPVOID lpParam

);

lpClassName – адрес строки, содержащей имя класса, который ранее был успешно зарегистрирован с помощью функции RegisterClass.

lpWindowName – адрес строки, где содержится имя создаваемого окна (отображается в заголовке).

dwStyle – стиль окна:

· WS_MAXIMIZE – развернутое окно

· WS_MINIMIZE – свернутое окно

· WS_CAPTION – есть заголовок

· WS_DISABLED – недоступное окно

· WS_SIZEBOX – окно с изменяемыми размерами

· WS_VISIBLE – видимое окно

x, y – координаты левого верхнего угла.

nWidth, nHeight – ширина и высота окна.

hWndParent – дескриптор родительского окна. Для главного окна = 0.

hMenu – дескриптор меню. Обычно равен нулю.

hInstance – дескриптор модуля, который ассоциирован с этим окном. В Windows NT/2000/XP игнорируется.

lpParam – адрес переменной, которая будет передана в окно.

Каждое окно имеет процедуру окна (window procedure) – функцию, которая обрабатывает все сообщения, передаваемые всем окнам данного класса. Процедура окна начинает работать сразу после создания окна.

Процедура окна должна иметь 4 параметра:

LRESULT CALLBACK WindowProc(     HWND hwnd,

    UINT uMsg,

    WPARAM wParam,

    LPARAM lParam

);

Hwnd – дескриптор окна (процедура одна на целый класс окон).

uMsg – число – идентификатор сообщения.

wParam, lParam – дополнительные параметры.

Если процедура окна не обрабатывает какие-то сообщения, их должна обрабатывать системная процедура DefWindowProc с теми же параметрами. Процедура окна возвращает ноль, если сообщение обработано и значение, возвращаемое DefWindowProc, в противном случае.

 

BOOL GetMessage(

LPMSG lpMsg,

HWND hWnd,

UINT wMsgFilterMin,

UINT wMsgFilterMax

);

lpMsg – адрес сообщения (структура MSG).

hWnd – дескриптор окна, сообщения которого должны быть получены

если ноль, то получаются все сообщения данного приложения.

wMsgFilterMin, wMsgFilterMax нижняя и верхняя граница получаемых сообщений. Если ноль, то получаются все сообщения. Можно использовать константы WM_KEYFIRST / WM_KEYLAST и WM_MOUSEFIRST / WM_MOUSELAST для получения сообщений только клавиатуры и мыши.

Возвращаемое функцией значение: при получении сообщения функция возвращает положительное число;

если сообщение WM_QUIT, то функция возвращает 0;

в случае ошибки функция возвращает–1.

Для передачи сообщения соответствующей процедуре окна используется функция DispatchMessage:

LRESULT DispatchMessage(     const MSG *lpmsg

);

Lpmsg – указатель на структуру MSG, содержащую сообщение. Возвращаемое функцией значение обычно игнорируется.

Функция TranslateMessage переводит сообщения с виртуальными кодами нажатых клавиш в символьные сообщения с ASCII-кодами.

Символьное сообщение помещается в очередь сообщений и его можно будет прочитать функциями GetMessage или PeekMessage.

BOOL TranslateMessage(

    const MSG *lpMsg

);

lpMsg – указатель на структуру MSG, содержащую сообщение.

Соответствие между событиями, на входе и выходе TranslateMessage:

WM_KEYDOWN – WM_CHAR клавиша нажата.

WM_KEYUP – WM_DEADCHAR клавиша отпущена.

WM_SYSKEYDOWN – WM_SYSCHAR системная клавиша нажата (Alt + клавиша, F10).

WM_SYSKEYUP – WM_SYSDEADCHAR системная клавиша отпущена.

 

Способы измерения времени. Применение рекурсии. Примеры.

3 способа получения текущего времени в C:

§ Функция clock()

clock_t clock(void); (< time.h >)

§ API функции

В процессоре есть спец. датчик, который отсчитывает такты, начиная с некоторого момента. Можно запрашивать значение этого датчика – команда rdtsc.

§ Ассемблерные вставки

clock_t start, finish;

double d;

unsigned long i = 6000000;

start = clock();

while (i--);

finish = clock();

d = (double)(finish - start)/CLOCKS_PER_SEC;

printf("%2.1lf seconds\n", d);

Под рекурсией понимается метод программирования, связанный с последовательным разбиением задачи на подзадачи меньшего размера до тех пор, пока подзадачи не станут элементарными. Если функция вызывает себя непосредственно – прямая рекурсия. Если функция вызывает себя через другую функцию – косвенная рекурсия.

Задача: нужно выкопать траншею. Обычный порядок мысли: последовательно копаем от начала до конца. Рекурсивный порядок мысли: сначала копаем левую половину, потом правую. При этом при раскопках левой половины вновь копаем ее левую половину, потом правую...

 

Системное и прикладное программное обеспечение

 

Цикл команды процессора.

Программа в компьютере реализуется центральным процессором (ЦП)
путем последовательного исполнения команд этой программы. Действия, требуемые для выборки (извлечения из оперативной памяти) и выполнения команды, называют циклом команды

Этапы цикла команды:

1) выборка команды (Instruction Fetch)

2) декодирование (Decode)

3) выполнение (Execute)

4) запись результата (Retire)

Этапы цикла команды:

1) выборка команды – процессор считывает команду из оперативной памяти или кэша по адресу, хранящемуся в специальном регистре – счетчике команд (IP – Instruction Pointer)

2) декодирование – считанная команда преобразуется в последовательность элементарных внутренних команд процессора – микроопераций

3) выполнение – происходят арифметические или логические операции над данными;

4) запись результата – полученный ответ записывается в оперативную память или кэш

 


Поделиться с друзьями:

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.243 с.