Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Всі відповіді СП.docx
Скачиваний:
10
Добавлен:
28.01.2023
Размер:
217.28 Кб
Скачать
    1. Обґрунтувати алгоритм та представити програмний код для реалізації програми, що сумує з 0 по 3 біт першого числа та з 3 по 6 біт другого числа.

Спочатку виконаємо побітове «і» з байтами вигляду 11100000 і 00011100 з наданими числами, це дозволить, потім отримані значення передамо у функцію яка реалізує повний циклічний суматор, тобто у програмі використано рівняння повного суматора.

#include <iostream>

using namespace std;

bool sumator(bool a, bool b, bool cIn, bool* cOut)

{

*cOut = (a & b) | ((a ^ b) & cIn);

return (a ^ b) ^ cIn;

}

char sum(char a, char b)

{

bool perenos = 0;

char result = 0;

for (int i = 0; i < 7; i++)

{

if (sumator((a >> i) & 1, (b >> i) & 1, perenos, &perenos))

{

result = result | (1 << i);

}

}

return result;

}

int main()

{

char a = 10;

char b = 14;

char c = a & 0b00000111;

char d = b & 0b00111000;

char r = sum(c, d);

return 0;

}

    1. Обгрунтувати алгоритм та представити програмний код для реалізації заповнення рядку випадковими значеннями (від -50 до 50) і розробити функцію, що виконує таку обробку символьного рядку: підрахувати кількість сусідніх елементів з однаковими значеннями. При реалізації забороняється користуватися функціями бібліотек мови С++(код мовою С++)

Для генерації випадкових чисел використано трохи змінений метод відрахувань, що реалізовано в функції int get_rand(). Суть методу полягає у наступному: візьмемо дробове число а, з довгою дробовою частиною, помножимо на велике ціле число М, в результаті отримаємо цифру - ціле плюс дрібна частина. Цілу частину результату відкинемо, а дробову візьмемо в якості наступного числа. Проте наша функція буде повертати саме відкинуту цілу частину, яка теж є статистично випадковою величною. Слід зауважити, що цей метод повертає псевдо випадкові числа. Функція для обрахунку однакових елементів є досить простою – параметрами є вказівник на масив та його розмір, потім у циклі за умовою однакових сусідніх елементів відбувається інкрементація лічильника, що підраховує кількість однакових елементів, що і повертає функція.

#include <iostream>

#include <vector>

using namespace std;

static double A0 = 0.00000014;

int N = 50;

int M = 16807;

vector <int> random_number;

int get_rand()

{

double temp = A0 * M;

A0 = temp - (int)temp;

return temp;

}

int calc_indentektive(char* str, int len)

{

int val = 0;

for (int i = 0; i < len - 1; i++)

{

if (str[i] == str[i+1])

{

val++;

}

}

return val;

}

int main()

{

for (int i = 0; i < 50; i++)

{

random_number.push_back((get_rand()%100)-50);

}

char str[23] = "12345678900987654321";

cout << calc_indentektive(str,20);

}

    1. Розкрийте поняття програмна модель мікропроцесора.

Програмна модель мікропроцесора  це незалежна від конструктивної реалізації сукупність його регістрів та оперативна пам'ять до якої мають доступ прикладні програми.

Відповідно включає:

  • - регістри;

  • - ділянки памяті (сегменти).

Регістр МП - надшвидка оперативна пам'ять всередині процесора, призначена для зберігання проміжних результатів обчислення, або розміщення даних необхідних для роботи процесора.

Регістри МП можна розділити на дві великі групи: - користувацькі регістри; - системні регістри.

Користувацькі регістри:

  • 1. Регістри загального призначення(цілочисельні).

  • 2. Сегментні регістри.

  • 3. Регістри стану та управління.

  • 4. Регістри математичного співпроцесора та мультимедійного розширення (ММХ).

  • 5. Регістри  потокового розширення процесора (SSE)

Програмна модель процесора 8086:

Група регістрів загального призначення, що називають також регістрами даних, утворена регістрами АХ, ВХ, СХ і DХ. Кожний з цих 16-бітних регістрів можна використовувати як два 8-бітних регістри: AL, АН, BL, BH, CL, CH, DL і DH. В цій групі регістрів L і Н означають молодші і старші байти відповідних 16-бітових регістрів. Регістри АХ, ВХ, СХ і DХ призначені в основному для збереження даних, однак існує багато команд, які використовують регістри даних на певні функції (табл. 5). Тільки регістри даних можуть використовуватися і як 16-бітні, і як 8-бітні. Усі регістри інших груп – 16-бітові.

Друга група регістрів, які називаються вказівними й індексними регістрами, представлена адресними регістрами SP, BP, SI і DI. Вони призначені для збереження 16-бітних адрес (внутрішньосегментних зміщень) і забезпечують при цьому непряму адресацію та динамічне обчислення ефективної адреси пам'яті. Гнучкість обчислень досягається тим, що ці регістри можуть брати участь в арифметичних і логічних операціях так само, як і регістри попередньої групи. Тому надалі регістри даних і регістри вказівної й індексної груп називаються загальними регістрами.

Вказівні регістри SP і BP призначені для спрощення доступу до даних, що знаходиться в поточному сегменті стека, а не в сегменті даних. Індексні регістри SI і DI містять зміщення, що за замовчуванням відносяться до поточного сегмента даних.

Третю групу регістрів утворюють сегментні регістри CS, DS, SS, ES.

В мікропроцесорі за допомогою 20-бітної фізичної адреси можна адресувати пам'ять обсягом 1 Мбайт. Цей простір пам'яті розділений на логічні сегменти обсягом 64 Кбайт. При виконанні програми можна одночасно звертатися до чотирьох сегментів. Їх базові (початкові) адреси розташовані в сегментних регістрах CS, DS, SS, ES.

Регістр сегмента команд CS (code segment) вказує на поточний сегмент коду (програми), звідки вибираються команди.