Как посмотреть содержимое регистров процессора

Обновлено: 07.07.2024

Процессор Intel изнутри.

Изучаем регистры процессора.

Изучаем регистры процессора с помощью TD и нашей первой программы.

Для удобства работы с Turbo Debugger целесообразно увеличить рабочую площадь программы на всё окно.

Turbo Debugger - F5.

Используем F5 для увеличения рабочей площади TD.

Регистры процессора Intel и их аналоги.

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

Начиная с 80386, процессоры Intel и их аналоги имеют 16 основных регистров и 11 регистров для работы с числами с плавающей запятой (FPU/NPX) и мультимедийными приложениями (MMX). Для машины всегда быстрее и удобнее обращаться к регистру процессора, чем к памяти.

Помимо основных регистров существуют регистры управления памятью (GDTR, IDTR, TR, LDTR), регистры управления (CR0, CR1 – CR4), отладочные регистры (DR0 – DR7) и машинно-зависимые регистры, которые практически не используются в прикладном программировании.

Регистры процессора 8086.

Так как мы имеем дело с 16 битной операционной системой MS-DOS, то вернёмся во времена процессоров 8086 и 80286. В процессорах следующих поколений указанные регистры являются частями соответствующих 32 и 64 битных регистров с сохранением названия и функционала.

Например, регистр ax (16 бит) является составляющей частью регистра eax (32 бита). Благодаря указанному подходу достигается совместимость работы старых программ на новых компьютерах. Также сохраняются команды и директивы, переходя с 16 битного в 32 битный код.

Итак, процессор (8086 и 80286) содержит 12 16-ти разрядных программно-адресуемых регистров. Регистры процессора принято объединять в три группы:

  • Регистры данных.
  • Регистры указатели.
  • Сегментные регистры.

Кроме этого, в состав процессора входят:

16-ти разрядность обозначает, что в каждом регистре может содержаться 0FFFFh бит информации, то есть два байта: 0FFh-0FFh информации.

Регистры данных (регистры общего назначения).

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.

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

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

как компилятор поспримет x0 ? как он найдет эту ячейку? x0 для компилятора не адрес? то есть x0 не alias адреса?


в одной из тем я пытался понять имеют ли регстры адрес, а точнее регистры процессора?

Это смотря какой у тебя процессор. На некоторых процессорах (например на контроллерах AVR) регистры отображены на обычную адресуемую память. Но в x86 это не так.


скажите, а что стоит в x86 за именем регистра eax? это alias?

Нет, это регистр. Самостоятельное физическое устройство, не привязанное к RAM ни физически, ни логически.


Нашальника, хачю регистра шатать!

З.Ы. С таким ником позорно такие вопросы задавать. Переименуйся в Javascript.


мне нет. не важно что ты сейчас, важно чем ты станешь.


Ты решил стать ассемблером? А почему не JIT-компилятором?


здрасьте здрасьте люди добрые. в одной из тем я пытался понять имеют ли регстры адрес, а точнее регистры процессора?

Бывает по разному, чаще всего нет. Адрес у скажем EAX в x86 взять нельзя. Адрес есть только у MMIO регистров, которые обычно используются для управления устройствами.


но EAX имеет адрес?


да потому что уже занято.


скажите, а что стоит в x86 за именем регистра eax? это alias?

Номер регистра в командах MOV и т.д.. Обращаться к регистрам можно только через соответствующие инструкции процессора. Смотрите документацию на инструкции (я взял старую потому что новая слишком длинная, для понимания основ хватит старой).


все равно вам делать нечего кроме как писать " я за бан", так лучше помогите советом. Вы разработчик, значит знаете как устроены мануалы. Скажите в каком мануале stm32f103c8 описаны вот эти адреса


Нет, он имеет номер. Номера регистров следующие:

0 EAX
1 ECX
2 EDX
3 EBX
4 ESP
5 EBP
6 ESI
7 EDI

Номера хранятся в битах инструкций.


Скажите в каком мануале stm32f103c8 описаны вот эти адреса

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


смотрите, регистр, как набор ячеек(bit), устанавливает единицу-включаем, ноль-выключено.

arm64 вот так я в регистр x1 положил ноль. то есть я установил всего лишь нужные биты в единицу. это все? компилятор это не как ни извратит? Assembler ★ ( 24.05.21 15:30:51 )
Последнее исправление: Assembler 24.05.21 15:35:05 (всего исправлений: 1)


киньте пожалуйста ссылку? замучался качать все подряд


компилятор это не как ни извратит?

Если это не регистр общего назначения, то не извратит. А регистры общего назначения могут использоваться компилятором под локальные переменные и временные расчёты.


киньте пожалуйста ссылку? замучался качать все подряд



Если это не регистр общего назначения, то не извратит

я неправильно спросил наверное. что имено произойдет для того чтобы 0 оказался в x1? можете сказать?

кто положит ноль в регистр x1? я понял что это сделает не компилятор. AЛУ?



что имено произойдет для того чтобы 0 оказался в x1?

X512 ★★ ( 24.05.21 15:43:06 )
Последнее исправление: X512 24.05.21 15:44:07 (всего исправлений: 1)


