Если разрядность процессора равна 64 то его регистр имеет размер

Обновлено: 04.07.2024

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

Часто, читая описания ЦП, можно встретить обозначение x86 — это значит, что мы имеем дело с 32 битной архитектурой. Если же встречается надпись х64 – то можно сказать, что данный ЦП обладает битностью, равной 64.

Важно! Часто битность ЦП ошибочно принимается за основу при определении максимального объёма памяти, к которому он может обращаться. Это, естественно, не так. Шины адреса и данных практически любого ЦП имеют разную битность и никак не влияют друг на друга.

Значение битности ЦП играет не последнюю роль для пользователей, поскольку битности операционной системы (ОС) и процессора, которые используются друг с другом, должны совпадать. Однако, здесь работает принцип обратной совместимости: на 64 разрядный ЦП может быть установлена операционная система как 32 так и 64 разрядная.

Версия операционной системы в данном случае не играет роли: например, все ОС Windows или Linux, уже начиная с появления первых 64 разрядных ЦП имеют как 32 битные так и 64 битные сборки. То есть, существуют все версии Windows (от XP до 10-й), имеющие как 64 так и 32 битную среду.

Важно! Установить на ЦП семейств х86 ОС, в названии которой фигурирует «х64» невозможно! Мало того, невозможно запускать исполняемые файлы для 64 битных ЦП на 32 битных ОС.

Именно поэтому определение того, какие именно (32 или 64 разрядные) данные используются ЦП весьма важно. Часто от этого зависит работоспособность достаточно больших групп пользователей, использующих одинаковое программное обеспечение.

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

Версия операционной системы в данном случае не играет роли: например, все ОС Windows или Linux, уже начиная с появления первых 64 разрядных ЦП имеют как 32 битные так и 64 битные сборки. То есть, существуют все версии Windows (от XP до 10-й), имеющие как 64 так и 32 битную среду.

Важно! Установить на ЦП семейств х86 ОС, в названии которой фигурирует «х64» невозможно! Мало того, невозможно запускать исполняемые файлы для 64 битных ЦП на 32 битных ОС.

Именно поэтому определение того, какие именно (32 или 64 разрядные) данные используются ЦП весьма важно. Часто от этого зависит работоспособность достаточно больших групп пользователей, использующих одинаковое программное обеспечение.

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

Откроется консоль командного процессора. В ней следует ввести команду «systeminfo». Результатом её выполнения будет длинный перечень параметров системы. Интересующий нас пункт называется «Процессор(ы):» В нём будет написано название модели ЦП. И обязательно указана его битность (либо цифрами 32 или 64, либо надписями «х86» или «х64»).

Через свойства компьютера

Можно определить, какую разрядность поддерживает процессор, посмотрев свойства системы.

Один из способов сделать это – войти в параметр «Система» панели управления и там, в разделе «Тип системы» можно будет увидеть её разрядность. Если она равна 64, то и ЦП тоже 64 битный.

Однако, как уже было сказано ранее, поскольку на 64 разрядный ЦП может быть поставлена 32 разрядная система, необходимо будет уточнить тип используемого ЦП. Для этого следует зайти в «Диспетчер устройств», ссылка на который есть на той же странице, в «Устройствах» выбрать ЦП и открыть в его свойствах вкладку «Сведения».

В этой вкладке интересующий нас параметр называется «ИД оборудования». В нём будет указан тип используемого процессора – 64 или 32 разрядный.

Альтернативой является исследование свойств устройства, называемого в Диспетчере устройств «Компьютер». В нём может содержаться описание применяемого типа ПК с указанием его битности.

Аналогично свойствам процессора, следует зайти в свойства компьютера и во вкладке «Сведения» посмотреть описание устройства. Параметр может также называться «Выводимое имя». В любом случае, в нём будет присутствовать либо надпись «х86», либо «х64», что и будет соответствовать битности используемого ЦП в 32 или 64 соответственно.

Узнать разрядность через интернет

Для этого достаточно набрать в строке поиска фразу «узнать разрядность онлайн». Первые 5-10 результатов поиска дадут ссылки на сайты, определяющие этот параметр. После этого следует перейти на этот сайт и активный контент автоматически опознает количество разрядов ЦП и версию ОС.

