Перевод из десятичной системы счисления — КиберПедия 

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...

Перевод из десятичной системы счисления

2017-09-01 339
Перевод из десятичной системы счисления 0.00 из 5.00 0 оценок
Заказать работу

1. Разделить десятичное число А на 2. Запомнить частное q и остаток а.

2. Если в результате шага 1 частное q ≠ 0, то принять его за новое делимое и отметить остаток а, который будет очередной значащей цифрой числа, вернуться к шагу 1, на котором в качестве делимого (десятичного числа) участвует полученное на шаге 2 частное.

3. Если в результате шага 1 частное q - 0, алгоритм прекращается. Выписать остатки в порядке обратном их получению. Получится двоичный эквивалент исходного числа.

К примеру, требуется перевести число 24710 в двоичную систему счисления (рис. 6.3):

 

 

Рис. 6.3. Перевод в двоичную систему счисления

 

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

 

 

Перевод из шестнадцатеричной системы счисления

 

Этот переход мы уже обсуждали выше. Суть его заключается в последовательной замене шестнадцатеричных цифр соответствующими двоичными тетрадами согласно табл. 6.2. К примеру, e4d516 → 1110 0100 1101 01012.

 

 

Перевод в шестнадцатеричную систему счисления

Перевод из десятичной системы счисления

 

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

1. Разделить десятичное число А на 16. Запомнить частное q и остаток а.

2. Если в результате шага 1 частное q ≠ 0, то принять его за новое делимое, записать остаток и вернуться к шагу 1.

3. Если частное q = 0, прекратить работу алгоритма. Выписать остатки в порядке обратном их получению. Получится шестнадцатеричный эквивалент исходного десятичного числа.

 

К примеру, требуется преобразовать 32 76710 в шестнадцатеричную систему счисления (рис. 6.4).

 

 

Рис. 6.4. Перевод в шестнадцатеричную систему счисления

 

 

Порядок обхода остатков для получения результата показан на рис. 6.4 стрелками. Результат преобразования равен 7fff16.

 

 

Перевод из двоичной системы счисления

 

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

К примеру, требуется перевести число

 

111001011010111101011000110110001111010101011012

в шестнадцатеричную систему счисления.

 

Разобьем его на тетрады:

0111 0010 1101 0111 1010 1100 0110 1100 0111 1010 1010 1101.

По тетрадам приводим последовательности нулей и единиц к шестнадцатеричному представлению:

72d7ac6c7aad

В итоге мы получили результат преобразования:

И1001011010111101011000110110001111010101011012 → 72d7ac6c7aad16

 

Числа со знаком

 

До сих пор предполагалось, что числа положительные. А как представляются в компьютере числа со знаком?

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

Положительные целые со знаком — это 0 и все положительные числа.

Отрицательные целые со знаком — это все числа, меньшие 0. Отличительным признаком числа со знаком является особая трактовка старшего бита поля, представляющего число. В качестве поля могут выступать байт, слово или двойное слово. Естественно, что физически этот бит ничем не отличается от других — все зависит от команды, работающей с данным полем. Если в ее алгоритме заложена работа с целыми числами со знаком, то она будет по-особому трактовать старший бит поля. В случае, если бит равен 0, число считается положительным и его значение вычисляется по правилам, которые мы рассмотрели выше. В случае, если этот бит равен 1, число считается отрицательным и предполагается, что оно записано в так называемом дополнительном коде. Разберемся в том, что он собой представляет.

Дополнительный код некоторого отрицательного числа представляет собой результат инвертирования (замены 1 на 0 и наоборот) каждого бита двоичного числа, равного модулю исходного отрицательного числа, плюс единица. К примеру, рассмотрим десятичное число -18510. Модуль данного числа в двоичном представлении равен 101110012. Сначала нужно дополнить это значение слева нулями до нужной размерности — байта, слова и т. д. В нашем случае дополнить нужно до слова, так как диапазон представления знаковых чисел в байте составляет -128... 127. Следующее действие — получить двоичное дополнение. Для этого все разряды двоичного числа нужно инвертировать:

00000000101110012 → 11111111010001102

Теперь прибавляем единицу:

11111111010001102 + 00000000000000012 = 11111111010001112

Результат преобразования равен 11111111010001112. Именно так и представляется число -18510 в компьютере.

При работе с числами со знаком от нас наверняка потребуется умение выполнять обратное действие — имея двоичное дополнение числа, определить значение его модуля. Для этого необходимо выполнить два действия:

1. Выполнить инвертирование битов двоичного дополнения.

2. К полученному двоичному числу прибавить двоичную единицу.

 

К примеру, определим модуль двоичного представления числа —18510 = 11111111010001112:

11111111010001112 → инвертируем биты → 00000000101110002.

Добавляем двоичную единицу:

00000000101110002 + 00000000000000012 = 00000000101110012 = |-185|

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

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

 

 

Структура машинной команды

 

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

o что делать? (ответ на этот вопрос дает элемент команды, называемый кодом операции (КОП));

o объекты, над которыми нужно что-то делать (эти элементы называются операндами);

o как делать? (эти элементы называются типами операндов — обычно задаются неявно).

Приведенный на рис. 6.5 формат машинной команды является самым общим. Максимальная длина машинной команды — 15 байт. Реальная команда может содержать гораздо меньшее количество полей, вплоть до одного — только КОП.

 

 

Рис. 6.5. Формат машинной команды

 

Опишем назначения полей машинной команды.

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

 

Префикс замены сегмента. В явной форме указывает, какой сегментный регистр используется в данной команде для адресации стека или данных. Префикс отменяет выбор сегментного регистра по умолчанию. Префиксы замены сегмента имеют следующие значения: 2eh — замена сегмента cs, 36h — замена сегмента ss, 3eh — замена сегмента ds, 26h — замена сегмента es, 64h — замена сегмента fs, 65h — замена сегмента gs.

 

Префикс разрядности адреса уточняет разрядность адреса (32 или 16-разрядный). Каждой команде, в которой используется адресный операнд, ставится в соответствие разрядность адреса этого операнда. Этот адрес может иметь разрядность 16 или 32 бит. Если разрядность адреса для данной команды 16 бит, это означает, что команда содержит 16-разрядное смещение (см. рис. 6.5) и оно соответствует 16-разрядному смещению адресного операнда относительно начала некоторого сегмента. В контексте рис. 2.3 это смещение называется эффективным адресом. Если разрядность адреса 32 бит, это означает, что команда содержит 32-разрядное смещение (см. рис. 6.5), оно соответствует 32-разрядному смещению адресного операнда относительно начала сегмента и по его значению формируется 32-битное смещение в сегменте. С помощью префикса разрядности адреса можно изменить действующее по умолчанию значение разрядности адреса. Это изменение будет касаться только той команды, которой предшествует префикс.

Префикс разрядности операнда аналогичен префиксу разрядности адреса, но указывает на разрядность операндов (32 или 16-разрядные), с которыми работает команда. В соответствии с какими правилами устанавливаются значения атрибутов разрядности адреса и операндов по умолчанию? В реальном режиме и режиме виртуального i8086 значения этих атрибутов — 16 бит. В защищенном режиме значения атрибутов зависят от состояния бита D в дескрипторах исполняемых сегментов. Если D = 0, то значения атрибутов, действующие по умолчанию, равны 16 бит; если D = 1, то 32 бит. Значения префиксов разрядности операнда 66h и разрядности адреса 67h. Мы можем с помощью префикса разрядности адреса в реальном режиме использовать 32-разрядную адресацию, но при этом необходимо помнить об ограниченности размера сегмента величиной 64 Кбайт. Аналогично префиксу разрядности адреса вы можете использовать префикс разрядности операнда в реальном режиме для работы с 32-разрядными операндами (к примеру, в арифметических командах).

 