работает. Но я хочу понять AЛУ положить ноль в x1 или другое устройство?


Но я хочу понять AЛУ положить ноль в x1 или другое устройство?

Не распарсил. Для того чтобы присваивать константы регистрам АЛУ вообще не нужен. Арифметики тут нет.

X512 ★★ ( 24.05.21 15:47:51 )
Последнее исправление: X512 24.05.21 15:48:24 (всего исправлений: 1)


хорошо, спасибо. если не AЛУ и не компилятор, то что положит 0 в регистра x1?


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

Документация на инструкцию MOV:

Номер регистра в Rd , константа в Operand 2 .


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


Глянь код vhdl или verilog для какого-нибудь простого проца типа 6502, там тебе будет и декодирование, и исполнение инструкций. Или глянь компьютер Бена итера, он на Ютубе собирал из рассыпухи отдельные модули процессора

luke ★★★★★ ( 24.05.21 16:06:32 )
Последнее исправление: luke 24.05.21 16:10:49 (всего исправлений: 2)


Если посмотреть по битам будет так:


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


Просто посмотри глазами что он друг с другом соединяет, какие микросхемы использует.


но мой английский ниже нижнего

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

У автора роликов есть свой магазин, где он продаёт готовые наборы, которыми можно самому воспроизвести всё, что он показывал. Проще у него комплекты купить, чем самому собирать компоненты по частям.


Оффтоп: а что есть лучше Anki, может быть даже консольное…


И там была масса статей на русском по ассемблеру и не только.

Сейчас это сайт wasm.in, возможно и статьи там всё ещё существуют.

Там же и форум есть, хотя он уже почти не дышит с тех пор как Аквила забил на него.

Основная масса кода там под масм, но есть и с юниксовым синтаксисом

Chord ★★ ( 24.05.21 19:32:36 )
Последнее исправление: Chord 24.05.21 19:34:31 (всего исправлений: 1)

wasm.in — это детище двух охламонов, поднявших свой форум из дампа, слитого во время взломов давным–давно и гулявшего по сети. Впрочем, старички с прошлого форума там встречаются.

а почитать документацию или хотя бы в общих чертах понять как устроены процессоры перед тем как регистры лапать тебе религия запрещает?


Никогда не искал ничего другого, но по запросу «alternative to anki» поисковики довольно много выдают. Среди выдачи есть какой-то clanki, консольный. Не пробовал.


Я просто щас свою поделку васяню для minix, чисто для души. А запускать и на Андроиде через термукс можно будет.

Я вот даже хз. Судя по обилию олигофренов, задающих в технических темах одни и те же тупые вопросы в последнее время, это кто-то так развлекается — ну, не может концентрация дебилов повышаться так быстро и локально. Уж какое в этом может быть развлечение — никогда не понимал.



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

Я слежу за его темами. И я согласен с тобой что число придурков растет. Они устанавливают куб жмакают по картинке с микроконтроллером и называют себя разработчиками. Ты хоть понимашь зачем вам навязывают среды разработок? Чтобы ты дурочка привыкла и не могла ниже чем на СИ! И тогда ты будешь платить им деньги за эти кубики-хуюбики. Конечно ты это понимаешь. И поэтому вы его ненавидите. Если они вдруг начнут обходится без ваших кубов, то ты помрешь с глодухи. Вот вы и льете желчь здесь.

Я же могу придти к тебе. И меня не остановит то что вдруг ты окажешься не девушкой. Не девушки у меня тоже рожают.

Я же могу придти к тебе. И меня не остановит то что вдруг ты окажешься не девушкой. Не девушки у меня тоже рожают.


А запускать и на Андроиде через термукс можно будет.

Я ещё могу понять, зачем запускать convert , ffmpeg или sox на телефоне. Внятных инструментов для задач простой конвертаци на Android просто не найти. Но использовать консольную утилиту для зубрёжки слов, когда есть готовые программы с не пальцеломными интерфейсами… Зачем?


Совместимость самописного формата.

На самом деле это я тупо откладываю сам процесс зубрёжки.


я тупо откладываю сам процесс зубрёжки

С учётом того, что отложенное повторение по сути и есть откладывание, ты откладываешь процесс откладывания.

как исполнитель инструкций видит регистра в который надо положить ноль

Грубо говоря, на примере наколеночных процов прошлого века, он «кладет» ноль во все регистры, потому что они все на одной шине и кладет он тупо на шину (внезапно, внутри проца тоже есть шины, чтобы перегонять машинные слова между блоками исполнения). Вот только принимает и запоминает этот ноль лишь тот регистр, у которого пин «запоминай» выставился в 1 (или 0, как схемотехнику удобнее было). Какой из регистров получил туда 1 определяется дешифратором, схемой, которая умеет вход из скажем трех битов превращать в выход из восьми, которые все нули, кроме того, чей номер зашифрован на входе 000..111. Вот на этот вход и подается номер регистра из команды.

То есть например семантика (mov reg, imm) (reg=011) дешифруется в 00001000 на шине выбора регистра, а на шине данных просто by schematic design уже висит imm.