Важно! Исполнение активных компонентов может быть заблокировано браузером и в этом случае определить интересующий параметр не получится. Для этого следует разрешить выполнение активного содержимого на странице.

Через BIOS

Самый простой способ, не требующий наличия программного обеспечения вообще. При загрузке ПК следует войти в BIOS, нажав F2 или Del. Далее следует выбрать раздел «System Settings», «Main» или «CPU Settings» – в зависимости от производителя BIOS он может называться по-разному, и посмотреть значение параметра «Processor Type». В нём будет указана фирма производитель, модель ЦП, его частота и разрядность.

Таблица 3-2. Адресные регистры общего назначения

В 64-битном режиме существуют ограничения на доступ к байтовым регистрам. Инструкция не может ссылаться на устаревшие высокие байты (например: AH, BH, CH, DH) и один из новых байтовых регистров одновременно (например: младший байт регистра RAX). Однако инструкции могут ссылаться на старые байты с низким байтом (например: AL, BL, CL или DL) и новые байтовые регистры одновременно (например: младший байт регистра R8 или RBP). Архитектура применяет это ограничение, изменяя высокобайтовые ссылки (AH, BH, CH, DH) на ссылки с низким байтом (BPL, SPL, DIL, SIL: низкие 8 бит для RBP, RSP, RDI и RSI) для инструкций с использованием Префикс REX.

Когда в 64-битном режиме размер операнда определяет количество действительных битов в целевом регистре общего назначения:

• 64-разрядные операнды генерируют 64-битный результат в целевом регистре общего назначения.

• 32-разрядные операнды генерируют 32-битный результат с нулевым расширением до 64-битного результата в целевом регистре общего назначения.

Поскольку верхние 32 бита 64-разрядных регистров общего назначения не определены в 32-битных режимах, верхние 32 бита любого универсального регистра не сохраняются при переходе из 64-разрядного режима в 32-разрядный (для защищенного режим или режим совместимости). Программное обеспечение не должно зависеть от этих битов для поддержания значения после переключения с 64-битного до 32-битного режима

3.4.2 Регистры сегментов

Регистры сегментов (CS, DS, SS, ES, FS и GS) содержат 16-битные сегментные селектора. Селектор сегмента - это специальный указатель, который идентифицирует сегмент в памяти. Для доступа к определенному сегменту в памяти селектор сегмента для этого сегмента должен присутствовать в соответствующем регистре сегментов.

При написании кода приложения программисты обычно создают селектор сегментов с ассемблерными директивами и символами. Затем ассемблер и другие инструменты создают фактические значения селектора сегментов, связанные с этими директивами и символами. При написании системного кода программистам может потребоваться создать селектор сегментов напрямую. См. Главу 3 «Управление памятью с защищенным режимом» в Руководстве разработчика программного обеспечения Intel® 64 и IA-32, том 3A.

Использование сегментных регистров зависит от типа модели управления памятью, которую использует операционная система или исполнительная власть. При использовании плоской (несегментированной) модели памяти регистры сегментов загружаются селекторами сегментов, которые указывают на перекрывающиеся сегменты, каждый из которых начинается с адреса 0 линейного адресного пространства (см. Рис. 3-6). Эти перекрывающиеся сегменты затем содержат линейное адресное пространство для программы. Как правило, определяются два перекрывающихся сегмента: один для кода и другой для данных и стеков. Регистр сегмента CS указывает на сегмент кода, а все остальные регистры сегментов указывают на сегмент данных и стека.




При использовании сегментированной модели памяти каждый сегментный регистр обычно загружается с помощью другого селектора сегментов, так что каждый сегментный регистр указывает на другой сегмент в линейном адресном пространстве (см. Рис. 3-7). В любой момент программа может, таким образом, получить доступ к шести сегментам в линейном адресном пространстве. Для доступа к сегменту, на который не указывает один из сегментных регистров, программа должна сначала загрузить селектор сегмента для сегмента, к которому нужно получить доступ в регистре сегментов.

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