Префикс повторения используется с цепочечными командами (командами обработки строк). Этот префикс «зацикливает» команду для обработки всех элементов цепочки. Система команд поддерживает два типа префиксов: безусловные (rep — 0f3h), заставляющие повторяться цепочечную команду некоторое количество раз, и условные (repe/repz - 0f3h, repne/repnz - 0f2h), которые при зацикливании проверяют некоторые флаги, — и в результате проверки возможен досрочный выход из цикла.

 

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

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

 

Байт режима адресации modr/m. Значение этого байта определяет используемую форму адреса операндов. Операнды могут находиться в памяти, в одном или двух регистрах. Если операнд находится в памяти, то байт modr/m определяет компоненты (смещение, базовый и индексный регистры), используемые для вычисления его эффективного адреса. В защищенном режиме для определения местоположения операнда в памяти может дополнительно использоваться байт sib (Scale-Index-Base — масштаб-индекс-база). Байт modr/m состоит из трех полей:

o поле mod определяет количество байт, занимаемых в команде адресом операнда (см. рис. 6.5, поле смещение в команде). Поле mod используется совместно с полем r/m, которое указывает способ модификации адреса операнда смещение в команде. К примеру, если mod = 00, это означает, что поле смещение в команде отсутствует и адрес операнда определяется содержимым базового и (или) индексного регистра. Какие именно регистры будут использоваться для вычисления эффективного адреса, определяется значением этого байта. Если mod = 01, это означает, что поле смещение в команде присутствует, занимает один байт и модифицируется содержимым базового и (или) индексного регистра. Если mod = 10, это означает, что поле смещение в команде присутствует, занимает два или четыре байта (в зависимости от действующего по умолчанию или определяемого префиксом размера адреса) и модифицируется содержимым базового и (или) индексного регистра. Если mod = 11, это означает, что операндов в памяти нет; они находятся в регистрах. Это же значение байта mod используется в случае, когда в команде применяется непосредственный операнд;

o поле reg/коп определяет либо регистр, находящийся в команде на месте первого операнда, либо возможное расширение кода операции;

o поле r/m используется совместно с полем mod и определяет либо регистр, находящийся в команде на месте первого операнда (если mod = 11), либо используемые для вычисления эффективного адреса (совместно с полем смещение в команде) базовые и индексные регистры.

 

Байт масштаб-индекс-база (байт sib) используется для расширения возможностей адресации операндов. На наличие байта sib в машинной команде указывает сочетание одного из значений 01 или 10 поля mod и значения поля r/m = 100. Байт sib состоит из трех полей:

o поле масштаба ss. В этом поле размещается масштабный множитель для индексного компонента index, занимающего следующие три бита байта sib. В поле ss может содержаться одно из следующих значений: 1, 2, 4, 8. При вычислении эффективного адреса на это значение будет умножаться содержимое индексного регистра. Более подробно с практической точки зрения эта расширенная возможность индексации рассматривается позже при обсуждении вопросов работы с массивами;

o поле index используется для хранения номера индексного регистра, который применяется для вычисления эффективного адреса операнда;

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

 

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

 

Поле непосредственного операнда. Необязательное поле, представляющее собой 8,16 или 32-разрядный непосредственный операнд. Наличие этого поля, конечно, отражается на значении байта mod r/m.

 

 

Способы задания операндов команды

 

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

 

Операнд задается неявно на микропрограммном уровне. В этом случае команда явно не содержит операндов. Алгоритм выполнения команды использует некоторые объекты по умолчанию (регистры, флаги в eflags и т. д.). Например, команды cli и sti неявно работают с флагом прерывания if в регистре eflags, а команда xlat неявно обращается к регистру а1 и строке в памяти по адресу, определяемому парой регистров ds:bx.

 

Операнд задается в самой команде (непосредственный операнд). Операнд находится в коде команды, то есть является ее частью. Для хранения такого операнда в команде выделяется поле длиной до 32 бит (см. рис. 6.5). Непосредственный операнд может быть только вторым операндом (источником). Операнд-получатель может находиться либо в памяти, либо в регистре. Например, mov ax,0ffffh пересылает в регистр ах шестнадцатеричную константу ffff. Команда add sum,2 складывает содержимое поля по адресу sum с целым числом 2 и записывает результат по месту первого операнда, то есть в память.

 

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

