Сегментные регистры
Процессоры Intel аппаратно поддерживают сегментную организацию программы. Это означает, что любая программа состоит как минимум из трех сегментов: кода, данных и стека. Логически машинные команды в архитектуре IA-32 построены так, что при выборке каждой команды для доступа к данным программы или к стеку неявно используется информация из вполне определенных сегментных регистров. В зависимости от режима работы процессора по их содержимому определяются адреса памяти, с которых начинаются соответствующие сегменты. В программной модели IA-32 имеется шесть сегментных регистров CS, SS, DS, ES, GS, FS, служащих для доступа к четырем типам сегментов.
Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр сегмента кода (code segment register) CS. Он содержит значение, которое по-разному интерпретируется процессором, в зависимости от текущего режима работы. В реальном режиме — это адрес первого параграфа сегмента, в защищенном — индекс элемента в таблице дескрипторов (глобальной GDT или локальной LDT).
Сегмент данных. Хранит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр сегмента данных (data segment register) DS, в который помещен адрес сегмента данных текущей программы.
Сегмент стека. Представляет собой область памяти, называемую стеком. Работу со стеком процессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Доступ к области стека выполняется через регистр сегмента стека (stack segment register) SS, содержащий адрес сегмента стека.
Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в регистре сегмента данных DS. Если программе недостаточно одного сегмента данных, то она имеет возможность одновременно задействовать еще три дополнительных сегмента данных, адреса которых должны содержаться в регистрах дополнительного сегмента данных (extension data segment registers) ES, GS, FS. Среди них следует особо выделить регистр ES. Он используется для обеспечения цепочечных команд процессора, адресуя собой операнд-источник.
Основы автоматизации вычислительного процесса
Ранее были даны определения алгоритма и программы (см. лекция 1). Алгоритм может быть записан в разных формах: словесной, формульной, табличной, графической или на языке программирования. Не останавливаясь на особенностях форм записи алгоритма, отметим, что языки, представляющие алгоритм в виде последовательности читаемых программистом (не двоично-кодированных) команд, называются алгоритмическими языками. Алгоритмические языки подразделяются на машинно-ориентированные, процедурно-ориентированные, объектно-ориентированные и проблемно-ориентированные.
Машинно-ориентированные языки (их еще называют ассемблеры) относятся к языкам программирования низкого уровня - программирование на них наиболее трудоемко, но позволяет создавать оптимальные программы, учитывающие функционально-структурные особенности конкретного компьютера. Программы на этих языках, при прочих равных условиях, будут более короткими (для ЭВМ) и более быстрыми. Кроме того, знание основ программирования на машинно-ориентированном языке позволяет специалисту подробно разобраться с архитектурой компьютера. Отличительной особенностью таких языков является генерация транслятором в большинстве случаев одной машинной команды на один оператор языка.
Все остальные языки программирования относятся к языкам высокого уровня и основаны на макрокомандах. Макрокоманда при трансляции генерирует много машинных команд, как правило, более десяти, а в некоторых случаях и несколько сотен команд. Этим обстоятельством объясняется большие объемы машинных кодов программ при малой длине исходных текстов.
Все языки программирования, и языки машинно-ориентированные, и языки высокого уровня, для их восприятия компьютером требуют наличия программ перевода - трансляторов на машинный язык.
Трансляторы бывают двух видов: трансляторы-компиляторы и трансляторы-интерпретаторы.
Компиляторы при трансляции переводят на машинный язык сразу всю программу и затем хранят ее в памяти машины в двоичных кодах. Интерпретаторы каждый раз при исполнении программы заново переводят в машинные коды каждую макрокоманду и передают ее для непосредственного выполнения компьютеру. В памяти интерпретируемые программы хранятся в виде исходных макрокоманд и потому в любой момент читаемы человеком. Откомпилированные программы в памяти ЭВМ практически человеком не читаемы. Но их можно вызвать в специальную программу-отладчик (DEBUG и его разновидности), который переведет эту программу на язык Ассемблера и, тем самым, сделает ее "человекочитаемой" (это еще один довод в пользу изучения языка ассемблер).
Алгоритм решения задачи, заданный в виде последовательности команд на языке вычислительной машины (в кодах машины) называется машинной программой. Команда машинной программы (далее команда) - это элементарная инструкция машине, выполняемая ею автоматически без каких-либо дополнительных указаний или пояснений.
Машинная команда состоит из двух частей: операционной и адресной.
КОП |
Адреса |
Рисунок 1. Функциональные части машинной команды
Операционная часть команды (КОП - код операции) - это группа разрядов в команде, предназначенная для записи аббревиатуры выполняемого действия.
Адресная часть команды (адреса) - это группа разрядов в команде, в которых записываются чаще всего идентификаторы данных или имена регистров Ml 111, хранящих информацию, или метки машинных команд. Часто эту часть называют адресами операндов, т.е. чисел, участвующих в операции.
По количеству записываемых адресов (обозначаются а1, а2, а3,...) команды делят на безадресные, одно-, двух- и трехадресные.
В трехадресной команде (рис. 2) а1 и а2 - адреса первого и второго чисел, участвующих в операции, а3 - адрес ячейки памяти или регистра, куда следует поместить результат выполнения операции.
КОП |
al |
а2 |
а3 |
Рисунок 2. Типовая структура трехадресной команды
Двухадресная команда имеет структуру, представленную на рисунке 3. В таких командах, как правило, al — адрес ячейки или регистра, где расположено первое число, и куда после завершения операции должен быть записан результат выполнения команды (обратите внимание: при этом "старое" значение первого числа изменяется). Второе участвующее в операции число хранится в а2.
КОП |
а1 |
а2 |
Рисунок 3. Типовая структура двухадресной команды
В одноадресной команде (рис.4) единственный адрес al может обозначать либо адрес ячейки памяти или регистра, где хранится участвующее в операции число, либо адрес ячейки памяти или регистра, куда следует поместить результат операции.
КОП |
а1 |
Рисунок 4. Типовая структура одноадресной команды
Безадресная команда содержит только код операции, а информация для нее должна быть заранее, до появления этой команды в программе, помещена другими командами в определенные регистры Ml ill (безадресные команды могут использоваться только совместно с командами другой адресности). В изучаемом нами Ассемблере применяются двух, одно и безадресные команды.
Итак, команды представляют краткую нотацию (запись) системы команд.