Регистры DS, ES, FS и GS указывают на четыре сегмента данных. Доступность четырех сегментов данных обеспечивает эффективный и безопасный доступ к различным типам структур данных. Например, могут быть созданы четыре отдельных сегмента данных: один для структур данных текущего модуля, другой для данных, экспортированных из модуля более высокого уровня, третий для динамически созданной структуры данных и четвертый для данных, совместно используемых с другим программа. Для доступа к дополнительным сегментам данных прикладная программа должна загружать сегментные селектора для этих сегментов в регистры DS, ES, FS и GS, если это необходимо.

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

См. Раздел 3.3 «Организация памяти» для обзора того, как регистры сегментов используются в режиме реального адреса.

Четыре сегмента регистров CS, DS, SS и ES такие же, как регистры сегментов, найденные в процессорах Intel 8086 и Intel 286, а регистры FS и GS были введены в архитектуру IA-32 с семейством процессоров Intel386 ™.

Изучаю архитектуру компьютера по книгам Танненбаума и Харрис.

И все равно не понимаю многих вроде бы простых вещей. Вопросов много, но почти все они так или иначе связаны с машинным словом. Это самая непонятная для меня тема.

Хочу оговориться, что я понимаю, что между разрядностью процессора, разрядностью регистров, размером адресуемой памяти и быстродействием компьютера существует прямая связь. Я не понимаю почему так.

    Как рязрядность процессора влияет на его быстродействие. Вроде как 64-разрядные быстрее чем 32-разрядные. Но почему? Не понимаю. Приведу пример: Система команд для процессоров MIPS-32. Там ведь сама архитектура команд такая, что все команды убираются в 32 бита. То есть, если сделать 64 бита, старшие 32 бита придется просто заполнить нулями. И что, процессор станет от этого быстрее?

разрядность процессора (разрядность его машинного слова). Машинное слово — машинно-зависимая и платформозависимая величина, измеряемая в битах или байтах (тритах или трайтах), равная разрядности регистров.

Почему машинное слово обязательно должно быть равно разрядности регистров? Почему мы не можем читать данные по 64 бита за раз имея 16-разрядные регистры, например?

Теперь про память. Снова из Википедии:

64-битный регистр способен хранить в себе одно из 264 = 18 446 744 073 709 551 616 значений. Процессор с 64-битной адресацией памяти может напрямую обращаться к 16 ЭБ памяти.

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

И вот тут вопрос скорее исторический, но так же очень важный для меня. Я всегда считал что 64-разрядный процессор появился недавно и это преподносилось как большой прорыв. А на Википедии вот что написано:

Требования к точности научных вычислений возросли, и в 1974 году появилась первая машина с 64-битным словом — суперкомпьютер Cray-1

2,027 1 1 золотой знак 21 21 серебряный знак 39 39 бронзовых знаков


2,738 2 2 золотых знака 15 15 серебряных знаков 34 34 бронзовых знака Честно говоря, так глубоко не залезал, но по пятому - архитектура предполагает не только саму разрядность процессора, но и кучу сопутствующей инфраструктуры (например, те же SSE или произвольный порядок выполнения инструкций), которые играют немаловажную роль в быстродействии процессора.

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

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

В: Почему мы не можем читать данные по 64 бита за раз имея 16-разрядные регистры

Можем, но куда читать и зачем ? Вообще современные процессоры так и делают, заполняют внутренний кеш и оперируют при этом разрядностью шины, регистры тут не участвуют. Прочитали мы 64 бита в кеш, а теперь нам надо их умножить на 3, например. А регистр у нас 16 битный, как умножать ? Правильно, частями, применяя кучу дополнительных преобразований и тратя на это драгоценные такты. Поэтому размерность шины передачи вторична. Главное - это разрядность регистра. И это назвали машинным словом.

В: Но разве обязательно хранить адреса в регистрах?

Да, обязательно. Процессору как то надо сказать - возьми вот там данные. А там это где ? В памяти ? А как тогда будет выглядеть инструкция - возьми адрес, находящийся по адресу, вон по тому адресу лежащему в инструкции . А если нам надо работать подряд с блоком данных (мы в цикле обрабатываем массив) и этот адрес надо увеличивать (т.е. выполнять сложение, которое мы можем произвести только в регистре)

Кстати, разрядность команды и разрядность процессора разные вещи. В MIPS упаковали все команды в 32 бита. А x86 платформа с незапамятных времен была с переменной разрядностью операций. от коротких однобайтных, до длиннющих монстров с кучей префиксов. Разрядность процессора = разрядность регистра = максимальный размер обрабатываемой одной инструкцией информации (в обычных командах, из которых состоит основной код, всякие SSE не берем).