o 32-разрядные регистры ЕАХ, ЕВХ, ЕСХ, EDX, ESI, EDI, ESP, EBP;

o 16-разрядные регистры АХ, ВХ, СХ, DX, SI, DI, SP, ВР;

o 8-разрядные регистры АН, AL, ВН, BL, CH, CL, DH, DL;

o сегментные регистры CS, DS, SS, ES, FS, GS.

Например, команда add ax,bx складывает содержимое регистров ах и bх и записывает результат в bх. Команда dec si уменьшает содержимое si на 1.

 

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

 

В свою очередь, косвенная адресация имеет следующие разновидности:

o косвенная базовая адресация; другое ее название — регистровая косвенная адресация;

o косвенная базовая адресация со смещением;

o косвенная индексная адресация со смещением;

o косвенная базовая индексная адресация;

o косвенная базовая индексная адресация со смещением.

 

Операндом является порт ввода/вывода. Как уже отмечалось, помимо адресного пространства оперативной памяти микропроцессор поддерживает адресное пространство ввода-вывода, которое используется для доступа к устройствам ввода-вывода. Объем адресного пространства ввода-вывода составляет 64 Кбайт. Для любого устройства компьютера в этом пространстве выделяются адреса. Конкретное значение адреса в пределах этого пространства называется портом ввода-вывода. Физически порту ввода-вывода соответствует аппаратный регистр (не путать с регистром микропроцессора), доступ к которому осуществляется с помощью специальных команд ассемблера in и out. Например:

in al. 60h; ввести байт из порта 60h

Регистры, адресуемые с помощью порта ввода-вывода, могут иметь разрядность 8, 16 или 32 бит, но для конкретного порта разрядность регистра фиксирована. Команды in и out работают с фиксированной номенклатурой объектов. В качестве источника информации или получателя применяются так называемые регистры-аккумуляторы еах, ах, al. Выбор регистра определяется разрядностью порта. Номер порта может задаваться непосредственным операндом в командах in и out или значением в регистре dx. Последний способ позволяет динамически определить номер порта в программе. Например:

 

Операнд находится в стеке.

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

 

В двухоперандной машинной команде возможны следующие сочетания операндов:

o регистр—регистр;

o регистр—память;

o память—регистр;

o непосредственный операнд—регистр;

o непосредственный операнд—память.

 

Для данного правила есть исключения, которые касаются:

o команд работы с цепочками, которые могут перемещать данные из памяти в память;

o команд работы со стеком, которые могут переносить данные из памяти в стек, также находящийся в памяти;

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

 

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

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

 

 

Прямая адресация

 

Это простейший вид адресации операнда в памяти, так как эффективный адрес содержится в самой команде и для его формирования не используется никаких дополнительных источников или регистров. Эффективный адрес берется непосредственно из поля смещения машинной команды (см. рис. 6.5), которое может иметь размер 8, 16, 32 бит. Это значение однозначно определяет байт, слово или двойное слово, расположенные в сегменте данных.

 

Прямая адресация может быть двух типов:

 

o Относительная прямая адресация. Используется для команд условных переходов, для указания относительного адреса перехода. Относительность такого перехода заключается в том, что в поле смещения машинной команды содержится 8, 16 или 32-битное значение, которое в результате работы команды будет складываться с содержимым регистра указателя команд ip/eip. В результате такого сложения получается адрес, по которому и осуществляется переход.

К примеру:

 

Несмотря на то, что в команде указана некоторая метка в программе, ассемблер вычисляет смещение этой метки относительно следующей команды (в нашем случае это mov al,2) и подставляет его в формируемую машинную команду jс.

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

 

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

 

 

 

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

 

mov ax.dword ptr [0000]

 

Остальные виды адресации относятся к косвенным. Слово «косвенный» в названии этих видов адресации означает то, что в самой команде может находиться лишь часть эффективного адреса, а остальные его компоненты находятся в регистрах, на которые указывают своим содержимым байт modr/m и, возможно, байт sib.

 

 


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

Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...

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



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

0.071 с.