Место языков ассемблера среди языков программирования (2 ч) — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Место языков ассемблера среди языков программирования (2 ч)

2022-10-04 23
Место языков ассемблера среди языков программирования (2 ч) 0.00 из 5.00 0 оценок
Заказать работу

 

Мы приблизительно понимаем как работает компьютер. Процессор выбирает инструкции из памяти и выполняет их.

Под инструкциями мы понимаем числа, которые соответствуют командам.

Человеку трудно понимать и писать программы числами (кодами), хотя в начале развития компьютеров программисты так и работали (кодировали) алгоритмы.

Затем появились мнемокоды, которые являлись сокращенной формой названий операций, выполняемых программой.

Такие мнемокоды стали называть низкоуровневым языком программирования – ассемблером.

Ассемблер для каждого процессора свой.

 

Языки программирования  
Языки программирования – это языки, воспринимаемые и распознаваемые вводными устройствами ЦВМ. Общая классификация языков программирования (ЯП) приведена на рис. 1.

 

     
 

 

 


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

Машинные языки содержат подробные инструкции (команды) в двоично-кодированном виде.

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

Ассемблер – это программа, входящая в ОС и предназначенная для формирования машинных команд путем перевода со входного языка, называемого ЯА.

ЯА несколько различаются между собой, хотя имеют общие черты.

Рассмотрим язык ассемблера на примере IBMPC.

К этому классу относятся PC, построенные на базе микропроцессоров (МП) семейства Intel(8086, 80286, i386, i486, Pentium, Celeron, Atlon и т.п.).

В настоящее время широко используются другие микропроцессоры: DEC (DigitalEquipmentCorporation) и HP (HewlettPackard)

Они используют систему команд ЯА существенно отличные от фирмы Intel, но при программировании используются те же принципы.

 

 

 

Линии, которыми соединяются блоки, - это шины: шина адреса, шина данных и шина управления. Все они объединяются в одну системную шину. Для расширения возможностей системы на системную шину «цепляются» контроллеры. Каждый контроллер исполняет команды, которые были посланы ему через системную шину.

 

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

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

Что такое инструкция? Инструкция, или машинная команда, - это просто некоторый код, фактически обычное число, которое находится в памяти и обозначает некоторое действие. Инструкции бывают разные и разного размера - они могут занимать от одного до нескольких байт. По сути, они дают указание процессору, что ему надо делать. Для того чтобы процессор «знал», откуда из памяти брать команды для выполнения, он использует специальный указатель инструкции. Выполнив очередную инструкцию, процессор обновляет этот указатель, так чтобы он указывал на следующую команду в памяти, и т. д. Если какая-либо инструкция не может быть выполнена, процессор генерирует исключение; если исключение не может быть обработано, то он перезагружается.

Самая главная составляющая любой системы - это память (системная память). Память бывает двух видов: физическая и линейная.

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

Регистровую память представляют собой регистры. Регистр - это такое устройство, которое хранит в себе некоторую информацию, т. е. некоторое значение. Разрядность значения определяет разрядность регистра. Одни регистры могут хранить только определённую информацию, другие - любую. Те регистры, которые могут хранить любую информацию, называются регистрами общего назначения. Остальные регистры напрямую управляют работой процессора; точнее сказать, сами они не управляют, а процессор работает по-разному в зависимости от значений, которые принимают эти регистры. Регистры бывают разной разрядности, но большинство регистров 8-, 16-, 32- и 64-разрядные.

Для того чтобы получить значение, которое находится по определённому адресу памяти, процессор выставляет на шину адреса физический адрес, после чего на шине данных появляется значение. Конечно, появляется не мгновенно, но очень быстро - это зависит от скорости работы системной шины, памяти и других параметров. Если на шину адреса выведется значение памяти по адресу примерно большее 512 Мб, а на машине реально установлено 256 Мб, то в зависимости от материнской платы и памяти на шину данных может выйти просто «ерунда» или нулевое значение. Точно так же устанавливается и значение ячейки памяти. «Как же материнская плата “узнает”, что собирается сделать процессор?». На шину управления выставляется определённое значение, которое указывает материнской плате (или модулю памяти), что процессор хочет писать в память или читать из неё.

Обращения к определённым адресам памяти (которых обычно реально нет в системной памяти) могут перехватываться некоторыми котроллерами и перенаправляться к устройствам. Перехватив обращение к памяти, контроллер перенаправляет данные, которые должны быть помещены в память (или считаны из памяти) некоторому устройству. Таким образом, программа может взаимодействовать с внешними устройствами посредством записи/чтения из определённых адресов памяти. Это основной метод взаимодействия программ и устройств: например, так происходит взаимодействие с РСI-устройствами.

Как уже было сказано выше, адрес, который выставляется на шину адреса, -это и есть физический адрес. С виртуальной памятью всё будет сложнее. Виртуальная память может и не существовать реально, т. е. она «вроде бы есть, но её как бы нет». Если приложение операционной системы обращается к несуществующему адресу, процессор транслирует его в существующий адрес, а если памяти не хватает, то другая занятая память выгружается на внешнюю память (HDD, Flash и т. д.).

Как же происходит выполнение программ на процессоре? Все данные, которыми может оперировать процессор, находятся в памяти и только в памяти; если данные находятся не в памяти, а на внешних устройствах, то необходимо сначала загрузить эти данные в память и только потом с ними работать. Программа, де-факто, - это тоже данные, просто они представляют собой коды инструкций. Код инструкции называют опкодом. Опкод- это несколько байтов данных (от 1 до 10 и более), закодированных специальным образом, чтобы процессор мог понять, что от него «хотят». Иначе говоря, опкоды инструкций - это приказы процессору, которые тот беспрекословно выполняет, например: переслать данные из одного регистра в другой, из регистра в память, выполнить вычитание или сложение и т. д.