Быстродействие - кто сказал, что разрядность играет ключевую роль. Да, разрядность влияет. Бум на 64 битные процессоры и ОС отличный пример маркетинга. 64 битный код часто оказывается медленнее 32 битного. Если программе не надо адресовать более 4 Гб памяти, а ее код хранит 64 битные адреса - то размер программы в 2 раза больше. Больше размер - дольше читать в кеш. Требуется больше памяти. Начинается гонка за гигабайтами оперативки . Сейчас даже пошел обратный процесс. во всю развивается x32 ABI - работа 32 битного кода в 64 битном режиме.

Но давайте возьмем RSA-шифрование, которое используется в том же повсеместном SSL. Для него необходимы сложные расчеты с очень большими числами. Предположим, что у нас нет специализированных инструкций процессора для него. Разумеется если процессор оперирует 64 битными регистрами он выполнит расчет в 2 раза быстрее, просто потому, что за один такт он способен обработать в 2 раза больше информации. Да, на расчетных задачах с большими числами выигрыш от увеличения разрядности сложно переоценить.

В: 64-разрядная ОС работает на 64-разрядном процессоре, 32-разрядная - на 32-разрядном.

Нет, 64 битная ОС состоит из 64 битного кода, способного адресовать память 64 битными адресами. Конечно она может это делать только на 64 битном процессоре. Появление ОС конечно было неизбежно. Хотя и тут маркетинг сыграл значительную роль. 90% разбирающего в компах народа считают, что для адресации свыше 4 Гб оперативной памяти на платформе intel нужна 64 Бит ОС. Да, в Windows было насильно введено такое ограничение. Процессоры Intel в 32 битном режиме PAE адресуют до 64 Гб оперативки, при этом правда один процесс ограничен 4 Гб. 32 Бит linux отлично себя чувствует с такими объемами.

По поводу истории и сложности построения 128 битных регистров . вопрос только в цене. Да, на каких то системах не массового рынка это сделано давно, на массовом рынке было не нужно, вот и не появлялось. И тогда оно стоило баснословно, ибо как мы говорили в начале - каждый бит регистра - это куча исполняющих устройств, а при тех технологиях производства разместить на кристалле столько транзисторов было, скажем так, затруднительно. Полноценные 128 битные процессоры попросту не нужны, особенно для массового рынка, адресовать больше 64 ЭБ памяти, где бы ее еще найти. Вообще сейчас во всех процессорах intel есть 16 регистров SSE размером 128 бит, это не регистры общего назначения, они для расчетов. А на современных Xeon, предназначенных для серьезных вычислений, 32 регистра ZMM по 512 бит (см. AVX).

2.1. Процессор.

Самый основной элемент компьютера, это, конечно, процессор. Давайте подробней его рассмотрим. Упрощённая структура процессора (рис. 4):


Рис. 4. Упрощённая структура процессора

Основные элементы процессора:

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

· Арифметико-логическое устройство выполняет арифметические операции, такие как сложение, вычитание, а также логические операции.

· Блок управления определяет последовательность микрокоманд, выполняемых при обработке машинных кодов (команд).

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

2.2. Режимы работы процессора.

Процессор архитектуры x86 может работать в одном из пяти режимов и переключаться между ними очень быстро:

1. Реальный (незащищенный) режим (real address mode) — режим, в котором работал процессор 8086. В современных процессорах этот режим поддерживается в основном для совместимости с древним программным обеспечением (DOS-программами).

2. Защищенный режим (protected mode) — режим, который впервые был реализован в 80286 процессоре. Все современные операционные системы (Windows, Linux и пр.) работают в защищенном режиме. Программы реального режима не могут функционировать в защищенном режиме.

3. Режим виртуального процессора 8086 (virtual-8086 mode, V86) — в этот режим можно перейти только из защищенного режима. Служит для обеспечения функционирования программ реального режима, причем дает возможность одновременной работы нескольких таких программ, что в реальном режиме невозможно. Режим V86 предоставляет аппаратные средства для формирования виртуальной машины, эмулирующей процессор8086. Виртуальная машина формируется программными средствами операционной системы. В Windows такая виртуальная машина называется VDM (Virtual DOS Machine — виртуальная машина DOS). VDM перехватывает и обрабатывает системные вызовы от работающих DOS-приложений.

