Найти тему
Реверс игры

Компоненты компьютера

Оглавление

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

  • Жесткий диск
  • БАРАН
  • Видеокарта
  • Материнская плата
  • Процессор

Если снять боковую часть настольного компьютера, то детали можно расположить следующим образом:

Для наших целей мы кратко рассмотрим только первые четыре компонента, а затем в следующем разделе сосредоточимся на ЦП:

  • Жесткие диски отвечают за хранение больших файлов, таких как фотографии, исполняемые файлы или системные файлы.
  • ОЗУ хранит данные, к которым необходимо быстро получить доступ. Данные загружаются в ОЗУ с жесткого диска.
  • Видеокарты отвечают за вывод графики на монитор.
  • Материнские платы связывают все эти компоненты воедино и позволяют им взаимодействовать.

ЦП

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

-2

Инструкции

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

  • Сложить два числа
  • Вычесть два числа
  • Сравните два числа
  • Переместить число в раздел памяти (ОЗУ)
  • Перейти к другому разделу кода

Компьютерные программы разрабатываются из этих простых инструкций, объединенных вместе. Например, простой калькулятор может выглядеть так:

mov eax, 5
mov ebx, 4
add eax, ebx

Первая инструкция ( mov ) перемещает значение 5 в регистр eax . Вторая инструкция перемещает значение 4 в регистр ebx . Затем инструкция add складывает eax и ebx и помещает результат обратно в eax .

Компьютерные программы

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

Например, одна простая программа может взять число в качестве входных данных, увеличить число на 1, а затем переместить его в выход. Это может выглядеть так:

mov eax, input
add eax, 1
mov output, eax

Более сложная программа будет иметь много таких простых программ «внутри» себя. В этом контексте эти простые внутренние программы называются функциями. Функции, как и программы, принимают входные данные и производят выходные данные. Например, мы могли бы сделать нашу предыдущую программу функцией, которая делает то же самое. Это может выглядеть так:

function add(input):
mov eax, input
add eax, 1
mov output, eax

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

function subtract(input):
mov eax, input
sub eax, 1
mov output, eax

Эти две функции ( сложение и вычитание ) затем можно использовать для создания более сложной программы. Эта новая программа будет брать число и либо увеличивать, либо уменьшать его. Она будет принимать два ввода:

  1. Число
  2. Математическая операция, в данном случае сложение (+) или вычитание (-)

Эта новая программа будет длиннее и будет иметь два разных способа выполнения. Они будут объяснены после кода:

function add(input):
mov eax, input
add eax, 1
mov output, eax

function subtract(input):
mov eax, input
sub eax, 1
mov output, eax

cmp operation, '-'
je subtract_number
add(number)
exit

subtract_number:
subtract(number)
exit

Этот код имеет две функции вверху. Как мы уже обсуждали, они принимают входные данные, а затем либо прибавляют, либо вычитают 1 из входных данных, чтобы получить выходные данные. Инструкция cmp сравнивает два значения. В этом случае она сравнивает тип операции, полученный в качестве входных данных, и значение, закодированное в программе, - . Если эти значения равны, мы переходим к другому разделу кода ( je = jump if equal).

Если операция равна - , переходим к коду, который вычитает из числа 1. В противном случае продолжаем программу и прибавляем 1 к числу перед выходом.

Сравнение чисел и переход к другому коду в зависимости от их значения называется ветвлением. Ветвление является ключевым компонентом проектирования сложных программ, которые могут реагировать на различные входные данные. Например, в игре часто будет ветвление для каждого направления, в котором может двигаться игрок.

Двоичные, десятичные и шестнадцатеричные

По сути, ЦП — это схемы. Схемы либо имеют электрический ток, протекающий через них (включены), либо нет (выключены). Эти два состояния могут быть представлены двоичной (или 2-ричной) системой счисления. В 2-ричной системе у вас есть два возможных значения: 0 и 1. Пример двоичного числа — 1101.