Процессор использует специальный регистр в качестве указателя инструкции EIP (IP, RIP). Этот регистр всегда содержит адрес следующей инструкции. После выполнения очередной инструкции процессор читает инструкцию из адреса, на который указывает регистр EIP, определяет её размер и обновляет адрес в регистре EIP (прибавляет к значению в регистре EIP размер текущей инструкции). После выборки инструкции из памяти и изменения регистра EIP процессор приступает к её выполнению. Инструкция может выполняться от одного до нескольких десятков процессорных тактов. В процессе выполнения инструкции может измениться адрес в регистре EIP. При изменении адреса в регистре EIP следующей будет выполнена именно та инструкция, адрес которой содержит регистр EIP - иными словами, произойдёт переход, или прыжок. После выполнения инструкции процессор читает следующую инструкцию, которая находится по адресу, содержащемуся в регистре EIP, и процесс повторяется. Вся сущность работы процессора заключается в выполнении команд. Однажды включившись, он всегда должен выполнять команды до тех пор, пока он не выключится или не перейдёт в специальное «подвешенное» состояние (ждущий режим).

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

На рис. ниже приведен пример цепочки вызова подпрограмм и содержимого стека.

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

На рис. адреса возврата выделены рамкой. Адрес возврата - это адрес следующей инструкции после инструкции вызова (CALL). При выполнении команды возврата из подпрограммы (RET) адрес возврата извлекается из верхушки стека и происходит передача управления по этому адресу.

 

Процессоры х86-64

Поскольку сейчас в основном выпускают только процессоры с поддержкой технологии AMD64 (ЕМ64Т), далее речь пойдёт главным образом о работе процессоров х86-64. По сути, процессоры х86-64 - это почти все процессоры, которые можно встретить на рынке и при повседневном использовании.

Процессоры х86-64 в основном могут работать в трёх основных режимах: реальный режим, защищённый режим и 64-разрядный режим, или longmode (далее - longmode):

•      реальный режим - это режим, в который переходит процессор после включения или перезагрузки. Это стандартный 16-разрядный режим, в котором доступно только 1 Мб физической памяти и возможности процессора почти не используются, а если и используются, то в очень малой степени. Иногда этот режим называют режимом реальных адресов, потому что в нем нельзя активировать механизм трансляции виртуальных адресов в физические. Это значит, что все адреса, к которым обращаются программы, являются физическими, т. е. без какого-либо преобразования будут выставлены на шину адреса. В этом режиме «родной» для процессора размер равен 2 байтам, или слову (WORD);

•      защищённый режим (protectedmode, или legacymode по документации AMD) - это 32-разрядный режим; разумеется для процессоров х86 этот режим главный. В защищённом режиме 32-разрядная операционная система может получить максимальную отдачу от процессора - разумеется, если ей это потребуется. В этом режиме можно получить доступ к 4-гигабайтному физическому адресному пространству, если память, конечно, установлена на материнской плате, а при включении специального механизма трансляции адресов можно получить доступ к 64 Гб физической памяти. В защищённый режим можно перейти только из реального режима. Защищённый режим называется так потому, что позволяет защитить данные операционной системы от приложений. В этом режиме «родной» для процессора размер данных - это 4 байта, или двойное слово (DWORD). Все операнды, которые выступают в этом режиме как адреса, должны быть 32-битными;

longmode («длинный режим», или IА-32е по документации Intel) - это собственно сам 64-разрядный режим. По своему принципу работы он почти полностью сходен с защищённым режимом, за исключением нескольких аспектов. В этом режиме можно получить доступ к 252 байтам физической памяти и к 248 байтам виртуальной памяти. В 64-разрядный режим можно перейти только из защищённого режима. В этом режиме «родной» для процессора размер данных - это двойное слово (DWORD), но можно оперировать данными размером в 8 байт. Размер адреса всегда 8-байтовый.

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

Помимо вышеперечисленных режимов работы процессор поддерживает следующие два подрежима:

• режим виртуального процессора 8086 - этоподрежим защищённого режима для поддержки старых 16-разрядных приложений. Его можно включить для отдельной задачи в многозадачной операционной системе защищённого режима;

• режим совместимости для longmode. В режиме совместимости приложениям доступны 4 Гб памяти и полная поддержка 32-разрядного и 16-разрядного кода; «родной» для процессора размер данных - это двойное слово. Режим совместимости, можно сказать, представляет собой в longmode то же самое, что и режим виртуального 8086 процессора в защищённом режиме. Режим совместимости можно включить для отдельной задачи в многозадачной 64-битной операционной системе. В режиме совместимости размер адреса 32-битный, а размер операнда не может быть 8-байтовым.

Итак, мы узнали, в каких режимах может работать процессор, но в официальной документации производителей процессоров (Intel и AMD) немного другая терминология. Если следовать официальной документации, есть два режима работы процессора: 32-битный и 64-битный. 32-битный режим в документации от AMD называется legacymode, а в документации от Intel носит название IA-32. Он включает в себя режим реальных адресов и защищённый режим. 64-битный режим в документации от AMD называется longmode, в документации от Intel - IA-32е; он включает в себя два подрежима: сам 64-разрядный режим и режим совместимости.


 

 


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

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

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...

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



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

0.018 с.