4. Нереальный режим (unreal mode, он же big real mode) — аналогичен реальному режиму, только позволяет получать доступ ко всей физической памяти, что невозможно в реальном режиме.

5. Режим системного управления System Management Mode (SMM) используется в служебных и отладочных целях.

При загрузке компьютера процессор всегда находится в реальном режиме, в этом режиме работали первые операционные системы, например MS-DOS, однако современные операционные системы, такие как Windows и Linux переводят процессор в защищенный режим. Вам, наверное, интересно, что защищает процессор в защищенном режиме? В защищенном режиме процессор защищает выполняемые программы в памяти от взаимного влияния (умышленно или по ошибке) друг на друга, что легко может произойти в реальном режиме. Поэтому защищенный режим и назвали защищенным.

2.3. Регистры процессора (программная модель процессора).

Для понимания работы команд ассемблера необходимо четко представлять, как выполняется адресация данных, какие регистры процессора и как могут использоваться при выполнении инструкций. Рассмотрим базовую программную модель процессоров Intel 80386, в которую входят:

· 8 регистров общего назначения, служащих для хранения данных и указателей;

· регистры сегментов — они хранят 6 селекторов сегментов;

· регистр управления и контроля EFLAGS, который позволяет управлять состоянием выполнения программы и состоянием (на уровне приложения) процессора;

· регистр-указатель EIP выполняемой следующей инструкции процессора;

· система команд (инструкций) процессора;

· режимы адресации данных в командах процессора.

Начнем с описания базовых регистров процессора Intel 80386.

Базовые регистры процессора Intel 80386 являются основой для разработки программ и позволяют решать основные задачи по обработке данных. Все они показаны на рис. 5.


Рис. 5. Базовые регистры процессора Intel 80386

Среди базового набора регистров выделим отдельные группы и рассмотрим их назначение.

2.4. Регистры общего назначения.

Остальные четыре регистра – ESI (индекс источника), EDI (индекс приемника), ЕВР (указатель базы), ESP (указатель стека) – имеют более конкретное назначение и применяются для хранения всевозможных временных переменных. Регистры ESI и EDI необходимы в строковых операциях, ЕВР и ESP – при работе со стеком. Так же как и в случае с регистрами ЕАХ - EDX, младшие половины этих четырех регистров называются SI, DI, BP и SP соответственно, и в процессорах до 80386 только они и присутствовали.

2.5. Сегментные регистры.

При использовании сегментированных моделей памяти для формирования любого адреса нужны два числа – адрес начала сегмента и смещение искомого байта относительно этого начала (в бессегментной модели памяти flat адреса начал всех сегментов равны). Операционные системы (кроме DOS) могут размещать сегменты, с которыми работает программа пользователя, в разных местах памяти и даже временно записывать их на диск, если памяти не хватает. Так как сегменты способны оказаться где угодно, программа обращается к ним, применяя вместо настоящего адреса начала сегмента 16-битное число, называемое селектором. В процессорах Intel предусмотрено шесть 16-битных регистров - CS, DS, ES, FS, GS, SS , где хранятся селекторы. (Регистры FS и GS отсутствовали в 8086, но появились уже в 80286.) Это означает, что в любой момент можно изменить параметры, записанные в этих регистрах.

В отличие от DS, ES, GS, FS, которые называются регистрами сегментов данных, CS и SS отвечают за сегменты двух особенных типов – сегмент кода и сегмент стека. Первый содержит программу, исполняющуюся в данный момент, следовательно, запись нового селектора в этот регистр приводит к тому, что далее будет исполнена не следующая по тексту программы команда, а команда из кода, находящегося в другом сегменте, с тем же смещением. Смещение очередной выполняемой команды всегда хранится в специальном регистре EIP (указатель инструкции, 16-битная форма IP), запись в который так же приведет к тому, что далее будет исполнена какая-нибудь другая команда. На самом деле все команды передачи управления – перехода, условного перехода, цикла, вызова подпрограммы и т.п. – и осуществляют эту самую запись в CS и EIP.

2.6. Регистр флагов.