Мы знакомы с десятичной (или десятичной) системой счисления, которая имеет 10 возможных значений: 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Пример десятичного числа — 126. Это число можно представить в более явном формате следующим образом:

(1∗102)+(2∗101)+(6∗100)

Мы можем представить двоичное число выше (1101) в том же формате. Однако мы заменим десятки на двойки, поскольку мы переходим от десятичной к двоичной системе:

(1∗23)+(1∗22)+(0∗21)+(1∗20)

Двоичные числа могут быстро стать громоздкими, когда им нужно представлять большие значения. Например, двоичное представление десятичного числа 250 — 11111010.

Для представления этих больших двоичных чисел в вычислениях обычно используются шестнадцатеричные числа (основание 16). Шестнадцатеричные числа обычно имеют префикс идентификатора 0xи имеют шестнадцать возможных значений: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E и F. Пример шестнадцатеричного числа: 0xA1D.

Языки программирования

Инструкции представлены в виде чисел, как и все другие данные на компьютере. Эти числа известны как коды операций, часто сокращаемые до опкодов. Опкоды различаются в зависимости от архитектуры. ЦП знает каждый опкод и что ему нужно сделать при встрече с каждым из них. Опкоды обычно представлены в шестнадцатеричном формате. Например, если ЦП Intel встречает 0xE9, он знает, что ему нужно выполнить инструкцию jmp (переход).

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

Для улучшения опыта разработки было разработано несколько языков более высокого уровня, таких как FORTRAN, C и C++. Эти языки легко читаются и вводят операции управления потоком, такие как условные операторы if и else *. Например, ниже приведена наша программа инкремента/декремента на языке C. В языке C int относится к целому числу или целому числу (-1, 0, 1 или 2 являются примерами).

int add(int input) {
return input + 1;
}

int subtract(int input) {
return input - 1;
}

if(operation == '-') {
subtract(number);
}
else {
add(number);
}

Все эти языки более высокого уровня компилируются в ассемблер. Затем традиционный ассемблер превращает этот ассемблер в коды операций, которые может понять ЦП.

Операционные системы

Написание программ для взаимодействия с оборудованием — это трудоемкий и сложный процесс. Чтобы выполнить нашу программу увеличения/уменьшения, нам также пришлось бы написать код для обработки нажатий клавиш с клавиатуры, отображения графики на мониторе, построения наборов символов, чтобы мы могли представлять буквы и цифры, и взаимодействовать с оперативной памятью и жестким диском. Чтобы упростить разработку программ, были созданы операционные системы. Они содержат код, который уже может обрабатывать эти аппаратные функции. Они также имеют несколько стандартных функций, которые обычно используются, например, копирование данных из одного места в другое.

Три основные операционные системы, которые используются сегодня, — это Windows, Linux и MacOS. Все они имеют разные библиотеки и методы взаимодействия с оборудованием. Вот почему программы, написанные для Windows, не работают в Linux.

Приложения

Операционным системам нужен способ определить, как обрабатывать данные, когда их выбирает пользователь. Если данные представляют собой фотографию, операционная система хочет вызвать определенное приложение (например, Paint) для просмотра фотографии. Аналогично, если данные представляют собой само приложение, операционная система должна передать их в ЦП для выполнения.

Каждая операционная система обрабатывает выполнение уникально. В Linux для обычного файла устанавливается специальное разрешение на выполнение. В Windows приложения форматируются особым образом, который Windows знает, как анализировать. Это называется форматом PE или Portable Executable. Формат PE имеет несколько разделов, таких как раздел .text для хранения программного кода и раздел .data для хранения переменных.

Игры

Разобравшись со всем этим, мы наконец можем обсудить игры. Игры — это просто приложения. В Windows они отформатированы в формате PE, идентичном любому другому приложению. Они содержат раздел .text , который содержит программный код, состоящий из кодов операций. Эти коды операций затем выполняются центральным процессором, а операционная система отображает полученную графику и обрабатывает ввод, например, нажатия клавиш.