Ты же понимаешь, что в интегральной схеме нет возможности «перетыкать разъемы», вот и управляют всем через входы активации, а данные реально «шлются-подаются» сразу на всё, куда теоретически задумано, что можно было бы туда подать.

Исполнитель выбирается еще раньше, то есть если код команды не похож на mov, то и сам дешифратор mov’а просто не активируется, и выдает 00000000, и как следствие участия в процессе исполнения не принимает.

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

Учебный курс. Часть 4. Регистры процессора 8086

Автор: xrnd | Рубрика: Учебный курс | 13-03-2010 | Распечатать запись

Для того, чтобы писать программы на ассемблере, нам необходимо знать, какие регистры процессора существуют и как их можно использовать. Все процессоры архитектуры x86 (даже многоядерные, большие и сложные) являются дальними потомками древнего Intel 8086 и совместимы с его архитектурой. Это значит, что программы на ассемблере 8086 будут работать и на всех современных процессорах x86.

Все внутренние регистры процессора Intel 8086 являются 16-битными:


Всего процессор содержит 12 программно-доступных регистров, а также регистр флагов (FLAGS) и указатель команд (IP).

Индексные регистры предназначены для хранения индексов при работе с массивами. SI (Source Index) содержит индекс источника, а DI (Destination Index) — индекс приёмника, хотя их можно использовать и как регистры общего назначения.

Регистры-указатели BP и SP используются для работы со стеком. BP (Base Pointer) позволяет работать с переменными в стеке. Его также можно использовать в других целях. SP (Stack Pointer) указывает на вершину стека. Он используется командами, которые работают со стеком. (Про стек я подробно расскажу в отдельной части учебного курса)

Сегментные регистры CS (Code Segment), DS (Data Segment), SS (Stack Segment) и ES (Enhanced Segment) предназначены для обеспечения сегментной адресации. Код находится в сегменте кода, данные — в сегменте данных, стек — в сегменте стека и есть еще дополнительный сегмент данных. Реальный физический адрес получется путём сдвига содержимого сегментного регистра на 4 бита влево и прибавления к нему смещения (относительного адреса внутри сегмента). Подробнее о сегментной адресации рассказывается в части 31.

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

Указатель команд IP (Instruction Pointer) содержит адрес команды (в сегменте кода). Напрямую изменять его содержимое нельзя, но процессор делает это сам. При выполнении обычных команд значение IP увеличивается на размер выполненной команды. Существуют также команды передачи управления, которые изменяют значение IP для осуществления переходов внутри программы.

Регистр флагов FLAGS содержит отдельные биты: флаги управления и признаки результата. Флаги управления меняют режим работы процессора:

  • D (Direction) — флаг направления. Управляет направлением обработки строк данных: DF=0 — от младших адресов к старшим, DF=1 — от старших адресов к младшим (для специальных строковых команд).
  • I (Interrupt) — флаг прерывания. Если значение этого бита равно 1, то прерывания разрешены, иначе — запрещены.
  • T (Trap) — флаг трассировки. Используется отладчиком для выполнения программы по шагам.

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

  • S (Sign) — знак результата, равен знаковому биту результата операции. Если равен 1, то результат — отрицательный.
  • Z (Zero) — флаг нулевого результата. ZF=1, если результат равен нулю.
  • P (Parity) — признак чётности результата.
  • C (Carry) — флаг переноса. CF=1, если при сложении/вычитании возникает перенос/заём из старшего разряда. При сдвигах хранит значение выдвигаемого бита.
  • A (Auxiliary) — флаг дополнительного переноса. Используется в операциях с упакованными двоично-десятичными числами.
  • O (Overflow) — флаг переполнения. CF=1, если получен результат за пределами допустимого диапазона значений.

Не волнуйтесь, если что-то показалось непонятным. Из дальнейшего объяснения станет ясно, что к чему и как всем этим пользоваться 🙂

Комментарии:

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

а как насчёт 386 ? какие у него есть регистры ?

У 386-го регистры 32-битные: EAX, EBX, ECX, EDX, EDI, ESI и т.д.
Ещё есть некоторые дополнительные регистры, например FS и GS.
Различий много, в комментарии всё не рассказать.

Хотелось бы узнать, что подразумевается под размером выполненной команды.

Количество байтов, которое занимает команда в памяти.
Команды могут иметь разную длину. От 1 до 14 байтов.
Процессор декодирует команду и выполняет её, затем переходит к следующей.

O (Overflow) — флаг переполнения. CF=1, если получен результат за пределами допустимого диапазона значений.
CF = 1? Или O = 1?

P (Parity) — признак чётности результата. Как узнать когда числа четные а когда не четные?

C (Carry) — флаг переноса. CF=1, если при сложении/вычитании возникает перенос/заём из старшего разряда. При сдвигах хранит значение выдвигаемого бита.
Что за перенос/заем из старшего разряда? Что за выдвигаемый бит?

A (Auxiliary) — флаг дополнительного переноса. Используется в операциях с упакованными двоично-десятичными числами.
Опять непонятно что за перенос? И что за упакованные двоично-десятичные числа?

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