Еще один важный регистр, использующийся при выполнении большинства команд, - регистр флагов. Как и раньше, его младшие 16 бит, представлявшие собой весь этот регистр до процессора 80386, называются FLAGS. В EFLAGS каждый бит является флагом, то есть устанавливается в 1 при определенных условиях или установка его в 1 изменяет поведение процессора. Все флаги, расположенные в старшем слове регистра, имеют отношение к управлению защищенным режимом, поэтому здесь рассмотрен только регистр FLAGS (см. рис. 6):


Рис. 6. Регистр флагов FLAGS.

CF – флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приемнике и произошел перенос из старшего бита или если требуется заем (при вычитании), в противном случае – в 0. Например, после сложения слова 0 FFFFh и 1, если регистр, в который надо поместить результат, – слово, в него будет записано 0000 h и флаг CF = 1.

PF – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четное число битов, равных 1, и в 0, если нечетное. Это не то же самое, что делимость на два. Число делится на два без остатка, если его самый младший бит равен нулю, и не делится, когда он равен 1.

AF – флаг полупереноса или вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего бита в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.

ZF – флаг нуля. Устанавливается в 1, если результат предыдущей команды – ноль.

SF – флаг знака. Он всегда равен старшему биту результата.

TF – флаг ловушки. Он был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения каждой программной команды управление временно передается отладчику.

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

DF – флаг направления. Он контролирует поведение команд обработки строк: когда он установлен в 1, строки обрабатываются в сторону уменьшения адресов, когда DF =0 – наоборот.

OF – флаг переполнения. Он устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное, и наоборот.

Флаги IOPL (уровень привилегий ввода-вывода) и NT (вложенная задача) применяются в защищенном режиме.

2.7. Цикл выполнения команды

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

Для того чтобы процессор знал, какую команду нужно выполнять в определённый момент, существует счётчик команд – специальный регистр, в котором хранится адрес команды, которая должна быть выполнена после выполнения текущей команды. То есть при запуске программы в этом регистре хранится адрес первой команды. В процессорах Intel в качестве счётчика команд (его ещё называют указатель команды) используется регистр EIP (или IP в 16-разрядных программах).

Счётчик команд работает со сверхоперативной памятью, которая находится внутри процессора. Эта память носит название очередь команд, куда помещается одна или несколько команд непосредственно перед их выполнением. То есть в счётчике команд хранится адрес команды в очереди команд, а не адрес оперативной памяти.

Цикл выполнения команды – это последовательность действий, которая совершается процессором при выполнении одной машинной команды. При выполнении каждой машинной команды процессор должен выполнить как минимум три действия: выборку, декодирование и выполнение. Если в команде используется операнд, расположенный в оперативной памяти, то процессору придётся выполнить ещё две операции: выборку операнда из памяти и запись результата в память. Ниже описаны эти пять операций.

  • Выборка команды . Блок управления извлекает команду из памяти (из очереди команд), копирует её во внутреннюю память процессора и увеличивает значение счётчика команд на длину этой команды (разные команды могут иметь разный размер).
  • Декодирование команды . Блок управления определяет тип выполняемой команды, пересылает указанные в ней операнды в АЛУ и генерирует электрические сигналы управления АЛУ, которые соответствуют типу выполняемой операции.
  • Выборка операндов . Если в команде используется операнд, расположенный в оперативной памяти, то блок управления начинает операцию по его выборке из памяти.
  • Выполнение команды . АЛУ выполняет указанную в команде операцию, сохраняет полученный результат в заданном месте и обновляет состояние флагов, по значению которых программа может судить о результате выполнения команды.
  • Запись результата в память . Если результат выполнения команды должен быть сохранён в памяти, блок управления начинает операцию сохранения данных в памяти.

Суммируем полученные знания и составим цикл выполнения команды:

  1. Выбрать из очереди команд команду, на которую указывает счётчик команд.
  2. Определить адрес следующей команды в очереди команд и записать адрес следующей команды в счётчик команд.
  3. Декодировать команду.
  4. Если в команде есть операнды, находящиеся в памяти, то выбрать операнды.
  5. Выполнить команду и установить флаги.
  6. Записать результат в память (по необходимости).
  7. Начать выполнение следующей команды с п.1.

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

Читайте также: