КОМПЬЮТЕРА
И ПРОЕКТИРОВАНИЕ КОМПЬЮТЕРНЫХ СИСТЕМ
ЧЕТВЕРТОЕ ИЗДАНИЕ
Д. ПАТТЕРСОН
ДЖ. ХЕННЕССИ
С ^П П ТЕ Р
С Е Р И Я
НЛПССИНП C0IT1PUTER SCIENCE
О ^П П ТЕ Р
Davi d A. Pa t t e r s o n
John L. He nne s s y
COMPUTER
ORGANIZATION
AND DESIGN
4th Edi t i on
E L S E V IE R
HARCCMKR COmPUTER SCIENCE
АРХИТЕКТУРА
КОМПЬЮТЕРА
И ПРОЕКТИРОВАНИЕ КОМПЬЮТЕРНЫХ СИСТЕМ
ЧЕТВЕРТОЕ И З Д А Н И Е
Е ^ П П Т Е Р
Москва • Санкт-Петербург ■Нижний Новгород • Воронеж
Ростов-иа-Дону ■Екатеринбург ■Самара ■Новосибирск
Киев • Харьков ■Минск
2012
ЬЫ . 32.973 2-02
УШ 004 3
ГСО
Паттерсон Д ., ЖаттевтЩш.
П20 Архитектура ш ш м я а р а ■ ц ю огпфование компьютерных систем. Классика
Computers S d e e e i 4 - е ш т — СПБ.. Питер, 2012. — 784 с.: ил.
Права на издание получены по соглашению с Elsevier Inc. Все права защищены. Никакая часть данной книги не
может быть воафоизеедена а какой бы то ни было форме без письменного разрешения владельцев авторских
прав.
Информация, содержащаяся в данной книге, получена из источников, рассматриваемых издательством как
надежные. Тем не менее, имея в виду возможные человеческие или технические ошибки, издательство ие
может гарантировать абсолютную точность и полноту приводимых сведений и ие несет ответственности за
возможные ошибки, связанные с использованием книги
Предисловие ............................................................................................................................ 9
П р е д и с л о в и е .................................................................................................. 9
Об этой книге
Мы уверены, что обучение в сфере науки и техники компьютерной обработки
данных должно отражать текущее состояние дел и давать введение в принципы,
формирующие информационные технологии. Мы также полагаем, что читатели
в любой специализированной области компьютерной обработки данных должны
понимать организационные парадигмы, определяющие возможности, производи
тельность и, в конечном счете, успех компьютерных систем.
Современная компьютерная технология требует от профессионалов любой
компьютерной специальности умения разбираться как в аппаратном, так и в про
граммном обеспечении. Взаимодействие аппаратного и программного обеспечения
на множестве уровней также предлагает структуру для понимания фундаменталь
ных основ вычислительной техники. Независимо от того, чем вы интересуетесь:
оборудованием или программным обеспечением, информатикой или электрони
кой. — в компьютерной организации и конструировании используются одни и те
же основные идеи. Поэтому в данной книге акценты расставлены на демонстрации
взаимоотношений между аппаратным и программным обеспечением и на кон
центрации вашего внимания на концепциях, положенных в основу современных
компьютеров.
Недавний скачок от однопроцессорных систем к многоядерным микропроцес
сорам подтверждает разумность такого подхода, выбранного еще в первом издании.
Программисты, конечно, могли бы проигнорировать тот или иной совет и всецело
положиться на разработчиков компьютеров, но для создателей компиляторов
и проектировщиков микросхем эти времена закончились. Чтобы программы ра
ботали быстрее, они должны использовать параллельную обработку. Хотя целью
позволить программистам работать, даже ничего не подозревая о параллельной
природе исходного оборудования, задались многие исследователи, на реализацию
этой мечты уйдут долгие годы. Мы считаем, что по крайней мере в следующем
десятилетии большинству программистов придется разбираться в интерфейсе
аппаратного и программного обеспечения, если они хотят добиться эффективного
выполнения программ на параллельных компьютерах.
10 Предисловие
Аудитория читателей этой книги включает тех, кто имеет небольшой опыт
в программировании на ассемблере или в разработке алгоритмов и нуждается
в понимании основ компьютерной организации, а также тех, кто уже имеет опреде
ленную подготовку в программировании на ассемблере и в разработке алгоритмов
и собирается изучить вопросы конструирования компьютера или разобраться в том,
как работает система и почему она работает именно таким образом.
О других книгах
Некоторые читатели уже знакомы с книгой «Computer Architecture: A Quantitative
Approach», которую часто называют «Хеннесси и Паттерсон». (Эту же книгу, в свою
очередь, часто называют «Паттерсон и Хеннесси».) Причиной, побудившей нас на
писать предыдущую книг)', было желание дать описание принципов компьютерной
архитектуры с использованием незыблемых основных технических принципов
и количественных соотношений стоимости—производительности. Чтобы создать
атмосферу реальных конструкций, мы использовали подход, сочетающий примеры
и оценки, основанные на изучении коммерческих систем. Наша цель заключалась
в демонстрации того, что компьютерную архитектуру можно изучить, используя не
описательный подход, а количественные методологии. Книга была предназначена
для настоящего компьютерного профессионала, желающего получить детальное
представление о компьютерах.
Большинство читателей згой книги не собирались становиться разработчиками
компьютеров. И тем не менее производительность и снижение энергопотребления
будущих программных систем будут сильно зависеть от того, насколько хорошо
разработчики программного обеспечения понимают основные технологии работы
компьютерного оборудования в той или иной системе. Поэтому твердое знание ос
нов, представляемых в данной книге, будет необходимо создателям компиляторов,
разработчикам операционных систем, программистам баз данных и большинству
других разработчиков программного обеспечения. Аналогичным образом и кон
структорам оборудования следует четко понимать влияние результатов их работы
на работу прикладных программ.
Мы понимали, что эта книга должна была представлять собой нечто большее,
чем подгруппа материалов из «Computer Architecture», и весь материал книги
тщательно пересмотрен и соответствует интересам разнообразной аудитории чита
телей. Мы настолько были довольны результатами своей работы, что пересмотрели
последующие издания «Computer Architecture», чтобы удалить из них основную
часть вводного материала.
того, чтобы читатель мог разглядеть лес, а не множество деревьев. Раздел «Само
проверка» помогает читателям убедиться в усвоении материала.
Поддержка преподавателей
Мы собрали большое количество вспомогательного материала, помогающего пре
подавателям вести курс с использованием данной книги. Реш ения упражнений,
короткие тесты по главам, иллюстрации из книги, примечания и слайды для лекций
и другие материалы можно получить у издателя. Более подробную информацию
можно найти на веб-сайте textbooks.elsevier.com/9780123744937.
Заключительные комментарии
Если вы прочитаете раздел благодарностей, то увидите, что мы прошли длинный
путь исправления ошибок. Поскольку книга не раз переиздавалась, у нас была воз
можность внести множество поправок.
Это издание отмечено перерывом в долговременном сотрудничестве между Хен
несси и Паттерсоном, начавшемся в 1989 году. К сожалению, должность президента
в одном из самых больших в мире университетов не позволила Хеннесси прини
мать активное участие в работе над новым,изданием. Оставшийся в одиночестве
автор почувствовал себя жонглером, всегда выступавшим с партнером, которого
внезапно вытолкнули на манеж для сольного выступления. Следовательно, люди,
упомянутые в разделе благодарностей, и коллеги из Беркли сыграли еще более
значительную роль в формировании содержимого данной книги. Тем не менее на
сей раз ответственность за весь материал, который вы собираетесь читать, несет
только один автор.
Дэвид А. Паттерсон
От издательства
Ваши замечания, предложения и вопросы отправляйте по адресу электронной по
чты comp@piter.com (издательство «Питер», компьютерная редакция).
Мы будем рады узнать ваше мнение!
Подробную информацию о наших книгах вы найдете на веб-сайте издательства
http://www.piter.com.
Глава 1
Компьютерные абстракции
и технологии
1.1. Введение
Добро пожаловать в эту книгу! Мы рады представившейся возможности по
делиться с вами темн возвышенными чувствами, которые вызывают у нас мир
компьютерных систем. В этом мире нет места скуке и застою и новые идеи не
прячут под сукно, напротив! Компьютеры являются продуктом невероятно бурно
развивающейся индустрии информационных технологий, все направления кото
рой составляют почти 10% валового национального продукта США и все расчеты
в которой отчасти строятся на ускоренном совершенствовании компьютерных
технологий, обещанном законом Мура. Эта весьма необычная индустрия погло
щает инновации на одном дыхании. За последние 25 лет было создано множество
новых компьютеров, чье появление представлялось не иначе как революционными
переворотами в компьютерной индустрии, и недолговечность этих революций
обусловливалась лишь тем, что кто-то другой создавал еще более передовой ком
пьютер.
Эта инновационная гонка, начало которой было положено созданием электрон
ных вычислительных машин в конце 40-х годов прошлого века, привела к бес
прецедентным успехам. Если бы, к примеру, транспортная индустрия развивалась
такими же темпами, сегодня мы смогли бы добраться из Нью-Йорка до Лондона
примерно за секунду, заплатив за это всего несколько центов. Представьте на мгно
вение, как подобное усовершенствование могло бы изменить жизнь человечества:
можно было бы жить на Таити, работать в Сан-Франциско, а по вечерам выбираться
в Москву, посмотреть балет в Большом театре, - вы только оцените последствия
такого изменения!
Компьютеры привели цивилизацию к третьей, информационной революции, ко
торая встала в один ряд с промышленной и сельскохозяйственной. Преумножение
интеллектуальной мощи и расширение возможностей человечества в этой сфере
сстсс гвенным образом отразились на его повседневной жизни, изменив способы
1.1. Введение 19
Компонент аппаратного или про Как этот компонент влияет Где освещается
граммного обеспечения на производительность эта тема?
Алгоритм Определяет как количество инструк В других книгах!
ций на уровне исходных кодов, так и
количество выполняемых операций
ввода-вывода
Языки программирования, компиля Определяют количество инструкций Главы 2 и 3
торы и архитектура компьютера для каждой инструкции
на уровне исходного кода
Процессор и система памяти Определяют скорость выполнения Главы 4, 5 и 7
инструкций
Система веода-выеода (оборудова Определяет, насколько быстро Глава 6
ние и операционная система) могут быть выполнены операции
ввода-вывода
Самопроверка
Подразделы Сачопроверка предназначены для того, чтобы помочь читателям оце
нить, насколько ими усвоены основные понятия, представленные в главе, и убе
диться в том, что им понятны значения этих понятий. Некоторые вопросы этих
подразделов требуют простых ответов, но часть из них предназначена для обсуж
дения в группе. Ответы на конкретные вопросы могут быть найдены в конце главы.
Вопросы подраздела Самопроверка появляются только в конце раздела, н если вы
уверены в том, что усвоили весь материал, их можно пропустить.
1. В разделе 1.1 показано, что количество встроенных процессоров, проданных
в каждом году, существенно превышает количество проданных процессоров
для настольных компьютеров. Мох<ете ли вы подтвердить или опровергнуть
это наблюдение на основе своего собственного опыта? Попробуйте подсчитать
количество встроенных процессоров в своем доме. Как это количество соотно
сится с количеством настольных компьютеров в вашем доме?
1 Как уже упоминалось, на производительность программы влияет как про
граммное, так и аппаратное обеспечение. Можете ли вы привести примеры,
когда главной причиной снижения производительности стаю что-нибудь из
нижеперечисленного?
26 Глава 1. Компьютерные абстрил и » и технологии
♦ Выбранный алгоритм
♦ Язык программироидння или компилятор
♦ Операционная система
♦ Процессор
♦ Система и устройства ввода-вывода
на С, C++, Java или Visual Basic, в инструкции, которые может выполнять обору
дование. Учитывая сложность современных языков программирования и простоту
инструкций, выполняемых оборудованием, транслятор языка высокого уровня
в инструкции оборудования представляет собой весьма непростую программу.
Краткий обзор процесса трансляции будет дан в этой главе, а более подробно этот
вопрос будет рассмотрен в главе 2.
Прикладные программы
Системные программы
Оборудование
(аппаратное
обеспечение!
(системное программное
обеспечение)
(прикладное программное
обеспечение)
I
Компилятор
Программа swap;
на языке muli $2, $5,4
ассемблера add $2. $4,$2
(для MPPS- lw $15,0($2)
процессора) lw $16,4($2)
SW $16,0($2)
sw $15,4($2)
jr $31
„L
Ассемблер
Доичная 00000000101000010000000000011000
программа 00000000000110000001100000100001
на машинном 1000110001 юооюоооооооооооооооо
языке 1000I 1001111001000000000000001оо
(для MIPS- 101011001111001ооооооооооооооооо
процессора) 10101100011000100000000000000100
00000011111000000000000000001000
Вас. 1.3. Программа на языке С компилируется а программу на языке ассемблера, а эа-
шт ассемблируется а двоичный машинный язык. Хотя здесь показана двухэтапная транс-
авам с языка высокого уровня в двоичный машинный язык, некоторые компиляторы исключают
Фамежуточный этап и выдают двоичный машинный код напрямую. Более подробно эти языки
и такая программа будут рассмотрены в главе 2
Самое важное
К пяти классическим компонентам компьютера относятся: устройства ввода,
вывода, память, операционный блок и блок управления, причем два последних
компонента иногда объединяются и называются процессором. На рис. 1.4 пока
зана стандартная структура компьютера. Эта структура не зависит от технологии
изготовления оборудования: любую часть любого компьютера из прошлого или
настоящего можно отнести к одной из этих пяти категорий. Чтобы помочь вам
постоянно держать перед глазами эту структуру, пять компонентов компьютера
показаны на первых страницах каждой из следующих глав, с выделением той
части, которой посвящена конкретная глава.
Интерфейс
Анатомия мыши
Идея мыши пришла мне в голову во время слуша
ний на компьютерной конференции. Речь доклад
чика была настолько скучной, что я размечтался
и придумал это устройство.
Д уг Энгельбарт
Благодаря дисплею я посадил самолет на палубу
движущегося авианосца, видел, как ядерная ча
стица попадала в электростатическую ловушку,
летал на ракете с околосветовой скоростью и на
блюдал за компьютером, раскрывающим самые
сокровенные детали своей работы.
Ливан Сазерленд, *отец» компьютерной графи
ки, американский ученый, 1984 год
Хотя сегодня многие пользователи воспринимают мышь как нечто само собой
разумеющееся, идея использования такого указывающего устройства, как мышь,
впервые была продемонстрирована в качестве исследовательского прототипа Дугам
Энгельбартом (Doug Engelbart) в 19G7 году.
Компьютер Alto, вдохновивший на создание всех рабочих станций, а также
операционных систем Macintosh и Windows, включал мышь как указывающее
устройство еще в 1973 году. В 90-е годы прошлого века мышью и новым пользова
тельским интерфейсом на основе графических дисплеев обзавелись все настольные
компьютеры.
Самая первая мышь была электромеханической, в ней использовался большой
шар, перекатывающийся по поверхности. При этом счетчики координат х н у на
ращивали свои значения. Скорость приращения показателя каждого счетчика
говорила о том, насколько быстро перемещалась мышь.
На смену электромеханическим мышам практически повсеместно пришли более
новые, оптические мыши. Эти устройства по своей сути являются миниатюрными
оптическими процессорами, включающими светодиод, обеспечивающий подсвет
ку, крошечную черно-белую камеру и простой оптический процессор. Светодиод
подсвечивает поверхность под мышью, камера благодаря этой подсветке делает
1500 снимков в секунду. Последовательные снимки отправляются оптическому
процессору, который сравнивает изображения и определяет, в какую сторону
и насколько быстро была перемещена мышь. Замена электромеханической мыши
электрооптической является примером типичного явления, когда удешевление
и повышение надежности электроники приводит к тому, что чисто электронные
решения заменяют устаревшие электромеханические технологии. Чуть позже будет
показан еще один пример —флэш-память.
Пиксел
Наименьший отдельный элемент изобра
жения. В состав экранов входят от несколь
ких сотен тысяч до нескольких миллионов
пикселов, сведенных е матрицу,
1.3. Что скрывается под крышкой корпуса компьютера 35
Буфер кадра
Vo
V,
Х0 X,
Рис. 1 .6 . Каждая координата в буфере кадра, показанном слева, определяет оттенок
тонки с соответствующей координатой для растрового сканирующего ЭЛТ-дисплея, по
казанного справа. Пиксел (ХО, Y0) содержит конфигурацию битов 0011, определяющую более
светлый тон, чем конфигурация битов 1101 в пикселе (X I, Y1)
Рис. 1.7. Внутреннее устройство ноутбука с рис. 1.5. Коробка с белой наклейкой с ле
вого края — это жесткий диск на 100 Гбайт с интерфейсом SATA, а коробка с правого края —
DVD-привод. Пространство между ними — это место для аккумулятора ноутбука. Неболыио<
пространство чуть выше аккумуляторного отсека предназначено для DIMM-модулей памяти. Ш
рис. 1.8 изображение DIMM-модулей, вставляемых снизу, дано крупным планом. Выше аккуму
ляторного отсека и DVD-привода находится печатная плата (плата ПК), называемая материнской
которая содержит основную часть электронной начинки компьютера Ява круглых предмет!
в верхней части фотографии - это вентиляторы в корпусах. Процессор — это большой выпуклы!;
прямоугольный объект, расположенный чуть ниже левото вентилятора,
фотография любезно предоставлена администрацией сайта OtherWorldComputing.com
1.3. Что скрывается под крышкой корпуса компьютера 37
Рис. 1.8. увеличенный фрагмент ноутбуке, на котором видны модули памяти. Основная
память состоит из одного или нескольких небольших модулей, показанных в левой части фото
графии. Пространство для аккумулятора расположено справа. DRAM-чипы установлены на
платах (называемых D IM M -модулями — от dual inline memory modules — модули памяти с двух
рядным расположением выводов), а затем вставлены в контактные колодки.
Фотография любезно предоставлена администрацией сайта OtherWorldComputing.com
Ишмвиимй Н р«у
im B S S IC ?&?"'
12в ратр|>диый блок
арифметики
с плавающей точкой
Етлок Кми
Кэш да н н ы х
ПСМВ уровня
5} Общий ИМЯ
у р о в н я L1
L2 Ядро 2
кэш Блок б ло* 512
уровня м спопиения
Ж ЕГ Кбайт
Блок
и з в л е ч е н и я - ц е - Кэыик-
Ц 2 Мбайт кодирояати струкций
M TW HM B у с о в и я L1
Северный мост
Ядро 4 Ядро 3
эоиэмадител*-
■КМ. ИИ И ИГ ■■ ■V-*
ран1и0
ттпи
ДДНЬЬА
Самое важное
Как аппаратное, так и программное обеспечение состоит из иерархических уров
ней, и каждый уровень скрывает подробности от вышестоящего уровня. Этот
принцип абстракции является способом справиться со сложностью компьютерных
систем, как для разработчиков аппаратной части, так и для разработчиков про
граммного обеспечения. Ключевым интерфейсом между уровнями абстракции
является архитектура набора инструкций — интерфейс между аппаратурой и низ
коуровневым программным обеспечением. Этот абстрактный интерфейс позво
ляет многим реализациям, разным по стоимости и производительности, работать
с одинаковым программным обеспечением.
с обеих сторон покрыты материалом для магнитной записи, похожим на тот матери
ал, который используется в магнитофонных кассетах или видеолентах. Для чтения
и записи информации на жестком диске имеется подвижный элемент, содержащий
небольшую электромагнитную катушку, называемую головкой итения-записи,
которая находится непосредственно над поверхностью. Весь привод постоянно
находится в закрытом состоянии, что позволяет контролировать состояние его
внутренней среды и что, в свою очередь, позволяет головкам диска быть ближе
к поверхности диска.
Диаметр жестких дисков сегодня варьируется более чем в три раза, от одного
до трех с половиной дюймов. С годами диаметр уменьшался. Новые форм-факторы
дисков понадобились всем устройствам: рабочим станциям, серверам, персональ
ным компьютерам, ноутбукам, КПК и цифро
вым видеокамерам. Обычно самые большие
Гигабайт
диски обладают самой высокой производитель
Обычно в одном гигабайте насчитывается
ностью, а самые маленькие имеют самую низ 1 073 741 824 (210) байт, хотя эта величина
кую стоимость. При этом стоимость хранения для некоторых систем связи и вторичных
одного гигабайта данных имеет разное значе систем хранения данных переопределена
и означает 1 000 000 000 (10е) байт. Анало
ние. Хотя большинство жестких дисков, как гично этому, в зависимости от контекста
и тот диск, что показан на рис. 1.7, находятся мегабайт может означать либо 2?с, либо
внутри компьютеров, могут быть также жесткие 101- байт,
42 Глава 1. Компьютерные абстракции и технологии
Самопроверка
♦ Полупроводниковая DRAM-память и дисковый накопитель существенно от
личаются друг от друга. Опишите основные отличия по каждой из следующих
характеристик: энергозависимости, времени доступа к данным и стоимости.
1.4. Производительность
Оценить производительность компьютера бывает довольно непросто. Разнообразие
и сложность современных программных систем в сочетании с широким спектром
технологий улучшения производительности, применяемых разработчиками обо
рудования, сделали оценку производительности еще сложнее.
При выборе компьютера из нескольких разных моделей производительность
считается весьма важным свойством. Покупателям, а следовательно и разработчи
кам, важна точность оценки и сравнения различных компьютеров. Знают об этом
и продавцы компьютеров. Зачастую продавцам хочется представить компьютер
в наилучшем свете, независимо от того, отвечает ли он запросам потребителя. По
этому при выборе компьютера нужно знать, как наилучшим образом определить
уровень производительности и какие ограничения существуют при измерении
производительности.
Год онедреиия
Рис. 1.11. Рост емкости DRAM-чипое. Значения по оси Y выражены в килобитах. Произво
дители DRAM вчетверо увеличивали емкость каждые три года — 60% в год на протяжении
20 лет. В последние годы темпы роста снизились и стали близки к удвоению емкости каждые
два-три года
Определение производительности
Что мы имеем в виду, когда говорим, что один компьютер по сравнению с другим
обладает более высокой производительностью? Хотя этот вопрос может показаться
очень простым, приводимая здесь аналогия с пассажирами самолетов показывает,
насколько коварен может быть вопрос о производительности. В табл. 1.2 показа
ны обычные пассажирские самолеты, а также их крейсерская скорость, дальность
и вместимость. Если нужно узнать, какой из самолетов, перечисленных в таблице,
обладает лучшей производительностью, сначала следует определить само понятие
48 Глава 1. Компьютерные абстракции и технологии
Пропускная
Крейсерская
Дальность, способность,
Самолет Вместимость скорость,
миль пассажиров х
миль в нас
Упражнение
Пропускная способность н время отклика
К чему приведут следующие изменения в компьютерной системе: к увеличению пропускной
способности, уменьшению времени отклика или и к тому и к другому?
• Замена процессора более быстродействующим.
• Добавление процессоров к системе, которая использует несколько процессоров для раз
деления задач, например для проведения поиска во Всемирной паутине.
Ответ
Уменьшение времени отклика почти всегда увеличивает пропускную способность. Следо
вательно, в первом случае улучшатся как показатели времени отклика, так и показатели
пропускной способности. Во втором случае ни одна из задач не будет выполняться быстрее,
следовательно, повысится только пропускная способность.
Но если бы во втором случае время, требуемое на обработку, было сопоставимо с пропускной
способностью, система могла бы заставить запросы выстроиться в очередь. В таком случае
повышение пропускной способности могло бы также улучшить время отклика, поскольку
оно уменьшило бы время ожидания в очереди. Таким образом, на многих реально существу
ющих компьютерных системах изменение одного показателя - либо времени выполнения,
либо пропускной способности зачастую влечет за собой изменение и другого показателя.
1 1
---------------------------- > -----------------------------.
Время выполнения v Время выполнения у
мы будем использовать фразу <Хя п раз быстрее, чем Y* или использовать равно
ценную фразу «Скорость X в я раз больше скорости Y», что означает:
Производительность..
---------------------------- = и.
Производительность.,
Упражнение
Относительная производительность
Если компьютер А выполняет программу за 10 секунд, а компьютер В выполняет ту же про
грамму за 15 секунд, то насколько А быстрее В?
Ответ
Мы знаем, что А в л раз быстрее, чем В, если:
Производительность Л Время выполнения 8
Производительность fl Время выполнения ,
тИ
и А поэтому в 1,5 раза быст рее, чем В.
означает, что
Производителыюсть.
------------- — ----------- “ ■= Производительностьд
Оценка производительности
Оценочным критерием компьютерной производительности является время: ком
пьютер. выполняющий тот же объем работы за меньшее время, является более
быстрым. Время выполнения программы оценивается в секундах, затраченных на ее
выполнение. Но время может быть определено и другими способами, в зависимо
сти от того, что берется в расчет. Наиболее простые —время выполнения процесса,
вре.мя отклика или общее затраченное время. Эти понятия означают полное время,
затраченное на выполнение задачи, включая обращения к диску, обращения к памя
ти, работу устройств ввода-вывода, издержки, связанные с работой операционной
системы, то есть все, на что потрачено время.
Но компьютеры часто работают в режиме разделения времени, и процессор
может работать над выполнением сразу нескольких программ. В таких случаях
система может стремиться не к минимизации общего времени, затраченного на
выполнение одной программы, а к оптимизации пропускной способности. Поэто
му часто возникает потребность в проведении черты между общим затраченным
временем и временем работы процессора в наших интересах. Время выполнения
задачи центральным процессором (CPU execution time), или просто процессорное
время (CPU time), которое учитывает это различие, это время, которое централь
ный процессор затрачивает на работу над этой задачей, оно включает время ожи
дания операций ввода-вывода или время, затраченное на выполнение других
программ. (Но при этом следует помнить, что время отклика, ожидаемое пользо
вателем, будет общим затраченным временем, а не процессорным временем.) Про
цессорное время может и дальше делиться на процессорное время, затраченное на
программу и называемое процессорным време
нем пользователя (user CPU time), и на про
цессорное время, затраченное на выполнение Время выполнения задачи
центральным процессором (CPU
операционной системой задач в интересах про
EXECUTION TIME)
граммы, называемое процессорным временем Также называется процессорным временем
системы (system CPU time). Провести четкую (CPU time). Фактическое время, затрачен
черту между процессорным временем системы ное центральным процессором на выпол
нение конкретной задачи
и пользователя довольно трудно, поскольку за
частую трудно отнести активность операцион Процессорное время пользователя
ной системы к той или иной пользовательской (user CPU time)
программе, трудности вызываются также и Время центрального процессора, затра
ченное на саму программу.
функциональными особенностями разных опе
рационных систем. Процессорное время системы (system
Чтобы быть последовательными, мы сохра CPU time)
Время центральною процессора, затра
ним различие между производительностью, ченное о операционной системе на выпол
основанной на общем затраченном времени, нение задач, связанных с выполнением
и производительностью, основанной на времени программы
52 Глава 1. Компьютерные абстракции и технологии
Самопроверка
1. Предположим, что нам известно, что работа приложения, использующего
и клиентский настольный компьютер, и удаленный сервер, ограничивается
производительностью сети. Скажите, что происходит при улучшении одной
лишь пропускной способности? А при улучшении как времени отклика, так
и пропускной способности? Или вообще не происходит никаких изменений?
1. Между клиентом и сервером добавлен еще один сетевой канал, повышающий
общую пропускную способность сети и сокращающий время ожидания до
ступа к сети (поскольку теперь уже имеется два канала).
2. Улучшено качество сетевого программного обеспечения, благодаря чему со
кратилась задержка в сетевых линиях связи, но не повысилась пропускная
способность сети.
3. Увеличен объем оперативной памяти компьютера.
2. Компьютер С работает в четыре раза быстрее компьютера В, который выполняет
заданное приложение за 28 секунд. Сколько времени займет выполнение этого
же приложения на компьютере С?
Упражнение
Повышение производительности
Интересующая нас программа выполняется на компьютере А, имеющем тактовую частоту
2 ГГц, за 10 секунд. Мы стараемся помочь разработчику компьютеров создать компьютер В.
который выполнял бы эту программу за 6 секунд. Этот разработчик определил, что соот
ветствующее повышение тактовой частоты вполне допустимо, но это повышение повлияет
на всю остальную конструкцию центрального процессора и компьютеру В на выполнение
программы потребуется в 1,2 раза больше тактовых циклов, чем компьютеру А. Какую так
товую частоту следует заказать разработчику компьютеров?
Ответ
Сначала давайте определим количество циклов, необходимых программе на компьютере А:
Количество тактовых циклов процессора.
Процессорное время . -------------------------------------------------------
Гактовая частота 4
Количество тактовых циклов процессора ,
10 секунд --------------------------------------------------- —А
2x10s циклов в секунду
Чтобы выполнить программу за 6 секунд, компьютер В должен иметь вдвое большую так
товую частоту, чем компьютер А
Упражнение
Использование уравнения производительности
Предположим, что есть две реализации одной и той же архитектуры набора команд. У ком
пьютера А продолжительность тактового цикла равна 250 пс, значение СР1 для некой
программы равно 2,0, а у компьютера В продолжительность тактового цикла равна 500 пс,
значение CPI для той же программы равно 1,2. Какой из компьютеров будет быстрее для
данной программы и насколько?
Ответ
Мы знаем, что любой компьютер при каждом запуске программы выполняет одно и то же
количество инструкций, обозначим это количество буквой /. Сначала определим количество
тактовых циклов процессора для каждого компьютера:
Количество тактовых циклов процессора, “ / * 2,0
Количество тактовых циклов процессора,, - / * 1,2.
Теперь мы можем вычислить процессорное время для каждого компьютера:
Процессорное время, - Количество тактовых циклов процессора, к
* продолжительность тактового цикла - / к 2,0 к 250 пс = 500 к /пс.
И точно так же для В:
Процессорное время,, х J х 1,2 х 500 пс - 600 /пс.
Совершенно очевидно, что компьютер Л работает быстрее. Насколько быстрее, позволяет
определить соотношение показателей времени выполнения;
Производительность процессора, Время в ы п о л н е н и я 600x/ nc
Производи гсльность процессорай Время выполненияg 500 х /пс
Можно сделать вывод, что для данной программы компьютер А в 1,2 рала быстрее компью
тера В.
56 Глава 1. Компьютерные абстракции и технологии
Эти формулы особенно удобны тем, что в них использованы три ключевых
фактора, влияющих на производительность. Мы можем использовать эти формулы
для сравнения двух различных реализаций или
Количество инструкций
количество инструкций, выполненных по Л™ оценки альтернативной конструкции, если
программе. знаем, как она влияет на эти три параметра.
Упражнение
Сравнение кодовых сегментов
Разработчик компилятора пытается принять решение относительно двух кодовых после
довательностей для конкретного компьютера. Разработчики аппаратуры предоставили
следующие факты:
ответ
Для последовательности 1 выполняется 2 + I + 2 - 5 инструкций. Для последовательности 2
выполняется 4 * 1 +•1 = 6 инструкций. Стало быть, для последовательности 1 выполняется
меньше инструкций.
Для определения общего количества тактовых циклов для каждой последовательности
можно применить формулу зависимости количества тактовых циклов процессора от коли
чества инструкций и СР1:
Я
Количество тактовых циклов процессоров = £ (6 7 7 , х С ).
г»1
Она дает нам следующий результат:
Количество тактовых циклов процессора, - (2 * 1) + (1 * 2) + (2 * 3) - 2 -*■2 + 6 ™
10 циклов.
Количество тактовых циклов процессора, = (4 * 1) + (1 х 2 ) + (1 хЗ) - 4 + 2 + 3 =
9 циклов.
Таким образом, последовательность 2 выполняется быстрее, несмотря даже на то, что для
нее выполняется на одну инструкцию больше. Поскольку выполнение кодовой последо
вательности 2 требует меньше общего количества тактовых циклов, но использует больше
инструкций, она должна иметь меньший показатель CPI. Значения CPI могут быть вычис
лены следующим образом:
Количество тактовых циклов процессора
CPI
Количество инструкций
Количество тактовых циклов процессора, Ю
ОТ, Z0.
Количество инструкций, 5
Количество тактовых циклов процессора, 9
СР12 1,5.
Количество инструкций, 6
Самое важное
В табл. 1.3 приведены основные оценочные показатели, используемые в ком
пьютере на различных уровнях, и единицы их измерения в кадетом конкретном
случае. Как эти факторы объединяются для получения времени выполнения,
измеряемого в секундах на программу, можно увидеть в следующей формуле:
Время - Количество секу нд на программу =
- Количество инструкций на программу х
х Количество тактовых циклов на инструкцию *
х Количество секунд на тактовый цикл.
должно сравниваться как количество инструкций, так и CPI, даже если использу
ется одна и та же тактовая частота. В конце этой главы приведены упражнения по
вычислению последовательности улучшений компьютера и компилятора, влияю
щих на тактовую частоту, CPI и количество инструкций. В разделе 1.8 будет рас
смотрена общая оценка производительности, не учитывающая все условия и поэто
му способная ввести вас в заблуждение.
Аппаратный
На что влияет? Как влияет?
компонент
Алгоритм На количество Алгоритм определяет количество инструкций, не
инструкций и, обходимых для выполнения исходной программы,
возможно, на а следовательно, и количество выполняемых процес
CPI сором инструкций. Алгоритм может также влиять на
CPI за счет предпочтения более медленных или бо
лее быстрых инструкций. Например, если алгоритм
использует больше операций с плавающей точкой,
это может привести к более высокому CPI.
Язык программиро На количество Язык программирования, естественно, влияет на
вания инструкций и количество инструкций, поскольку инструкции языка
на CPI транслируются в инструкции процессора, определя
ющие общее количество выполняемых инструкций.
Язык, е силу своих свойств, может также влиять на
CPI: например, язык с мощной поддержкой абстрак
ций данных (х примеру. Java) может потребовать
применения опосредованных вызовов, использую
щих более затратные, с точки зрения CPI, инструк
ции.
Компилятор На количество Эффективность работы компилятора влияет и на
инструкций и количество инструкций, и на среднее количество так
на CPI тов, приходящееся на одну инструкцию, поскольку
компилятор определяет ход трансляции инструкций
языка в инструкции процессора. Компилятор может
играть весьма сложную роль и осуществлять ком
плексное воздействие на CPI.
Архитектура набора На количество Архитектура набора команд воздействует на все
команд инструкций, на три аспекта производительности центрального
тактовую часто процессора, поскольку она влияет на инструкции,
ту и на CPI необходимые для выполняемой функции, на количе
ство циклов, необходимое для выполнения каждой
инструкции, и, о общем, на тактовую частоту про
цессора.
60 Глава 1. Компьютерные абстракции и технологии
Самопроверка
Некое приложение, написанное на языке Java, выполняется на настольном ком
пьютере за 15 секунд. Новый выпуск компилятора Java требует только 0,6 инструк
ции, генерировавшейся старым компилятором. Но, к сожалению, он повышает
показатель CPI в 1,1 раза. Каково ожидаемое ускорение выполнения программы
при использовании нового компилятора? Выберите правильный ответ из трех
приведенных ниже:
. 15x0,6
а ) --------- 8,2 с;
U
б) 15x0,6x1,1 - 9 ,9 с;
15x1,1
в) 27,5 с.
0,6
IX
с
5
с
1
к
Iс.
I-
с
С
Как можно было увеличить тактовую частоту в 1000 раз при увеличении потре
бляемой мощности в 30 раз? Потребляемая мощность может быть снижена за счет
снижения напряжения питания, что и происходило с появлением каждого нового
поколения технологии, а потребляемая мощность зависит от квадрата напряжения.
Обычно напряжение с появлением каждого нового поколения с нижалось на 15%.
За 20 лет напряжение питания снизилось с 5 до 1 В, поэтому потребляемая мощ
ность возросла лишь в 30 раз.
Упражнение
Относительная потребляемая мощность
Предположим, что идет разработка нового, более простого процессора, имеющего емкостную
нагрузку, составляющую 85% от емкостной нагрузки более сложного старого процессора.
Далее предположим, что у него имеется регулируемое напряжение питания, позволяющее
уменьшить напряжение по сравнению с прежним процессором на 15%. что приводит к 15%
снижению частоты. Как это повлияет на динамическую мощность?
Ответ
Мощностьм
Мощность^
_ (Емкостная нагрузка х 0,85) х (Напряжение х 0,85) х (Частота переключения х 0,85)
Емкостная нагрузка х Напряжение х Частота переключения
100
10
0
1978 1980 1982 1984 1986 1988 1990 1992 1994 1996 1998 2000 2002 2004 2006
Рис. 1.13. Прирост производительности процессоров с середины 19 8 0-х годов. В этом графике за точку отсчета взята производи
тельность компьютера VAX 11/780, оцененная с помощью контрольных задач SPECint (см. раздел 1.8). До середины 1980-х годов прирост
производительности процессоров зависел в основном от совершенствования технологий и составлял в среднем 25% в год. Увеличение с тех
нремен прироста производительности до почти 52% можно отнести на счет более совершенных архитектурных и организационных находок.
До 2002 года эю т годовой прирост производительности примерно был равен семи условным единицам. Производительность вычислений,
ориентированных на работу с числами с плавающей точкой, увеличивалась еще быстрее. Начиная с 2002 года ограничения, связанные с по
требляемой мощностью, доступностью распараллеливания на уровне инструкций и большого времени ожидания при обращении к памяти,
привели к замедлению прироста производительности монопроцессора до примерно 20% в год
1.6. Коренное изменение: переход от одного к нескольким процессорам 65
CIZ) Реаак
От 20 до 40
этапов обработки
Соединение □ НПИ
Тестер
пластины Реэак
с корпусом □ □HDD вафель
□□□□
□ □
Пае. 1.14. Процесс производства чипов. После нарезки из кремниевого кристалла необрабо
танные вафли проходят от 20 до 40 этапов для получения вафель со сформированной структурой
<см. рис 1.15). Вафли с нанесенной структурой проверяются тестером и на них помечаются
годные области. Затем вафля разрезается на пластины (см. рис. 1.15). На этом рисунке из одной
вафли получается 20 пластин, 17 из которых проходят проверку. (Крестик означает негодную
пластину.) Выход годных пластин в данном случае равен 17/20, или 85%, Затем годные пластины
соединяются с корпусами и проверяются еще раз перед поставкой изделий в корпусах потреби
телям. Эта финальная проверка выявила наличие одного плохого изделия
- Г ‘ |0;ггч;
K i'... ;. гг,. ^
^ а а ь й в в г г ... ^ ^
Г- ^
г .аВРЯИт г? г- г
I лп го п- it л . 3ДО±с: 1Ш
m w w fTrtu ti на ffi’
Щ Ш •[ Ш Ш Ш Г
Pmc . 1.15. 12-дюймовая (300 мм) вафля, состоящая из чипов AMD Opteron Х2, предше
ственников чипов Opteron Х4 (Courtesy AMD). Количество пластин на вафлю при 100% выходе
годной продукции равно 117. Несколько десятков частично закругленных чипов на границе вафли
являются негодными; их появление обусловлено тем. что проще создавать прямоугольные маски
для обработки кремния. Для этой пластины используется 90-нанометровая технология, то есть
самые маленькие транзисторы имеют размер примерно 90 нм (настоящие транзисторы меньше,
чем на этой фотографии)
70 Глава 1. Компьютерные абстракции и технологии
Выход ---------------------------------------------------------------------------
(1 + (Дефектов на площадь х Площадь пластины/2))2
Первое уравнение вывести несложно. Второе является приблизительным, поскольку
в нем не учтена площадь рядом с границей крутой вафли, на которой не помещаются
прямоугольные пластины (см. рис. 1.15). Последнее уравнение основано на эмпири
ческих предположениях, касающихся коэффициента выхода готовой продукции на
предприятиях по изготовлению интегральных микросхем, использует коэффициент,
связанный с числом важных этапов обработки.
Следовательно, в зависимости от уровня дефектности и размера пластины и вафли
стоимость обычно не имеет линейной зависимости от площади пластины.
метол обычно связан с тем, что при оценке компьютера используется набор кон
трольных задач —программ, специально подобранных для опенки производитель
ности. Контрольные задачи формируют рабочую нагрузку, которая, в соответствии
с надеждами пользователя, сможет предугадать реальную рабочую нагрузку.
Для создания стандартного набора контрольных задач для современных ком
пьютерных систем многими продавцами компьютеров финансируется и поддер
живается 1>бъединенная группа по оценке производительности вычислительных
систем — SPEC (System Performance Evaluation Cooperative). В 1989 году SPEC
начата свою деятельность с того, что солдата набор контрольных задач, предназна
ченных для оценки производительности процессоров (который сейчас называется
SPEC89), развитие которого прошло через пять поколений. Набор, относящийся
к самому последнему поколению — SPEC CPU2006, состоит из 12 контрольных
задач по работе с целыми числами (CINT2006) и 17 контрольных задач но работе
с числами с плавающей точкой (CFP2006). Контрольные задачи по работе с целы
ми числами варьируются от частей компилятора языка С, шахматных программ
и до имитатора квантового компьютера. Контрольные задачи по работе с числами
с плавающей точкой включают коды регулярных сеток для моделирования мето
дом конечных элементов, коды метода частиц дтя задач молекулярной динамики,
и редкие колы линейной алгебры для решения задач гидрогазодинамики.
В табл. 1.4 дано описание объединенных контрольных задач SPEC, и времени
их выполнения на процессоре Optcron Х4, а также показаны множители, опреде
ляющие это время выполнения: количество инструкций, CPI и время тактового
цикла. Обратите внимание па то, что показатели CPI различаются в 13 раз.
Чтобы упростить продажу компьютеров, группа SPEC решила выдавать отчет
в виде одного числа, являющегося результатом выполнения всех 12 контрольных
задач по работе с целыми числами. Оценки времени выполнения сначала норма
лизуются путем деления времени выполнения на эталонном процессоре на время
выполнения оцениваемого компьютера; эта нормализация дает оценку, называемую
SPECratio. преимущество которой в том, что более высокие числовые результаты
свидетельствуют о более высокой производительности (то есть, SPECratio является
величиной, обратной времени выполнения). Показатель CINT2006 или CFP2006
является суммарной оценкой, полученной пу
тем извлечения среднего геометрического по
казателей SPECratio. Рабочая нагрузка
Набор программ, запускаемых на компью
тере, который представлен либо существу
Уточнение. Когда два компьютера сравниваются ющей коллекцией приложений, использу
при помощи показателей SPECratio. использует емых пользователем, либо составлен из
ся среднее геометрическое, поскольку оно дает реальных программ, примерно соответ
одни и те же относительные ответы, независи ствующих такой коллекции. В 1 ипичной
мо от того, какой компьютер используется для рабочей на' руэке определяются как сами
нормализации результатов. Если бы усреднение программы, так и частота их использова
значений нормализованных показателей време ния.
ни выполнения проводилось с использованием Контрольная задача (BENCHMARK)
среднего арифметического, результаты разли Программа, отобранная для использова
чались бы в зависимости от того компьютера, ния при сравнении производительности
который выбирался бы в качестве эталона. компьютеров.
72 Глава 1. Компьютерные абстракции и технологии
Ю% 23 066 180
эч 0 141
Самопроверка
Основным фактором в определении стоимости интефатьной микросхемы является
объем выпуска. Какими нижеперечисленными причинами объясняется, почему
чип, выпушенный более крупной партией, должен стоить дешевле?
1. При больших объемах выпуска производственный процесс может быть настроен
на конкретную конструкцию, увеличивая процент выхода годной продукции.
2. На крупную партию приходится меньший объем конструкторских работ, чем
на мелкую.
3. Маски, используемые для производства чипов, стоят дорого, поэтому их стои
мость, приходящаяся на один чип, при больших объемах выпуска снижается.
4. Стоимость конструкторских разработок высока и сильно зависит от объема
производства, поэтому стоимость одной пластины с производством больших
партий изделий снижается.
5. Пластины крупносерийных партий обычно меньше по размеру, чем пластины
мелкосерийных партий, и поэтому у них более высокий выход годной продук
ции на вафлю.
Потреб
Потреб Потреб Потреб
Пиковая Потреб Потреб Потребле ление
Произво Всего ление ление ление
Микро Тактовая производи ление ление ние при
дитель "Двр/ при 50% при 10% при
процессор частота тельность при 100% при 50% при 10% за активном
сервера гнезд загрузке / загрузке / активном
(ssj_ops) загрузке загрузке грузке простое /
100% 100% простое
100%
НР Xeon Е5440 8/2 3.0 Гц 30В.022 269 W 227 W 84% 174 W 65% 160W 59%
Dell Хеоп Е5440 8/2 2,8 Гц 305,413 276 W 230 W 83% 173 W 63% 157 W 57%
Fujitsu Xeon Е3220 4/1 2,4 Гц 143.742 132W 110W 83% 85W 65% 80 W 60%
Seimens
78 Глава 1. Компьютерные абстракции и технологии
Самопроверка
Оценочный показатель Компьютер А Компьютер В
Количество инструкций 10 миллиардов 8 миллиардов
Тактовая частота 4 ГГц 4 ГГц
CPI 1,0 1,1
Самое важное
Единственным верным и безупречным оценочным показателем производитель
ности является время выполнения. Было предложено и востребовано множество
других оценочных показателей. Безупречность некоторых из них подвергалась
сомнению с самого начала, поскольку они не отражали время выполнения,
применение других, пригодных только при вполне определенных условиях,
расширялось и переносилось за пределы этих условий или осуществлялось без
дополнительных уточнений, позволяющих допустить их применение.
80 Глава 1. Компьютерные абстракции и технологии
1.10. Упражнения
Предоставлены Хавьером Бругейра
Упражнение 1.1
Найдите слово или фразу из представленного списка, наиболее соответствующую
писанию в приведенных ниже задачах. Используйте при ответах номера, стоящие
слева от слова. Каждый из ответов должен использоваться только один раз.
1.1.1 12] <1.1> Компьютеры, используемые для решения серьезных задач, до
ступ к которым осуществляется обычно через сеть.
1.1.2 [2] <1.1> 10,5или 2и байт.
1.1.3 [2] <1.1> Компьютеры, состоящие из нескольких сотен или тысяч про
цессоров и терабайтов памяти.
1.1.4 (2] <1.1> Сегодня зга сфера применения относится к области научной
фантастики.
1.1.5 [2] <1.1 > Тип памяти, который называется памятью с произвольным до
ступом.
1.1.6 [2] <1.1> Часть компьютера, называемая центральным процессорным
устройством.
1.1.7 [2] <1.1> Тысячи процессоров, формирующие большой кластер.
1.1.8 [2] <1.1> Микропроцессор, содержащий несколько процессоров на одном
и том же чипе.
1.1.9 [2] <1.1> Настольный компьютер без экрана или клавиатуры, доступ
к которому обычно осуществляется по сети.
1.1.10 [2| <1.1> Самый распространенный в настоящее время класс компью
теров, которые запускают одно приложение или один набор взаимосвязанных
приложений.
1.1.1112)<1.1> Специальный язык, используемый для описания компонентов
оборудования.
1.1.12 [2] <1.1> Персональный компьютер, предоставляющий неплохую произ
водительность отдельно взятому пользователю при умеренной стоимости.
1.1.13 [2] <1 2> Программа, транслирующая инструкции на языке высокого
уровня в инструкции языка ассемблера.
1.1.14 [2] <1 ,2> Программа, транслирующая символьные инструкции в двоич
ные инструкции.
1.1.15 [2] <1.2> Язык высокого уровня для обработки бизнес-информации.
1.1.16 [2] <1 ,2> Язык двоичных цифр, попятный процессору.
1.1.17 [2] <1 ,2> Команды, которые может понять процессор.
1.1.18 [2 ]<1.2> Язык высокого уровня для научных вычислений.
1.1.19 [2] <1 .2> Символьное представление инструкций машины.
1.1.20 |2] <1.2> Интерфейс между пользовательской программой и оборудо
ванием, предоставляющий множество различных служб и контрольных функций.
1.1.21 [2] <1 .2> Программное обеспечение или программы, разработанные
пользователями.
1.1.22 [2] <1.2> Двоичный разряд (со значением 0 или 1).
1.1.23 [2] <1.2> Уровень программного обеспечения (операционная система
и компиляторы), который находится между прикладным программным обеспече
нием и оборудованием.
1.1.24 [2] <1.2> Язык высокого уровня, используемый для написания прило
жений и системного программного обеспечения.
1.1.25 [2] <1.2> Переносимый язык, состоящий из слов и алгебраических вы
ражений, которые перед запуском на компьютере должны быть переведены на
язык ассемблера.
1.1.26 f2| <1.2> 10IJ или 240 байт.
1.10. Упражнения 83
У п р а ж н е н и е 1.2
1.2.1 [ 10] <1.3> Каким должен быть размер (в байтах) буфера кадра цветного дис
плея, использующего по 8 бит для каждого из основных цветов (красного, зеленого,
синего) на пиксел и имеющего разрешение экрана 1280 к 800 пикселов?
1.2.2 [5] <1.3> Если у компьютера имеется 2 Гбайт оперативной памяти и если
предположить, что в ней не будет содержаться никакая другая информация, то
сколько кадров она может вместить?
1.2.3 |5] <1.3> Если компьютеру, подключенному к сети Ethernet с пропускной
способностью в 1 гигабит в секунду, нужно передать файл объемом 256 Кбайт, то
сколько это займет времени?
1.2.4 [5] <1.3> Если предположить, что кэш-память в десять раз быстрее DRAM-
памяти. которая, в свою очередь, в 100 000 раз быстрее памяти на магнитном диске,
а флэш-память в 1000 раз быстрее памяти на магнитном диске, то сколько времени
займет чтение файла из DRAM-памяти, с диска и с флэш-памяти, если чтение этого
файла с кэш-памяти занимает 2 мкс?
У п р а ж н е н и е 1 .3
Предположим, что три разных процессора: PI, Р2 и РЗ - выполняют один и тот же
набор инструкции, имея при этом тактовые частоты и показатели CPI, указанные
в таблице:
1.3.5 [5] <1.4> Определите тактовую частоту процессора Р2, которая сравняет
показатели времени работы с показателями процессора Р1.
1.3.6 [5|< 1 4> Определите количество инструкций для процессора Р2, которое
его время до процессора РЗ.
У п р а ж н е н и е 1.4
Рассмотрим две различные реализации одной и той же архитектуры набора ин
струкций.
Существует четыре класса инструкций: А, В, С и D. Тактовые частоты и CPI
каждой реализации показаны в таблице:
Тактовая
CPI класс А СР1 класс В CPI класс С CPI класс D
частота
Р1 1,5 ГГц 1 2 3 4
Р2 2 ГГц 2 2 2 2
У п р а ж н е н и е 1.5
Рассмотрим две различные реализации Р1 и Р2 одного и того же набора инструкций.
Инструкции в наборе относятся к одному из пяти классов (А, В, С, D и Е).
Тактовая частота каждой реализации и ее показатель СР1 для каждого класса по
казаны в таблице:
1.10. Упражнения 85
Число инструкций
1.5.4 [5] <1 А> Предположим, что вычисления осуществляются за один так
товый цикл, инструкции загрузки и сохранения требуют по 10 тактовых циклов,
з ветвление осуществляется за 3 тактовых цикла. Определите время выполнения
каждой программы на M IPS-процессоре с тактовой частотой 3 ГГц.
1.5.5 (5) <1.4> Предположим, что вычисления осуществляются за один так
товый цикл, инструкции загрузки и сохранения требуют по 2 тактовых цикла,
а ветвление осуществляется за 3 тактовых никла. Определите время выполнения
каждой программы на МIPS-процессоре с тактовой частотой 3 ГГц.
1.5.6 [5J <1 ,4> Предположим, что вычисления осуществляются за один так
товый цикл, инструкции загрузки и сохранения требуют по 2 тактовых цикла,
j ветвление осуществляется за 3 тактовых цикла. Каким тогда будет ускорение
выполнения программы, если количество инструкций вычисления удастся со
кратить в два раза?
86 Глава 1. Компьютерные абстракции и технологии
У п р а ж н е н и е 1 .6
Компиляторы могут окалывать существенное влияние на производительность при
ложений на отдельно взятом процессоре. В этом упражнении будет исследоваться
влияние компиляторов на время выполнения.
Компилятор А Компилятор В
I 6.1 [5] <1 4> Для одной и той же программы использовались два разных
компилятора. В расположенной выше таблице показано время выполнения двух
программ, полученных на выходе разных компиляторов. Определите средний пока
затель CPI для каждой программы при условии, что продолжительность тактового
цикла процессора составляет 1 нс.
1.6.2 [5] <1.4> При средних показателях CPI, определенных в упражнении 1.6.1,
скомпилированные программы запускаются на двух разных процессорах. Если
время выполнения на двух процессорах одно и то же, то на сколько выше такто
вая частота процессора, на котором запущен код, выданный компилятором А, по
сравнению с тактовой частотой процессора, на котором запущен код, выданный
компилятором В?
1.6.3 |5) <1.4> Разработан новый компилятор, который выдает только 600 мил
лионов инструкций и имеет средний показатель CPI 1,1. Каким будет ускорение
при использовании этого нового компилятора по сравнению с использованием
компиляторов Л или В на исходном процессоре из упражнения 1.6.1?
Рассмотрим две разные реализации одного и того же набора инструкций: Р1
и Р2. В этом наборе существует пять классов инструкций (А, В, С, D и Е). Про
цессор Р1 имеет тактовую частоту14 ГГц, а процессор Р2 имеет тактовую частоту
6 ГГц. Среднее количество циклов для каждого класса инструкций для Р1 и Р2
перечислено в таблице:
Е Б 4
1.10. Упражнения 87
У п р а ж н е н и е 1 .7
В таблице показано увеличение тактовой частоты и потребляемой мощности вось
ми поколений процессоров Intel за 28 лет:
Процессор Тактовая частота Потребляемая мощность
80286(1982) 12,5 МГц 3,3 Вт
80386(1985) 16 МГц 4,1 Вт
80486(1989) 25 МГц 4,9 Вт
Pentium (1993) 66 МГц 10.1 Вт
Pentium Pro (1997) 200 МГц 29.1 Вт
Pentium 4 Willamette (2001) 2 ГГц 75.3 Вт
Pentium 4 Prescott (2004) 2 ГГц 103 вт
Core 2 Ketsfield (2007) 2.667 ГГц 95 Вт
У п р а ж н е н и е 1 .8
Предположим, что нами разработаны новые версии процессора со следующими
характеристиками:
Емкостное сопро
Напряжение питания Тактовая частота Площадь
тивление
1 1/2 2-..г
У п р а ж н е н и е 1 .9
Хотя основным источником рассеиваемой мощности в CMOS является динамиче
ское энергопотребление, статическое энергопотребление формируется за счет тока
утечки: V к Чем меньше размеры элементов чипа, тем более существенным
является статическое энергопотребление. Предположим, что имеются данные по
1.10. Упражнения 89
1.9.1 [5] <1 ,5> Определите процентное отношение от всей рассеиваемой мощ
ности, приходящееся на статическое энергопотребление.
1.9.2 [5] <1.5> Если статическое энергопотребление зависит от тока утечки,
Р - V* I , определите ток утечки для каждой технологии.
1.9.3 [5] <1 .5> Определите соотношение статического и динамического энер
гопотребления для каждой технологии.
Теперь рассмотрим динамическую рассеиваемую мощность различных версий
заданного процессора для трех различных напряжений питания согласно следую
щем таблице:
1.9.4 [5| <1 ,5> Определите статическое энергопотребление для каждой версии
при напряжении питания 0,8 В, приняв за коэффициент соотношения статического
и динамического энергопотребления значение 0,6.
1.9.5 [5] <1.5> Определите ток утечки для каждой версии при напряжении
питания 0,8 В.
1.9.6 [10] <1.5> Определите наибольшее значение двух токов утечки при напря
жениях питания 1,0 В и 1,2 В, приняв за коэффициент соотношения статического
и динамического энергопотребления значение 1,7.
У п р а ж н е н и е 1 .1 0
В таблице показано распределение инструкций заданного приложения, ныполня-
- мого на 1, 2, 4 или 8 процессорах. Используя эти данные, вы будете исследовать
ускорение работы приложений на параллельных процессорах:
Арифм.
Загр./
сохран.
Ветвле
ния
Арифм.
CPI
З агр ./
сохран.
Ветвле
ния
4 640 320 64 1 4 2
8 320 160 32 1 4 2
90 Глава 1. Компьютерные абстракции и технологии
8 600 500 32 1 13 2
1.10.4 [10] <1.4, 1.6> Предположим, что тактовая частота равна 3 ГГц, тогда
каким будет время выполнения программы с использованием 1,2,4 или 8 ядер?
1.10.5 [10] < 1.5,1.6> Предположим, что потребляемая мощность процессорного
ядра может быть описана следующим уравнением:
5 0 мА
Мощность = ---------Напряжение питания,
МГц
1.10. Упражнения 91
в котором частота измеряется в гигагерцах. Таким образом, при частоте 5 ГГц на
пряжение питания будет равно 1,4 В. Определите потребляемую мощность при
Выполнении программы на 1,2,4 и 8 ядрах, предполагая, что каждое ядро работает
на тактовой частоте 3 ГГц. Таким же образом определите энергопотребление при
выполнении программы на 1,2,4 или 8 ядрах, предполагая, что каждое ядро рабо
тает на частоте 500 МГц.
1.10.6 [10] < 1 .5 ,1.6> Определите затраты энергии при выполнении программы
на 1, 2, 4 и 8 ядрах, предполагая что каждое ядро имеет тактовую частоту 3 ГГц
и 500 МГц. Воспользуйтесь уравнением потребляемой мощности из упражнения
1.10.5.
У п р а ж н е н и е 1.11
В следующей таблице даны сведения для разных процессоров:
T1 Т2 тз Т4
Упражнение 1.12
В следующей таблице показаны результаты выполнения контрольных задач
SPEC2006 на процессоре AMD Barcelona:
Количество ин
Название Время выполнения (с) Эталонное время (с)
струкций к 10*
а peri 2118 500 9770
б mef 336 1200 9120
1.12.4 [5) <1 .7> Определите увеличение процессорного времени при увеличе
нии количества инструкций контрольных задач на 10%. которое не оказало ника
кого влияния на СР1.
1.12.5 [5] <1.7> Определите увеличение процессорного времени при увеличе
нии количества инструкций контрольных задач на 10% и увеличении показателя
CPI н а 5%.
1.12.6 [5) <1.7> Определите изменение SPECratio для изменений, описанных
в упражнении 1.12.5.
Упражнение 1.13
Предположим, что мы разрабатываем новую версию процессора AMD Barcelona
с тактовой частотой 4 ГГц. Мы добавили к набору новые инструкции, но при этом
сократили их общее количество на 15% от тех значений, которые были показаны
для каждой контрольной задачи в упражнении 1.12. Полученное время выполнения
показано в таблице:
Упражнение 1.14
В разделе 1.8 рассматривалось заблуждение, касающееся использования для оценки
производительности подгруппы уравнений производительности. Чтобы проил
люстрировать это положение, рассмотрим следующие данные по выполнению на
разных процессорах заданной последовательности из 10е инструкций:
Упражнение 1.15
Еще одно заблуждение, упомянутое в разделе 1.8, заключается в ожидании увели
чения общей производительности компьютера за счет улучшения только одной
из его компонент. Такое может произойти, но не всегда. Рассмотрим компьютер,
выполняющий программы с процессорными временами, приведенными таблице:
Целочислен
Инстр. с плав, Инструкции Инструкции Общее
ные
точкой эагр ./со хр . ветвления время
инструкции
а 35 с 85 с 50 с 30 с 200 с
б 50 с 80 с 50 с 30 с 210с
1.15.1 [5] <1.8> На сколько сократится общее время, если время для операций
с плавающей точкой будет сокращено на 20%?
1.15.2 [5] <1.8> Н асколько сократится время выполнения целочисленных
операций, если общее время сократится на 20%?
1.15.3 [5] <1.8> Может ли общее время сократиться на 20% за счет сокращения
одного только времени на выполнение инструкций ветвления?
В следующей таблице показано распределение инструкций по типам для каж
дого процессора при выполнении заданного приложения на различном количестве
процессоров:
Кол-во Инстр. Цело- Инстр. CPI CPI CPI
Инстр. CPI
процес с плав, числ. з а гр ./ (с плав, (цело- (э а гр ./
ветвл. (ветвл.)
соров точкой инстр. сохр. точкой) числ.) сохр.)
а 1 560 х 10* 2000 х ю * 1280 х 10* 256 х 10* 1 1 4 2
б 8 80 х 10* 240 х 10* 160 х 10” 32 х 10* 1 1 4 2
1.15.4 [ 10] <1.8> На сколько нужно улучшить показатель CPI для инструкций
с плавающей точкой, если требуется, чтобы программа работала в два раза быстрее?
1.15.5 (10] <1.8> На сколько нужно улучшить показатель CPI для инструк
ций загрузки-сохранения, если требуется, чтобы программа работала в два раза
быстрее?
1.15.6 [5] <1.8> На сколько сократится время выполнения программы, если
показатель СР1 для целочисленных инструкций и инструкций с плавающей точ
кой сократится на 40%. а показатель СР1 для инструкций загрузки-сохранения
и инструкций ветвления сократится на 30%?
У п р а ж н е н и е 1. 1 6
Кт е одно заблуждение, касающееся выполнения профамм на многопроцессорных
системах, заключается в ожидании повышения производительности за счет сокра
щения времени выполнения только части подпрограмм. В таблице показано время
выполнения пяти подпрограмм, запущенных на разном количестве процессоров.
1.16.1 (10] <1.8> Определите общее время выполнения и степень его сокраще
ния. если время выполнения подпрограмм Л, С и Е будет сокращено на 15%.
1.16.2 [10] <1.8> На сколько сократится общее время, если время выполнения
подпрограммы В сократится на 10%?
1.16.3 [10] <1.8> На сколько сократится общее время, если время выполнения
подпрофаммы D сократится на 10%?
Время выполнения в многопроцессорной системе может быть разбито на время
вычисления подпрограмм плюс время, затрачиваемое на обмен данными между
процессорами (время маршрутизации). Рассмофим показатели времени выполне
но! и времени маршрутизации, представленные в таблице. В данном случае время
маршрутизации является важным компонентом общего времени.
2 20 78 9 65 4 11
4 12 44 4 34 2 13
Г ”
8 1 23 3 19 3 17
16 4 13 1 10 2 22
32 2 5 1 5 1 23
64 1 3 0,5 1 1 26
96 Глава 1. Компьютерные абстракции и технологии
2.1. Введение
Чтобы управлять компьютерным оборудованием, нужно говорить на его языке.
Слова компьютерного языка называются инструкциями, а его словарь называется
98 Глава 2. Инструкции: язык компьютера
add а . Ь. с
нен тому, что такое «переменная*, оставив это для следующего раздела.)
Сумма четырех переменных получается в результате выполнения следующей
последовательности инструкций:
т* а. Ь. с # Сунна Ь и с поиеяаесся в а
r id a. a. d # Теперь в а буд ет сунна Ь. с и d
:Jd а. а. е # А теперь в а б уд ет сунна b. с, d и е.
Операнды MIPS
Название Пример Комментарии
Категория
Инструкции Пример Значение Комментарии
инструкций
load byte lb $s1,20($s2) Ss1 = Memory [$s2 + 20) Байт из памяти в ре
(загрузка гистр
байта)
load byte Ibu $s1.20($s2) Ss1 = Memory[$s2 + 20) Байт из памяти в ре
unsigned гистр
(загрузка
байта без
знака)
store byte Sb $s1,20($s2) Memory[$s2 + 20] * $s1 Байт из регистра
(сохранение в память
байта)
load linked II $s1,20($s2) $st = Memory[$s2 + 20) Загрузка слова
word в качестве первой
(загрузка половины атомарного
связанного обмена
слова)
store condi sc $s1,20($s2) Memory[$s2+20]=$s1; Сохранение слова
tion. word $s1=0 или 1 в качестве второй
(сохранение половины атомарного
условного обмена
слова)
load upper lui Ss 1,20 $st = 2 0 * 2 " Загрузка константы
immed. в верхние 16 раз
(непосред рядов
ственная
загрузка
в верхние
разряды)
Логические and and $s1 = $s2 & $s3 Трехрегистровые
(И) $s1,Ss2,$s3 операнды;
поразрядное И
or or $s1.$s2,Ss3 $s1 = $s2 | $s3 Трехрегистровые
(ИЛИ) операнды;
поразрядное ИЛИ
пот nor Ss1 ■ - ($s2 | $s3) Трехрегистровые
(исключаю $s1,$s2,$s3 операнды;
щее ИЛИ) поразрядное исклю
чающее ИЛИ
and immedi andi $s1,$s2.20 Ssl = $s2 & 20 Поразрядное И реги
ate стра и константы
(непосред
ственное
.И»)
or immediate orl Ss1,$s2,20 $s t = $s2 I 20 Поразрядное ИЛИ
(непосред регистра и константы
ственное
.ИЛИ»)
102 Глава 2. Инструкции: язык компьютера
Категория
Инструкции Пример Значение Комментарии
инструкций
shift left logi sll $s1,$s2,10 Sst = $s2 « 10 Сдвиг влево на кон
cal станту
(логический
сдвиг влево)
shift right srl Ss!,$s2.10 Ssl = $ s 2 > > 10 Сдвиг вправо на
logical константу
(логический
сдвиг впра
во)
Условного branch on beq $s1,$s2,25 if (Ssl == $s2) go to Тест на равенство;
ветвления equal P C + 4 + 100 ветвление, связанное
(ветвление со счетчиком команд
при равен
стве)
branch on not bne Ss1,$s2,25 if (S s ll- $ s2)goto Тест на неравенство,
equal PC ♦ 4 + 100 ветвление, связанное
(ветвление со счетчиком команд
при нера
венстве)
set on less sit $s1,$s2,$s3 if (Ss2 < $s3) Ssl = 1; Сравнение -меньше
than (уста else Ssl = 0 чем»; для beq, bne
новить, если
меньше чем)
set on less situ $s1,Ss2,$s3 if (Ss2 < $s3) Ssl = 1; Сравнение -меньше
than un else Ssl > 0 чем» без знака
signed
(установить,
если мень
ше, чем без
знака)
set less than slti Ssl ,$s2,20 if ($s2 < 20) Ssl = 1; Сравнение -меньше
immediate else $s 1 = 0 чем» с константой
(установить,
если непо
средственно
меньше чем)
set less than sltiu $sl,$s2 20 if (Ss2 < 20) Ss1 = 1; Сравнение -меньше
immediate else Ssl = 0 чем» с константой,
unsigned без знака
(установить,
если непо
средственно
меньше, чем
без знака)
2.2. Операции, осуществляемые компьютерным оборудованием 103
Категория
Инструкции Пример Значение Комментарии
инструкций
Безуслов jump 1 2500 go to 10000 Переход no указанно
ного пере- (перейти) му адресу
хода
jump register jr Sra go to $ra Для переключения:
(перейти по возвращение из про
регистру) цедуры
jump and link jal 2500 $ra = PC 4; go to Для вызова проце
(меренги 10000 дуры
и сделать
ссылку)
Ответ
МIPS-инструкция работает с двумя исходными операндами и помещает результат в один
целевой операнд. Следовательно, две простые инструкции, показанные выше, компилиру
ются в следующие две инструкции языка ассемблера MIPS:
ado а. о с
sub d. а. е
Упражнение
Компиляция сложной инструкции на языке С в MIPS-код
В относительно сложной инструкции содержится пять переменных —f, g, и, i и ,j:
Г - (д + И) - (1 ♦ j):
Каким будет итог работы С-компилятора?
104 Глава 2. Инструкции: язык компьютера
Самопроверка
В каком языке профаммиронании потребуется больше строк кода для отдельно
взятой функции? Выстройте указанные ниже языки в нужном порядке.
1. Java.
1. С.
2. Язык ассемблера MIPS.
Упражнение
Компиляции присваивания на языке С с использованием регистров
Задача связывания переменных программы с регистрами возлагается на компилятор. Возь
мем. к примеру, инструкцию присваивания из нашего
прежнего примера:
Слово
f - (g ♦ h) - (1 ♦ j); ! Естественная единица размера памяти
Переменные f, g, h,' и j назначаются соответственно в компьютере, обычно это группа из 32 раз
регистрам $s0, Ssl, »$2, Is3 и $s4. Как будет выглядеть рядов. соответствующая размеру регистра
MIPS-код, полученный в результате компиляции? в MIPS-архитектуре.
106 Глава 2. Инструкции: язык компьютера
Ответ
Откомпилированная программа очень похожа на предыдущий пример, за исключением
того, что мы заменяем переменные именами упомянутых ранее регистров и дополнительно
используем два временных регистра. StO и $tl, которые соответствуют показанным выше
временным переменным:
add StO.Ssl.Ss2 # регистр StO содержи- g + h
аос Stl.Ss3.$s4 # регистр $tl содержит i + j
sub SsO.StO.Stl # f получает значение StO - S tl. которое равно (g + h)-(i + j )
Операнды памяти
В языках программирования имеются, как в этих примерах, простые переменные,
содержащие элементы данных, но есть также и более сложные структуры дан
ных, например массивы. Эти сложные структуры данных могут содержать боль
ше элементов данных, чем количество регистров в компьютерах. Как компьютер
может представить такие крупные структуры и получить к ним доступ?
Вспомним пять компонентов компьютера, которые были представлены в главе 1
и повторно показаны в начале данной главы. Процессор может хранить в регистрах
только небольшой объем данных, но компьютерная память содержит миллиарды
элементов данных. Следовательно, структуры данных (массивы и структуры)
хранятся в памяти.
Как ранее объяснялось, арифметические операции проводится в M IPS-
инструкииях только с регистрами, следовательно, М IPS-ассемблер должен вклю
чать инструкции, переносящие данные между памятью и регистрами. Такие ин
струкции называются инструкциям и переноса данных. Д ля доступа к слову
в памяти инструкции нужно предоставить адрес памяти. Память — это просто
большой одномерный массив, в котором адрес ведет себя как индекс этого массива,
начинаясь с 0. Например, на рис. 2.1 третий элемент данных имеет адрес 2. а значе
ние элемента Метогу(2] равно 10.
3 100
2 10
1 101
0 1
Адрес Данные
Процессор Память
Рис. 2 .1 . Адреса и содержимое памяти по этим адресам. Если бы эти элементы были сло
нами, данные адреса были бы неправильным и, поскольку в MIPS обычно используется байтовая
адресация, где каждое слово представлено четырьмя байтами На рис. 2.2 показана адресация
памяти для последовательной пословной адресации
2.3. Операнды компьютерного оборудования 107
Упражнение
Компиляция присваивания, когда операнд находится в памяти
Предположим, что А —массив из 100 слов, и компилятор, как и раньше, связал переменные
3 и h с регистрами Ssl и Ss2. Также предположим, что стартовый, юти базовый, адрес массива
ааходится в регистре $$3. Откомпилируйте эту инструкцию присваивания на языке С:
д • Л * А[8];
Отпет
Хотя в этой инструкции присваивания содержится всего одна операция, один из операндов
находится в памяти, поэтому сначала нужно перенести А[8] в регистр. Адресом этого эле
мента массива является сумма балы массива А, которая находится в регистре Js3, и номера
выбранного элемента В. Данные должны быть помещены во временный регистр, чтобы их
можно было использовать в следующей инструкции, На основе схемы, изображенной на
рис. 2.1, первой инструкцией, выданной компилятором, будет
l w St0.8(*s3) # Вревеиный регистр StO получает А(8]
(Далее мы слегка подправим эту инструкцию, но пока будем пользоваться этой упрощенной
версией.) Следующая инструкция может работать со значением ПО (которое равно А[8]),
поскольку это регистр. Инструкция должна прибавить значение h (содержащееся в Js2) к
48] (НО) и поместить сумму в регистр, соответствующий переменной g (которая связана
с Ssl):
add Ssl.$s2.StO # g • h + A(8]
Константа в инструкции переноса данных (8) называется смещением (offset), а регистр, при
бавляемый для формирования адреса (Ss3), называется базовым регистром (base register).
*л*иг/л«*«*г**?**«»•лмчмчдоэ*.;
Интерфейс аппаратного и программного обеспечения
Кроме связывания переменных с регистрами, компилятор распределяет для струк
тур данных вроде массивов место в памяти. Затем компилятор может поместить со
ответствующий стартовый адрес в инструкции
переноса данных. Инструкция переноса данных
Команда, которая перемещает данные
Поскольку но многих программах применяются между памятью и per истрами.
восьмибитные байты, большинство архитектур
Адрес
осуществляют адресацию отдельных байтов. Значение, используемое для описания ме
Поэтому адрес слова соответствует адресу од стоположения конкретного элемента дан
ного из четырех байтов этого слова, а адреса ных в массиве памяти.
108 Глава 2. Инструкции: язык компьютера
Процессор Память
Рис. 2 .2 . Реальная адресация памяти я MIPS и содержимое памяти для этих слов. Из
мененные адреса выделены, чтобы отличаться от тех, что были показаны на рис. 2.1. Поскольку
в MIPS адресуется каждый байт, адреса слов кратны четырем: в слове содержится 4 байта
1 Точнее, при использовании адресации big-endian сами байты слова в памяти располагаются
в обратном порядке: старший байт имеет меньший адрес (который и является адресом
слова), а младший —имеет наибольший адрес (адрес слова + 3 для 32-разрЯДНОГОслова).
Примеч. ред.
2.3. Операнды компьютерного оборудования 109
Упражнение
Компиляция с использованием загрузки и сохранения
Предположим, что переменная ь связана с регистром »$2, а базовый адрес массива А хранится
в регистре ИЗ. Какой код МIPS-ассемблера будет создан для следующей инструкции при
сваивания на языке С?
АС123 ■ h ♦ А[8];
Ответ
Хотя в С-инструкции прописана только одна операция, теперь два операнда находятся
в памяти, поэтому нам нужны дополнительные MIPS-инструкции. Первые две инструкции
такие же, как и в предыдущем примере, за исключением того, что на этот рал в инструкции
загрузки слова для выбора А[8) используется правильное смещение для байтовой адресации
я инструкция add помещает сумму в регистр КО:
1и $tO,32(Js3) # Вречемньй регистр НО получает А[8]
add JtO.$s2.HO # Зреиемньй регистр НО получает h + А18]
Заключительная инструкция сохраняет сумму в А[12], используя в качестве смещения 48
(4 к 12) и в качестве базового регистра ИЗ.
$ш H0,48($s3) # Сохранение h ♦ А[8] в АС12]
Самопроверка
Говоря о важности регистров, как можно оценить темпы увеличения количества
регистров на чипе?
1. Как очень высокие: их количество увеличивалось согласно закону Мура, кото
рый предсказал удвоение количества транзисторов на чипе каждые 18 месяцев.
2. Как оцень низкие: поскольку программы обычно распространяются на языке
компьютера, архитектура набора команд обладает высокой инерционностью,
и поэтому количество регистров увеличивается только с вводом в действие
нового набора инструкций.
2.4. Числа со знаком и без знака 111
Уточнение. Хотя регистры MIPS в этой книге представлены как 32-разрядные, су
ществует и 64-разрядная версия набора инструкций MIPS, имеющая тридцать два
64-разрядных регистра. Чтобы не создавать путаницы, официально разные наборы на
зываются MIPS-32 и MIPS-64. В данной главе будет использоваться поднабор MIPS-32.
пень основания. Для десятичных чисел мы будем использовать нижний индекс 10,
а для двоичных — 2. Например,
1011г
представляет собой
(1 * 2J) + (0 * 2г) + (1 * 2') + (1 * 2%
- <1 * 8) + <0 * 4) + ( 1 * 2 ) + (1 * 1)10
- (8 + 0 + 2 ♦ 1)„
30 29 2 в |г7 26 25
24|23 22 21 20 • 19 16 17 1б| 15
14 13 « |и 10
9 В| 7 6 5 4 |з 2 1 0 |
г 1
о
о
0 0 1 0 1 1
О
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
о
0 0
(32 разряда)
1111 1111 1111 1111 1111 1111 1111 1101, - 4 294 967 293|е
1111 1111 1111 1111 1111 1111 1111 1110, ^ 4 294 967 294|f
1111 1111 1111 1111 1111 1111 1111 l l l l j - 4 294 967 295„
То есть 32-разрядные двоичные числа могут быть представлены в понятиях
двоичного значения, умноженного на степень числа 2 (здесь хi означает t-тый бит
числа .г):
(х31 к 2Э|) + (дгЗО * 230) + (д:29 х 2я ) + . . . + (х1 х 2’) + (лО х 2°)
Следует помнить, что комбинации двоичных разрядов, представленные выше,
это всего лишь представления чисел. На самом деле числа имеют бесконечное
количество цифр, почти все из которых представлены нулем, за исключением
всего нескольких самых правых цифр. Просто обычно лидирующие нули не по
казываются.
Может быть разработано оборудование,
Младший бит предназначенное для сложения, вычитания, ум
Самый правый разряд MIPS-слова. ножения и деления этих комбинаций двоичных
Старший бит разрядов. Если число, являющееся результатом
Самый левый разряд MIPS-cnoea. таких операций, не может быть представлено
2.4. Числа со знаком и без знака 113
ш iin п и i n i н и п и i n i h o i , = -з,с
л: п и п и н и п и п и п н н ю , - -2„
ДЛ. 1111 11111111 1111 1111 1111 1101, - -1„
У двоичного дополнения есть одно отрицательное число. 2 147 483 648)0, у ко
торого нет соответствующего положительного числа. Подобный дисбаланс также
был бедой невнимательного программиста, но использование знака и абсолютного
значения создавало проблемы как для программиста, так и для разработчика обо
рудования. В результате всего этого каждый современный компьютер использует
для представления чисел со знаками дополнение до двух.
Представление с дополнением до двух имеет то преимущество, что все отрица
тельные числа содержат единицу в старшем разряде. Следовательно, оборудованию
приходится проверять только этот бит, чтобы узнать, отрицательное данное число
или положительное (число нуль считается положительным). Этот разряд часто
называют маковым разрядом. Понимая назначение знакового разряда, мы можем
представить положительные и отрицательные 32-разрядиые числа в понятиях
значения разряда, умноженного на степень числа два:
( г 51 к - 2 31) + ( jc30 х 2 » ) + ( х » х 2 » ) + . . . ■*- ( * ' х 2 ') + (л * х 2°)
Упражнение
Перевод двоичных чисел в десятичные
Каково десятичное значение этого 32-разрядного числа с дополнением до двух?
1111 1111 1111 1111 1111 1111 1111 1100.
Ответ
•пражнение
Этвет
2 - 0000 0000 0000 ОООО ОООО ОООО ОООО 0010,
Инвертируйгс это число путем инвертирования битов и прибавления единицы;
1111 1111 1111 1111 1111 1111 1111 1101,
♦ Ц
- 1111 1111 1111 1111 1111 1111 1111 1110,
- Л
Чтеперь проделайте все в обратном направлении
1111 1111 1111 1111 1111 1111 1111 1110,.
начала инвертировав разряды, а потом прибавив единицу:
0000 0000 0000 0000 0000 0000 0000 0001 ,
♦ 1,
- 0000 0000 0000 ОООО 0000 0000 0000 0010,
Упражнение
Прием расширения знака
Преобразуйте 16-разрядную версию чисел 210и - 2 |3 в 32-разрядные двоичные числа.
Ответ
16-разрядная двоичная версия числа 2 имеет следующий вид:
0000 0000 0000 0010 , - 2„
Преобразование в 32-разрядное число осуществляется путем создания 16 копий значений
старшего разряда (0) и помещения их в левую половину слова. Правая половина слова
получает старое значение:
0000 0000 0000 0000 0000 0000 0000 001010 • 2„
Теперь инвертируем 16-разрядную версию числа 2, используя первый короткий прием. Итак,
0000 0000 0000 оою:
превращается в
1111 1111 1111 1101.
* 1»
- 1111 1111 1111 1110,
Создание 32-разрялной версии отрицательного числа означает копирование знакового раз
ряда 16 рал и помещение результата в левую часть:
1111 1111 1111 1111 1111 1111 1111 1 1 1 0 ,- -2|и
Краткие выводы
Главное, на что обращалось внимание в данном разделе, заключается в том, что
в компьютерном мире нам нужно представление как положительных, так и отри
цательных целых чисел, и, несмотря на все «за» и «против» различных вариантов,
с 1965 года стало преобладать дополнение до двух.
Самопроверка
Каким будет десятичное значение этого 64-разрядного числа с дополнением до
двух?
1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1000.
2.4. Числа со знаком и без знака 117
1- -4,о
2- - 8 10
з- -1 б 10
4. 18 446 744 073 709 551 609,0
Упражнение
Трансляция инструкций ассемблера MIPS в инструкции машины
Давайте в качестве примера сделаем следующий шаг в освоении языка MIPS. Мы покажем
версию инструкции настоящего языка MIPS, выраженную в символьном виде
аХ StO.tsl.Ss2
сначала как комбинацию десятичных чисел, а затем как комбинацию двоичных чисел.
Ответ
17 18 8 0 32
Каждая из этих частей инструкции называется полем. Первое и последнее поля (которые
в данном случае содержат 0 и 32) в комбинации сообщают MIPS-компьютеру, что эта ин
струкция выполняет сложение. Второе поле предоставляет номер регистра, являющегося
для операции сложения первым операндом-источником (17 - Ssl), а грстьс поле предостав
ляет для сложения второй операнд-источник (18 - ts2). Четвертое поле содержит номер
регистра, получающего сумму (8 = КО). Пятое поле в данной инструкции нс используется,
поэтому оно установлено в нуль. Таким образом, данная инструкция складывает регистр tsl
с регистром $s2 и помещает сумму в регистр StO.
Эта инструкция может быть также представлена в виде полей не десятичных, а двоичных
чисел:
16 2 16 2 16 2 16 2
Ответ
Для ответа достаточно посмотреть в табл. 2.2 и одном направлении:
еса8 6420 16
4*1 >)>,
*' 1357 9bdf ,6
Поля MIPS
Чтобы их проще было рассматривать, полям MIPS присвоили имена:
ор re rt rd sham t fu n ct
6 разрядов 5 разрядов 5 разрядов 5 разрядов 5 разрядов 6 разрядов
цементов из массива или структуры данных, и зачастую она должна быть больше
•пела 32. Это 5-разрядное поле слишком мало для этих целей.
Получается, что у нас возник конфликт между желанием сохранить для всех
'нструкций одну и ту же длину и желанием иметь единый формат инструк-
:ин. Это подводит нас к заключительному принципу конструирования оборудо-
зания:
"оинцип конструирования 4: хорошая конструкция требует удачных компромиссов.
Константа или
ор rs rt
адрес
6 разрядов 5 разрядов 5 разрядов 16 разрядов
Упражнение
Ответ
ор rs rt rd address/sham t fu n ct
35 9 8 1200
0 18 8 8 0 32
43 9 8 1200
Инструкция lw инден тифицируется числом 35 (см. табл. 2.3) в первом поле (ор). Базо
вый регистр 9 (t tl ) указан во втором поле (rs), а регистр назначения 8 (StO) указан в тре
тьем поле (rt). Смещение для выбора А(300] (1200 = 300 * 4) находится в последнем пол
(address).
Следующая затем инструкция add указывается нулевым значением в нервом поле (ор) и чис
лом 32 в последнем поле (funct). Три регистровых операнда (18,8 и 8) находятся во игором.
третьем и четвертом полях и соответствуют регистрам Js2, НО и НО.
2.5. Представление инструкций в компьютере 123
{вструкция sw идентифицируется числом 43 в первом пате. Вся остальная часть этой по-
тедней инструкции идентична заключительной части инструкции Ы
Лоскольку 1200|0 = 0000 0100 1011 0000г двоичный эквивалент десятичной формы имеет
■едующий вид:
Таблица 2.4 содержит свод той части машинного языка MIPS, которая рас-
чатривалась в этом разделе. Как будет показано в главе 4, сходство двоичного
о с т а в л е н и я родственных инструкций упрощает оборудование. Такие сходства
лужат еще одним примером постоянства в Ml PS-архитектуре.
1 43 18 17 100 sw$s1,100($s2)
^*эмер 6 раз 5 раз 6 раз 5 раз 5 раз 6 раз Длина всех MIPS-
толя рядов рядов рядов рядов рядов рядов инструкций
32 разряда
^-формат R ор rs rt rd shamt fund Формат
арифметической
инструкции
-формат 1 ор rs rt адрес Формат инструк
ций переноса
данных
124 Глава 2. Инструкции: язык компьютера
Самое важное
Современные компьютеры построены на двух ключевых принципах:
1. Инструкции представляются числами.
2. Программы хранятся в памяти, чтобы их можно было считывать или запи
сывать как числа.
Эти принципы привели к концепции программы, хранящейся в памяти, изо
бретение которой выпустило компьютерного джинна из бутылки. Па рис. 2.3 по
казаны возможности этой концепции. В частности, в памяти могут содержаться
ис ходный код программы редактирования, соответствующий ему скомпилирован
ный машинный код для программы редактирования, текст, используемый ском
пилированной программой, и даже компилятор, генерирующий машинный кол.
Последствием того, что инструкции представлены в виде чисел, является
тот факт, что программы часто поставляются в виде файлов двоичных чисел.
Коммерческое значение этого факта заключается в том. что компьютеры могут
унаследовать готовое программное обеспечение, если они совместимы с суще
ствующим набором команд. Такая «совместимость на уровне двоичных кодов»
часто вынуждает промышленность ограничиваться небольшим количеством
архитектур набора инструкций.
Память —
{ Бухгалтерская программа
(машинный код)
г- —^ — —------- —— _ WW -I
{ Программа редактироеани
(машинный код) '
. -J
"|
С-компилятор
: (машинный код) (Я
Процессор L ■J
-|
! Платежные данные
г
-г.
I
Текст книги
I I I HZZUZZZZ
Исходный код на С
для программы
редактирования
Рис. 2.3. Концепция программы, хранящейся а памяти. Хранение программ в памяти по
зволяет компьютеру, выполняющему бухгалтерскую задачу, в мгновение ока стать компьютером
помогающим автору писать эту книгу. Это переключение происходит путем простой загрузки
в память программ и данных с последующей командой компьютеру приступить к выполнению
кода с заданного места. Обработка инструкций одинаковыми способами существенно упроща
ет как устройство памяти, так и программное обеспечение компыотернык систем. В частности,
технологии памяти, необходимой для данных, могут быть также использованы для программ
а программы, например компиляторы, могут транслировать код, записанный в том виде, который
наиболее удобен дли человека, в код, понятный компьютеру
2.6. Логические операции 125
Самопроверка
Какая из М IPS-инструкций здесь представлена? Выберите один из четырех вари
антов, показанных ниже.
ор Г8 rt rd shamt fu n d
0 8 9 10 0 34
Хотя первые компьютеры работали с целыми словами, вскоре стало понятно, что
было бы неплохо работать с полями разрядов внутри слова или даже с отдельными
разрядами. Одним из примеров такой операции является анализ символов внутри
слова, каждый из которых хранится в формате восьми разрядов (см. раздел 2.9).
Это привело к тому, что такие операции были добавлены к языкам программиро
вания и архитектурам наборов инструкций для того, чтобы кроме всего п роч ет
упростить запаковку и распаковку битов внутри слов. Эти инструкции назвали ло-
гическими операциями. В табл. 2.5 показаны логические операции в С, Java и MIPS.
Логические Операторы
Операторы языка С Инструкции MIPS
операции языка Java
Сдвиг влево « « Sll
Сдвиг вправо » >» srl
Поразрядное И & & and, andi
Поразрядное ИЛИ I I от, ori
Поразрядное НЕ - - nor
Кодировка инструкции si 1 представлена нулями как в поле ор, так и в поле fund,
поле rd содержит число 10 (регистр $t2), rt содержит число 16 (регистр SsO), а пате shamt
содержит число 4. Поле rs не используется и поэтому имеет нулевое значение.
Инструкция логического сдвига влево имеет дополнительное преимущество.
Сдвиг влево на i разрядов дает такой же результат, как и умножение на 2', точно
также как сдвиг разрядов десятичного числа на i позиций эквивалентен умножению
на 10'. Например, показанная ранее инструкция si 1 осуществила сдвиг на 4 разряда,
что дает такой же результат, что и умножение на 2* или на 16. Первая комбинация
разрядов, показанная выше, представляла число 9, а 9 к 16 = 144, что и является
значением второй комбинации разрядов.
Другой полезной операцией, изолирующей поля, является операция И (AND).
(Ее название написано большой буквой, чтобы не перепутать его с простым я з ы
ковым союзом.) Операция И является поразрядной и оставляет 1 в выдаваемом
результате только в том случае, если оба разряда операндов содержали 1. Например,
если регистр St2 содержит
0000 0000 0000 0000 0С00 1101 1100 оооо,.
а регистр Jtl содержит
0000 0000 0000 0000 ООП 1100 0000 0000,.
то после выполнения M IPS-инструкции
and St0.Stl.St2 # reg StO - reg Stl & reg St2
значением регистра StO станет число
0000 0000 0000 0000 0000 1100 0000 0000 ,
Как видите, операция И может применить комбинацию разрядов к набору раз-
рядов, заставляя появляться нули там, где нуль
И стоит в разряде комбинации. Такая комбинация
Логическая поразрядная операция, рабо разрядов в сочетании с операцией И традицион
тающая с двумя операндами и вычисляю
щая 1 только в том случае, если 1 имеется
но называется маской, носказьку, как настоящая
а обоих операндах. маска, «скрывает» часть разрядов.
2.6. Логические операции 127
Самопроверка
Какие операции могут изолировать поле в слове?
1. И
2. Сдвиг влево, за которым следует сдвиг вправо.
Упражнение
Компиляция управляющей структуры if-then-else в условные ветвления
В следующем фрагменте кода f, g, h, 1 и J — пере
менные. Каким будет скомпилированный MIPS-код
Условное ветвление для этой инструкции i f при условии, что пять пере-
Инструкция, требующая сравнения двух менных от f до j соответствуют пяти регистрам от
значений и допускающая последующую Jr(1
передачу управления на новый адрес в про
грамме на основе результата сравнения. 'f (4 **J) ' = g*h; else * ■ g h:
2.7. Инструкции для принятия решения 129
Ответ
гla рис. 2.4 показана блок-схема того, что должен делать MIPS-КОД Первое выражение
-равнение на равенство, поэтому, похоже, что нам нужно провести ветвление, если значения
регист ров равны друг другу, то есть воспользоваться инструкцией эед Вообще-то код был бы
эффективнее, если бы проверялось противоположное условие, чтобы провести ветвление
поверх кода, который выполняет следующую часть, then, инструкции if (метка Else опреде
лена ниже), и поэтому мы используем ветвление, если значения регистров не равны, то есть
используем инструкцию Ьпе:
One Js3.ts4.E1se D перейти на Else. если т * j
Следующая инструкция присваивания выполняет одну операцию, и если все операнды раз
мещены в регистрах, то это просто одна инструкция:
add JsO.isl.tsZ # f * g ♦ h (пропускается если i и j)
Теперь нам нужно перейти в конец инструкции if. В этом примере представляется новый вид
эетвления. часто называемый безусловны.* ветвлением. Эта инструкция предписывает про
фессору всегда следовать ветвлению. Чтобы отличать условное ветвление от безусловного,
MIPS для инструкции этого типа используется название jump (переход), сокращенное до
(метка E*i t определена ниже),
j Exit И перейти ма Exit
Инструкция присваивания в else-блоке инструкции if опять может быть скомпилирована
1 одну инструкцию. К этой инструкции нужно только добавить метку Else. Мы также пока-
икаем метку Exit, следующую за этой инструкцией, которая свидетельствует об окончании
ткомпнлнрованного кода структуры if-then-else:
Else:sub Js0.tsl.$s2 ♦ f - g - h (пропускается, если i - j)
E x it :
-л с 2.4. Иллюстрация вариантов а показанной выше инструкции if. Л евы й п р ям о уго л ьни к
соответствует ча сти th e n ин стр укц и и if, а правы й п р я м о уго л ьн и к со о тв е тств уе т ее части else
Циклы
Решения играют важную роль как для выбора из двух альтернативных вариантов,
который встречается в инструкциях If, так и для повторения вычисления, встре
чающегося в циклах. Строительными кирпичиками в обоих случаях служат одни
и те же ассемблерные блоки.
Упражнение
Компиляция цикла while, реализованного на языке С
Гак выглядит традиционный цикл, реализованный на языке С:
while (savet1] ** Ю
1 +- 1;
Предположим, что i и к соотносятся с регистрами $s3 и Ss5, а базовый адрес массива сохранен
в регистре Ss6. Каким будет ассемблерный М IPS-код, соответствующий этому фрагменту
кода на языке С?
Ответ
Первым шагом будет загрузка save[i] во временный регистр. Перед тем как мы сможем
загрузить save[ i ] во временный регистр, нам нужно получить его адрес. Перед тем как мы
сможем прибавить i к базовому адресу массива save для формирования адреса, нужно будет
умножить индекс 1 на 4, чтобы решить задачу байтовой адресации. К счастью, мы можем
воспользоваться логическим сдвигом влево, поскольку сдвиг влево на два разряда равно
силен умножению на 22 или на 4 (см. предыдущий раздел). Нам нужно добавить к этой
инструкции метку l oop, чтобы в конце цикла можно было осуществить ветвление назад
к этой инструкции:
Loop: s i! Stl.Ss3.2 # Вречеммый регистр Stl - 1 * 4
Для получения адреса saver 11 нужно прибавить значение Stl к базовому адресу save, храня
щемуся в регистре Ss6:
add ttl.S tl.S s 6 # Stl » адресу save[i)
Теперь можно использовать этот адрес для загрузки savofl] во временный регистр:
lw StO.O(Sil) # Временный регистр НО • savet>1
Следующая инструкция выполняет тест цикла, осуществляя выход, если savet 1] * к:
pne StO.Ss5. Exit # перейти на E xit, если saveti] * к
Следующая инструкция прибавляет 1 к к
addi Ss3.Ss3.1 # 1- 1♦ 1
В конце цикла происходит ветвление назад к тесту цикла while в его верхней части. После
этого ветвления мы просто добавим метку Exit, и все будет готово:
j Loop # go to Loop
Exit:
(См. упражнения по оптимизации этой последовательности.)
2 . 7 . Инструкции для принятия решения 131
Базисный блок
Интерфейс аппаратного Последовательность инструкций, не име
- программного обеспечения ющая ветвлений (за исключением, может
быть, в самом конце) и без адресов перехо
{нструкции сравнения должны иметь дело да или меток ветвлений (за исключением,
г противопоставлением чисел со знаком и без может быть, в самом начале).
132 Глава 2. Инструкции: язык компьютера
Упражнение
Ответ
Значение в регистре SsOпредставляет собой число - 1 |0, если это целое чисто, и 4 294 967 295,
если это беззнаковое целое число. Значение в регистре 1$: представляет в любом случае чис
ло 12. Затем регистр ПО имеет значение 1, поскольку —110< 1,с. а регистр Stl имеет значение О,
поскольку 4 294 967 29510> 110.
Интерпретация чисел со знаком, как будто они беззнаковые, дает нам малоза
тратный способ проверки, 0 < х < у, что соответствует условию «индекс не выходит
за пределы границ массива*. Ключевым моментом здесь служит гот факт, что от
рицательные целые числа с дополнением до двух в беззнаковой нотации выглядят
как большие числа; то есть старший разряд в прежней нотации является знаковым
разрядом, а в последней нотации он является наибольшей частью числа. Таким
образом, беззнаковое сравнение х < у также проверяет, не является ли х отрица
тельным числом, наряду с проверкой того, что х меньше у.
Упражнение
Ответ
'.ля проведения обеих проверок код всего лишь использует инструкцию situ:
situ JtO.Jsl.Jt2 # JlO-O если Ssl>*oni«He. или Jsl<0
beq Jto.Jiero.IndexOutOfBounds # если проверка не удалась, перейти к
# обработке отвибки
Самопроверка
В языке С имеется большое количество ин-
трукций для принятия решений и циклов, в то
Адресная таблица переходов
эоемя как в MIPS их всего несколько. Что из Также называется таблицей переходов Та
следующих утверждений объясняет или не объ- блица адресов альтернативных моследова
• ияет причины этого дисбаланса? Почему? тельмостей инструкций.
134 Глава 2. Инструкции: язык компьютера
Этвет
Переменные-параметры g, h, i и j соответствуют регистрам аргументов iaO, lal, 1а2 и 1аЗ,
переменная f соответствует регистру НО. Скомпилированная программа начинается
: метки процедуры:
lea'_exanp'e:
Следующим шагом будет сохранение регистров, используемых процедурой. Инструкция,
еализующая присваивание в теле процедуры, идентична показанной в упражнении из раз-
ела 2,2 «Компиляция сложной инструкции на языке С в MIPS-код», где используются два
«ременных регистра. Таким образом, нужно сохранить три регистра: SsO, НОи ttl. Мы «про
талкиваем» старые значения в стек, создавая в стеке пространство для трех слов (12 байт),
. затем сохраняя регистры:
addi tSD. Iso. -12 t настройка стека с освобождение* иеста иля 3 записей
sw *t 1. 8(tsp) # сохранение регистра stl для гзеледуюыего ислользоваи»я
sw НО. 4(Jsp) ♦ сохранение регистра НО для посг-едувдего использования
sw tsO. O(tsp) ♦ сохранение регистра SsO для последуюиего использования
Ча рис. 2.5 показан стек до, во время и после вызова процедуры. Следующие три инструкции
«ответствуют телу процедуры и практически повторяют код упражнения из раздела 2.2
•Компиляция сложной инструкции на языке С в MlPS-код»:
ado It0.ta0.lal ♦ регистр U0 содержат д » h
add ttl.ta2.ta3 ♦ регистр ttl содериит 1 + j
sub tsO.itO.ttl # f * ttO - ttl. что соответствует (g * h)-d + ))
1™ возвращения значения f мы копируем его в регистр возвращаемого значения:
adc tvO.IsO.Hero # возвращение 1 (tvO - tsO ♦ 0)
“сред возвращением из процедуры мы восстанавливаем три прежних сохраненных значения
регистров путем «выталкивания» их из стека:
lw SsO. Ottsp) # восстановление регистра SsO для вызызавиейпрограяиы
w ttO. 4(tsp) # восстановление регистра ttO для вызываемойпрогоаяяы
w ttl. 8(tsp) *восстановление регистра ttl для вызызавнейпрограяиы
adot tsp.tsp,12 #корректировка указателя стека для удаления грех записей
Процедура заканчивается инструкцией перехода по регистру с использованием адреса виз
ита.
jr tra # переход назад к еыэыеавией лрегракяе
больший адрес
$sp Ssp ►
Содержимое регистра $t1
Содержимое регистра $Ю
$sp ► Содержимое регистра SsO
Меньший адрес
а
Рис. 2.9. Значения указателя стека и самого стека: а) до вызова, 6) в процессе вызова,
и в) после вызова процедуры. Указатель стека всегда указывает на "вершину» стека, или, как
показано на этом рисунке, на последнее слово в стеке
Вложенные процедуры
Процедуры, не вызывающие других процедур, называются конечны.чи (leaf). Если
бы все процедуры были конечными, то жизнь стала бы проще, но, к сожалению,
это не так. Точно так же как шпион для выполнения части своей миссии может
нанять других шпионов, которые в свою очередь могут воспользоваться услуга
ми еще большего количества шпионов, процедуры вызывают другие процедуры.
Более того, рекурсивные процедуры даже вызывают «клонов», то есть самих себя.
Поскольку мы должны быть внимательными при использовании регистров в про
цедурах, еще больше внимания нужно уделять вызовам неконечных процедур.
П редпаю ж им , к примеру, что основная программа вызывает процедуру Ас ар
гументом 3, помещая значение 3 в регистр $а0, а затем используя инструкцию jal А.
Затем предположим, что процедура Авызывает процедуру В, используя инструкцию
jal Вс аргументом 7, также помещаемым в регистр $а0. Поскольку процедура Аеще
не заверш ила свою задачу, использование регистра $а0 вызывает конфликтную
ситуацию. Точно так же возникает конфликт и с адресом возврата в регистре $га.
поскольку теперь в нем находится адрес возврата для процедуры В. Если мы что-
нибудь не предпримем для предупреждения этой проблемы, возникший конфликт
не позволит процедуре А вернуть управление вызывавшей ее программе
Одним из решений будет проталкивание всех остальных регистров, которые
должны быть сохранены, в стек, точно гак же, как мы это делали с сохраняемыми
регистрами. Вызывающая программа проталкивает в стек все регистры аргументов
(SaO—$аЗ) или временные регистры (Зт.0-119), которые понадобятся ей после вызова.
Вызываемая процедура проталкивает в стек регистр адреса возврата $га и все сохра
няемые регистры (ts0-$s7), используемые ею. Указатель стека настраивается в соот
ветствии с числом регистров, помещаемых в стек. По возвращении регистры восста
навливаются из памяти и указатель стека соответствующим образом корректируется.
2.8. Поддержка процедур в компьютерном оборудовании 139
Упражнение
Компиляция рекурсивной процеду ры на языке С с показом ссылок на вложения
Давайте попытаемся разобраться с рекурсивной процедурой, вычисляющей факториал:
int fact Ont п)
(
If (п < 1) return (1):
else return (n * facttn ■ 1));
)
v k h .m будет для нес ассемблерный код MIPS?
Ответ
Сохраняются Не сохраняются
Сохраняемые регистры: Ss0-$s7 Временные регистры: Sl0-$t9
Регистр указателя стека: $sp Регистры аргументов: $аО-$аЗ
Регистр адреса возврата: Sra Регистры возвращаемых значений: Sv0-$v1
Стек выше указателя стека Стек ниже указателя стека
$fp ►
Ssp*-
S fp * Сохраненные регистры
аргументов (если они
есть)
Сохраненный адрес
Сохраненные сохра
няемые регистры
(если они есть)
Локальные массивы
и структуры
Ssp ► (если они есть)
Меньший адрес
а 6 в
tac. 2 .6 . Иллюстрация распределения пространства стека: а) до вызова, б) а процессе
п о о в а и в) после вызова процедуры. Указатель фрейма ($fp) указывает на первое слово
•рейма, зачастую это сохраненный регистр аргумента, а указатель стека (Ssp) указывает на
аршину стека. Стек скорректирован таким образом, чтобы создать пространство для всех со
чиненных регистров и всех находящихся в памяти локальных переменных. Поскольку указатель
лека в процессе выполнения программы может изменяться, программистам проще ссылаться
« переменные посредством неизменного указателя фрейма, хотя это может быть сделано и с
юмощью указателя стека и небольших арифметических вычислений адреса. Если локальных
временных в стеке процедуры нет, компилятор сэкономит время, не устанавливая и не восста
навливая указатель фрейма. Когда указатель фрейма используется, он инициализируется при
вызове адресом, хранящимся в $sp. a Ssp восстанавливается с использованием Sfp
Рис. 2.7. Распределение памяти a MIPS для программ и данных. Эта адресация представля
ет собой всего лишь соглашение, касающееся программного обеспечения, и не является частью
MIPS-архитектуры. Указатель стека получает начальное значение 7fff fffc ic и растет вниз по на
правлению к сегменту данных. С другого конца программный код («текст») начинается с адреса
0040 000016. Статические данные начинаются с адреса 1000 0000,,.. Далее следуют динамические
данные, распределяемые в С функцией mallocf), а в Java функцией new. Они растут вверх по на
правлению к стеку в области, называемой кучей. Глобальный указатель, $др, устанавливается
на адрес, облегчающий доступ к данным Он получает начальное значение 1000 8000,6. поэтому
с помощью положительного и отрицательного 16-разрядного смещения из $др можно получить
доступ к адресам в диапазоне от 1000 0000.6to 1000 ffff 1&
Уточнение. А что, если будет более четырех параметров? Соглашение MIPS преду-
матривает помещение дополнительных параметров в стек сразу же над указателем
Эрейма Затем процедура ожидает наличия первых четырех параметров в регистрах
гг $а0 и до $аЗ, а остальные ищет в памяти, адресуемой с помощью указателя фрейма.
Как упоминалось в подписи к рис. 2.6, указатель фрейма удобен тем, что все
хылки на переменные в стеке из процедуры будут иметь одинаковые смещения.
Но указатель фрейма использовать не обязательно. С-компилятор GNU M IPS
использует указатель фрейма, а С-компилятор от M IPS его не использует — он
усм атри вает регистр 30 как еще один сохраняемый регистр (Ss8).
Самопроверка
Какие утверждения, касающиеся С и Java, в целом соответствуют дейгткитель
пости?
1. Программисты, работающие на С, управляют данными явным образом, а в Java
это делается автоматически.
2. При работе на С допускается намного больше ошибок, связанных с указа гелями
и утечками памяти, чем при работе на Java.
э*с. 2.8. Представление символов в таблице ASCII. Обратите внимание на то. что коды букв
«верхнем и нижнем регистрах различаются а точности на 32 единицы; это наблюдение может
'счвести к удобным способам проверки или изменения регистра букв. Значения, не показанные
* данной таблице, включают символы форматирования. Например, код 8 представляет символ
абоя, код 9 — символ табуляции, а код 13 — возврат каретки. Еще одним полезным значением
ier 0 для null. Это значение а языке программирования С используется дли маркировки конца
строки
Упражнение
Коды ASCII и двоичные числа
•нетто целочисленных значений числа можно представить в виде строк ASCII. Насколько
к дичится объем памяти, если один миллиард будет представлено не 32-разрядным целым
■клим, а кодами ASCII?
Этает
Один миллиард - это 1 000 000 000. поэтому его отображение займет 10 ASCII-цифр, длина
с сдой из которых составит 8 бит. Поэтому увеличение требуемого объема памяти составит
'10 к К)/32, или 2,5. Кроме увеличения требуемого объема памяти, устройство для сложения,
считания, умножения и деления таких десятичных чисел будет слишком сложным. По
еные сложности объясняют, почему компьютерные профессионалы воспитаны на вере.
146 Глава 2. Инструкции: язык компьютера
Упражнение
Компилирование процедуры копирования строки, показывающее, как используются
строки в программах на языке С
Процедура strepy копирует строку у в строку х, используя соглашение, принятое в языке С,
касающееся завершения строки нулевым байтом:
void strepy (char х[]. char у[])
{
int 1.
1 » 0:
while < ( * [ i] * y [ i ] ) ! • \ 0 ') / * котирование и тестирование 6ай*а * /
1 1:
}
Каким будет ассемблерный код MIPS?
Ответ
Ниже показан основной сегмент ассемблерного кода MIPS. Предположим, что базовые
адреса для массивов х и у находятся в SaC и в Sal, а переменная i находится в $s0. Инструк
ция strepy корректирует указатель стека, а затем помещает сохраняемый регистр 1$э в стек:
Strepy:
addl Ssp,Ssp.*а # корректировка стека дл» еще одной записи
sw $s0. O(Ssp) 4 сохранение SsO
Чтобы присвоить - начальное значение 0, следующая инструкция устанавливает значение
SsOв 0, складывая 0 и 0 и помещая эту сумму в SsO:
add SsO.Szero.Szero # ’ -0*0
Далее начинается цикл. Сначала формируется адрес y[i] путем добавления i к у[J:
LI add Stl.JsO.Sal # адрес у[т] -оиещае'св в Jtl
Обратите внимание на то, что нам не нужно умножать т на 4, поскольку у является массивом
байтов, а не слов, как в предыдущих упражнениях.
для загрузки символа в y[i] мы используем инструкцию загрузки байта без знака — load
уте unsigned, которая помещает символ в Н?:
1ьи я г . o m n # « г - у[1 ]
Такое же вычисление адреса помещает адрес xfl] в St3, а затем символ в St2 сохраняется но
лому адресу.
add $t3.$sO.$aO # адрес x[i] понещается в St3
sb St2. 0(Jt3) # x[1] • y[i]
Затем мы выходим из цикла, если символ был нулевым. То есть мы выхолим, если это по-
следний символ строки:
beq U2.Szero.L2 # если y[i] — 0. переход «а L2
Если нет, мы увеличиваем значение i на единицу и переходим в начало цикла:
addi SsO, SsO.1 ♦i - i • 1
j 11 # переход на 11
Если мы нс переходим в начало цикла, значит, это был последний символ в строке; мы вос-
пававливаем SsOи указатель стека, а затем возвращаемся из процедуры.
L2: lw SsO. 0(Ssp) # y[i] — 0: конец строки. Восстановление
# прежнего значение SsO
addl Ssp.Ssp.4 # выталкивание одного слова из стека
jr Sra # возвращение
148 Глава 2. Инструкции: язык компьютера
Как и load byte, load half ( l h ) рассматривает полуслово как число со знаком и по
этому осуществляет расширение знака, заполняя 16 левых разрядов регистра, а вот
инструкция load halfword unsigned ( l h u ) работает с целыми числами без з н а к а .
Поэтому' из этих двух инструкций l h u используется чаще. Инструкция store half
(sh) берет полуслово из правых 16 разрядов регистра и записывает его в память.
Полуслово копируется с помощью следующей последовательности:
lh u S t O . O t ls p ) # Ч тение по лусло ва (1 6 б и т ) и з источника
sh it 0 . 0 ( $ g p ) # Запись полуслова (1 6 б и т) в приеиник
-нс. 2.9. Пример алфавитов, поддерживаемых в Unicode. Unicode версии 4.0 имеет более
50 коллекций символов, называемых «блоками*. Каждый блок кратен числу 16, Например,
:еческий (Greek) начинается с 0370,,. а Кириллический (Cyrillic) начинается с 0400,,. Первые
столбца показывают 48 блоков, соответствующих обычным языкам, коюрые расположены
:имерно в том порядке, в котором они следуют в Unicode. Последние столбцы имеют 16 блоков,
-= пяющихся мультиязычными, и идут не по порядку 16-битная кодировка, называемая UTF-16,
ттользуется по умолчанию Кодировка переменной длины, называемая UTF-8, сохраняет
лнабор ASCII как восьмибитный и использует от 16 до 32 бит для других символов. UTF-32
пользует по 32 бига на символ. Чтобы получить дополнительную информацию, следует зайти
на сайт www.unicodc.org
Самопроверка
Какие из следующих утверждений о символах и строках в С и Java соответствуют
нствнтсльностн?
Строка в С занимает вдвое меньше памяти по сравнению с такой же строкой в
Java.
- Строки — это всего лишь неформальное название одномерных массивов сим
волов в С и Java.
Строки в С и Java используют null (0) для маркировки конца строки.
150 Глава 2. Инструкции: язык компьютера
Упражнение
Разгрузка 32-раэрядной константы
Каким будет ассемблерный кол MIPS для загрузки 32-разрядной константы в регистр JsO?
0000 0000 ООН 1101 0000 1001 0000 0000
О твет
Сначала нужно, используя инструкцию lui, загрузить верхние 16 разрядов, которые в деся
тичной форме имеют вид 61:
lui SsO. 61 И61 6 десятичной (соне - 0000 0000 ООП 1101 в двоичной
После этого значением регистра JsOстанет число
0000 0000 ООП 1101 0000 0000 0000 0000
Следующим шагом будет вставка нижних 16 разрядов, которые в десятичной форме имеют
вид 2304:
ori SsO. SsO. 2304 # 2304 в десятичной форме - 0000 1001 0000 0000
В конечном итоге регистр SsO приобретет требуемое значение:
0000 0000 ООП 1101 0000 1001 0000 оооо
2.10. Адресация MIPS для 32-раэрядмых непосредственных значений и адресов 151
10000 # п е р е й т и на а д р е с 10000
нижет быть преобразована ассемблером в следующий формат (на самом деле этот
гормат, как мы увидим далее, немного сложнее):
2 100002
6
6 разрядов 26 разрядов
152 Глава 2. Инструкции: язык компьютера
где значение кода операции (opcode) перехода равно 2, а адрес перехода равен
10000.
В отличие от инструкции безусловного перехода инструкция условного пере
хода вдобавок к адресу перехода должна указать два операнда. Таким образом,
инструкция
Ьле $ $ 0 . $ s l. E x it # перейти на м е тку E x i t , если SsO * Jsl
5 16 17 Exit
6 разрядов 5 разрядов 5 разрядов 16 разрядов
оые адреса для вызова процедур, в которых используется формат J -типа, как для
инструкции безусловного перехода, так и для инструкции безусловного перехода
и ссылки.
Поскольку все M IPS-инструкции имеют длину 4 байта, M IPS удлиняет дис
танцию условного перехода за счет того, что относительная адресация по счетчику
юманд ссылается на количество слов до следующей инструкции, а не на катичество
байтов. Таким образом, 16-разрядное поле может задать условный переход в четы
ре раза дальше, интерпретируя содержимое поля как относительный адрес слова,
1 не относительный адрес байта. Содержимое 26-разрядного поля в инструкции
безусловного перехода также является адресом слова, что означает, что оно пред
ставляет 28-раэрядиый адрес байта.
Уточнение. Так как счетчик имеет размер 32 разряда, то для безусловных переходов
4 разряда должны поступать из какого-нибудь другого места. Инструкция безуслов
ного перехода MIPS заменяет только нижние 26 разрядов счетчика команд, оставляя
верхние 4 разряда этого счетчика без изменений. Загрузчик и компоновщик (раз
дел 2.12) должны избегать выхода программы за границу адреса 256 Мбайт (64 мил
еюна инструкций); в противном случае безусловный переход должен быть заменен
тереходом по регистру, перед которым находятся другие инструкции для загрузки
а регистр полного 32-раэрядного адреса
Упражнение
Демонстрация смещения перехода на машинном языке
Цикл while в упражнении подраздела «Циклы» был скомпилирован в следующий ассем
блерный код MIPS:
LOOP ill Stl.Ss3.2 # Вреченньй регистр Stl - 4 * *
adc Stl.stl.1s6 * stl - адресу savefi]
Iw StO.O(Ul) ♦ Вреченмь'й регистр StO - save(i]
bne StO.SsS. Exit ♦ переход на нетну Exit, если save[i) * <
add’ Ss3.Ss3.1 #1*i ♦1
J Loop # переход »a нетку Loop
Exit
Если предположить, что начало цикла помещено в памяти по адресу 80000, то каким будет
машинный код MIPS для этою цикла?
Ответ
Вот как выглядят инструкции ассемблера и их адреса:
80000 0 0 19 9 2 0
80004 0 9 22 9 0 32
80008 35 9 8 0
80012 5 8 21 2
80016 8 19 19 1
80020 2 20000
80024 ...
154 Глава 2. Инструкции: язык компьютера
Следует помнить, что инструкции MIPS имеют байтовые адреса, поэтому адреса последова
тельных слов отличаются друг от друга на 4, го есть на число бай гов в слове. Инструкция Ьпе
в четвертой строке прибавляет к адресу следующей инструкции (80016) 2 слова или 8 байт,
задавая место назначения условного перехода относительно этой следующей инструкции
(8 + 80016), а не относительно инструкции условного перехода или перехода с использова
нием полного адреса назначения (80024). Инструкция безусловного перехода в последней
строке использует полный адрес (20000 к 4 - 80000), соответствующий метке Loop.
• ~'мамт; •*
Интерфейс аппаратного и программного обеспечения
Большинство условных переходов нацелены на близлежащие адреса, но иногда
условный переход осуществляется очень далеко, дальше, чем это может быть пред
ставлено в 16 разрядах инструкции условного перехода. Здесь на выручку приходит
ассемблер, который поступает так же, как он это делает с большими адресами или
константами: он вставляет безусловный переход на место назначения условного
перехода и инвертирует условие, чтобы условный переход решат, нужно ли про
пустить безусловный переход.
Упражнение
Условный переход на большое расстояние
Возьмите условный переход при равенстве значений регистров JsO и $sl,
beg tsO. Ssl. LI
и замените его двумя инструкциями, предлагающими намного более адинное расстояние
перехода.
Ответ
1. Непосредственная адресация
Непосредствен
ор Г5 rt ное число
2. Регистровая адресация
3. Базовая адресация
5. Псевдонепосредственная адресация
ор Address Память
Счетчик команд
□§> \ Слово
Ч с 2.11. Иллюстрация пяти режимов адресации MIPS. Операнды выделены темным фоном.
-чранд в режиме 3 находится в памяти, а операнд в режиме 2 находится в регистре Заметьте,
версии загрузки и сохранения имеют доступ к байтам, полусловам или словам. Для режима 1
-м н д о м является 16 разрядов самой инструкции Режимы 4 и 5 обращаются к инструкциям
• -амяти, где режим 4 добавляет 16-разрядный адрес, сдвинутый влево на два разряда к счетчику
тманд, а режим 5 объединяет 26-разрядный адрес, сдвинутый влево на два разряда с четырьмя
верхними разрядами счетчика команд
для более крупных программ. Процесс развития набора инструкции позволяет ар
хитектуре расширяться таким образом, чтобы программное обеспечение сохраняло
совместимость и передавалось по наследству следующему поколению архитектуры
Упражнение
Декодирование машинного кода
Какая инструкция на языке ассемблера соответствует згой машинной инструкции?
00af802016
Ответ
ор(31:2б)
28-26
0(000) 1(001) 2(010) 3(011) 4(100) 5(101) 6(110) 7(1 1 1 )
31-29
0(000) R-format Bltz/gez jump jump & branch branch blez Dgtz
link eq ne
1(001) add addi u set less set less andi Ori xori load
im m ediate than than imm. upper im
im m . unsigned m ediate
2(010) TLB ' f ir
3(011)
4(100) lo a d byte load Iwl load word load byte load half Iwr
half unsigned unsigned
5(101) store byte store swt store SWT
half word
6(110) load linked Iwcl
word
'(111) store cortd. swcl
word
ор(31:26) =010000 (TLB), rs(25:21)
23-21
0(000) 1(001) 2(010) 3(011) 4(100) 5(101) 6(110) 7 (111)
25-24
3(00) MfcO CfcO MtcO CtcO
1(01)
2(10)
3(11)
эмс. 2.12. Кодировка инструкций MIPS. Эта система обозначений дав1 значение поля по стро-
." и столбцам Например, верхняя часть рисунка показывает инструкцию загрузки слова — load
m ytj в строке 4 (1002для разрядов 31-29 инструкции) и в столбце 3 (011 г для разрядов 20-26 ин-
—о укции), то есть это соответствует значению поля ор (разряды 31 -26), равному 100011 г Выде-
<е-ме означает, что поле используется где-нибудь еще. Налример. R-format в строке 0 и столбце
] 1 оо * 000000;,) определяется в нижней части рисунка Следовательно, присутствие инструкции
•«'-итаиия subtract с строке 4 и в столбце 2 в нижней части означает, что поле funct (разряды
- - 0 ) инструкции имеет значение 100010г, а поле ор (разряды 31-26) имеет значение 000000г.
У ч е н и е плавающей точки — floating point (FIR) в строке 2. столбце 1 определено на рис. 3.14
■ ~аве 3. А значение Bltz/gez является кодом операции (opcode) для четырех инструкций: bltz,
jez bltzal и bgezal В этой главе рассматриваются инструкции, представленные полным именем
• выделенные жирным шрифтом, а в главе 3 рассматриваются инструкции, также выделенные
жирным шрифтом, но представленные в сокращенной форме
158 Глава 2. Инструкции: язык компьютера
В табл. 2.8 показаны все форматы M IPS-инструкций. В табл. 2.1 показаны ин
струкции языка ассемблера, рассматриваемые в данной главе. Не показанная в ней
часть M IPS-инструкций работает главным образом с арифметикой и с веществен
ными числами и будет рассмотрена в следующей главе.
Самопроверка
I. Каков диапазон адресов для условных переходов в MIPS (К - 1024)?
1. Адреса между 0 и 64 К - 1.
2. Адреса между 0 и 256 К - 1.
3. Адреса приблизительно на 32 К вверх, до перехода, и приблизительно на 32 К
вниз после него.
4. .Адреса приблизительно на 128 К вверх, до перехода, и приблизительно на 128 К
вниз после него.
II. Каков диапазон адресов для безусловного перехода (jump) и безусловного пере
хода со ссылкой (jump and link) в MIPS (М = 1024 К)?
1. Адреса между 0 и 64 М - 1.
2. .Адреса между 0 и 256 М - 1.
3. Адреса приблизительно на 32 М вверх до перехода, и приблизительно на 32 М
вниз после него.
4. .Адреса приблизительно на 128 М вверх до перехода, и приблизительно на 128 М
вниз после него.
5. Переход осуществляется в любое место внутри блока из 64 М адресов, когда
счетчик команд предоставляет верхние 6 разрядов.
6. Переход осуществляется в любое место внутри блока из 256 М адресов, когда
счетчик команд предоставляет верхние 4 разряда.
III. Какая инструкция языка ассемблера MIPS соответствует инструкции на ма
шинном языке, имеющей значение 0000 0000|6?
1. j.
2. R-формат,
2.11. Параллелизм и инструкции: синхронизация 159
1 add1.
I ill,
5 mfcO.
: Неопределенный код операции (opcode): допустимой инструкции, соответству
ющей значению 0, не существует.
^грузкой и условным сохранением должно быть как можно меньшим, чтобы свести
i минимуму вероятность того, что либо не связанное с этим процессом событие,
з о конкурирующий процессор станут причиной частых неудачных завершений
жструкции условного сохранения.
Преимуществом механизма связанной загрузки - условного сохранения —
а.т е т е я возможность его использования для создания других примитивов син-
• низании, таких как атомарное сравнение и обмен или атомарное извлечение
162 Глава 2. Инструкции: язык компьютера
Самопроверка
Когда используются такие примитивы, как связанная загрузка и условное сохра
нение?
1. В том случае, когда взаимодействующие потоки параллельных программ нуж
даются в синхронизации, чтобы правильно считывать и записывать совместно
используемые данные.
2. В том случае, когда взаимодействующие процессы на однопроцессорной систе
ме нуждаются в синхронизации при чтении и записи совместно используемых
данных.
Компилятор
Компилятор превращает программу на языке С в п/юграмму на языке ассемблера,
символьную форму того, что понятно машине. Программы на языках высокого
уровня занимают намного меньше строк кода, чем программы на языке ассемблера,
поэтому продуктивность работы программиста существенно возрастает.
В 1975 голу многие операционные системы и ассемблеры были написаны на
языке ассемблера, потому что объем памяти был невелик и компиляторы рабо
тали неэффективно. Увеличение объема памяти одного DRAM-4ima в 500 000 раз
снизило остроту проблемы размера программы, и сегодня оптимизирующие
компиляторы способны выдавать программы на языке ассемблера, сопоставимые
по качеству с теми, которые создаются специ
алистами по программированию на этом язы
язык ассемблера ке’ а для больших программ результат работы
Символьный язык, который может транс- компилятора по|юй превосходит но качеству
лироеатьсн в двоичный машинный язык. ручную работу.
2.12. Трансляция и запуск программы 163
Программа на С
Компилятор
_____ S ________
Программа на языке ассемблера
Загрузчик
Память
*мс 2.13. Иерархия трансляции программы на языке С. Сначала программа на языке высо
к о уровня компилируется в прог рамму на языке ассемблер», а затем собирается в объектный
-эдуль на машинном языке. Для разрешения всех ссылок компоновщик объединяет несколько
-одулей с библиотечными процедурами. Затем загрузчик помещает машинный код в нужное
•^сто памяти для выполнения этого кода процессором. Для ускорения процесса трансляции
—которые этапы пропускаются или объединяются. Некоторые компиляторы сразу производят
оъектные модули, в то время как другие используют компонующие загрузчики, выполняющие
_за последних этапа. Чтобы идентифицировать тип файла, в UNIX придерживаются соглашения
: уффиксах для файловых имен: исходные С-файлы называются х.с. ассемблерные файлы — x.s,
лъектные файлы к о , файлы статически связанных библиотечных процедур — к.а. файлы дина-
-чески связанных библиотечных процедур —x.so, а исполняемые файлы по умолчанию мазыва
. сяа.оиГ В MS-DOS для тех же целей используются суффиксы .С. .ASM, OBJ, .UB, .DLL и .EXE.
Ассемблер
: ык ассемблера не только служит интерфейсом с программами высокого уровня,
а также может обрабатывать в качестве вполне самостоятельных общепринятые
нации инструкций машинного языка. Оборудование не должно иметь реализа-
эш этих инструкций; но их появление в языке ассемблера упрощает трансляцию
создание программ. Такие инструкции назы-
ицотся псевдоинструкциями.
Псевдоинструкци и
Как уже ранее упоминалось, оборудование Общепринятые вариации инструкций на
ЫIPS обеспечивает постоянное присутствие языке ассемблера, часто обрабатываемые
левого значения в регистре Izero. То есть где как вполне самостоятельные инструкции.
164 Глава 2. Инструкции: язык компьютера
Компоновщ ик
ходя из всего ранее представленного, предполагается, что одно-единственное
вменение в одной строке одной процедуры потребует компиляции и ассемблиро-
ия всей программы. Полная перетрансляция приводит к лишней трате компью-
рных ресурсов. Повторная трансляция не нужна, в частности, стандартным би
блиотечным процедурам, поскольку програм м ист будет ком пилировать
« ассемблировать процедуры, которые по определению практически никогда не
вменяются. Альтернативный вариант заключается в независимой компиляции
аждой процедуры, чтобы изменение в одной строке потребовало компиляции
I ассемблирования только одной процедуры. Для его осуществления нужна новая
з* темная программа, которая называется редактором связей, или компоновщи-
>м. Эта программа «сшивает» в единое целое все программы на машинном языке,
торые были оттранслированы ассемблером независимо друг от друга.
Компоновщик работает в три этапа:
Помещает код и данные модулей в память в символьном виде.
. Определяет адреса данных и метки инструкций.
Исправляет как внутренние, так и внешние ссылки.
Д ля разрешения всех неопределенных ме-
- *. компоновщик использует настроечную ин- Компоновщ ик (linker)
z- эмацию и таблицу имен, присутствующую Также называется редактором связей (link
> каждом объектном модуле. Подобные ссылки editor). Системная программа, объединяю
щая независимо отассемблирое энные про
■меются в инструкциях условного и безуслов- граммы на машинном языке в исполняемый
я со перехода и в адресах данных, то есть работа файл и разрешающая все неопределенные
-ой программы во многом напоминает работу метки.
166 Глава 2. Инструкции: язык компьютера
Упражнение
Компоновка объектных файлов
Нужно скомпоновать два, показанных ниже, объектных файла. Следует показать обновлен
ные адреса первых нескольких инструкций полноценного исполняемого файла. Инструкции
показываются на языке ассемблера только для того, чтобы сделать упражнение понятнее;
в реальности инструкции будут представлены числами
Заметьте, что в объектных файлах мы выделили адреса и обозначения, которые должны быть
обновлены в процессе компоновки: инструкции, которые ссылаются на адреса процедур А и В,
а также инструкции, которые ссылаются на адреса слов данных КиГ
Размер данных 20 „
дхюедурс а нужно найти адрес для переменной, имеющей метку к, чтобы поместить его
Обструкцию загрузки, и найти адрес процедуры В. чтобы поместить его в инструкцию jal.
^Ж'Цедура Внуждается в адресе переменной, имеющей метку v. для инструкции сохране-
■ л и в адресе процедуры Адля своей инструкции jal. Согласно рис. 2.7, текстовый сегмент
- кается с адреса 40 000016, а сегмент данных —с адреса 1000 00001в. Текст процедуры Л
а «- '.дается по первому адресу, а ее данные —по второму. Заголовок объектного файла для
тх си-дуры Асообщает, что ее текст занимает 100|6 байт, а ее данные занимают 20)6 байт,
г му начальный адрес дли текста процедуры Вбудет равен 40 0100)6, а ее данные будут
*икаться с адреса 1000 002014.
...
.. . ...
10 0 0 0 0 0 0 ,, (X)
10 0 0 0 020 , (Y)
... ...
Теперь компоновщик обновит поля address инструкций. Чтобы узнать формат редактируе
мого адреса, он использует пате, определяющее тип инструкции. Здесь используются поля
двух типов:
1. С инструкциями ja l разобраться проще, потому что они используют иеевдонепосред-
ственную адресацию. Инструкция jal по адресу 40 0004,, получает в свое адресное поле
40 0100,, (адрес процедуры 0), а инструкция ja l по адресу 40 0104,,. получает в свое
адресное поле 40 0000,, (адрес процедуры А).
2. С адресами инструкций загрузок и сохранений дело обстоит сложнее, поскольку они
вычисляются относительно базового регистра. В данном примере в качестве базового
регистра используется глобальный указатель.
На рис. 2.7 показано, что регистр Igp имеет начальное значение 1000 8000,,. Для получения
адреса 1000 0000,, (адреса слова К) мы помещаем 8000,, в адресное поле инструкции lw по
адресу 40 0000,,, Точно так же мы помешаем 8020|б в адресное поле инструкции sw по ядре
су 40 0100,, для получения адреса 1000 0020|6 (адреса слова Y).
Загрузчик
После того как исполняемый файл будет сохранен на диске, операционная система
считывает его в память и запускает на выполнение. В UNIX-системах загрузчик
выполняет следующие действия:
1. Считывает заголовок исполняемого файла для определения размера текстового
сегмента и сегмента данных.
2.12. Трансляция и запуск программы 169
Текст
ja г а
lw г I
ч | _ __ 1
Д ан
ны е
Текст
li ID
j
1__ 1
Текст Динамический
компе новщик загрузчик
Перекомпоновка
DLL-процедуры
J 1
1
Данные/ I
Текст
ЧИСТ J
DLL процедура DLL-процедура
1
1
* 1
1
j>
Рис. 2.15. Иерархия трансляции Java-программы. Сначала программа на языке Java компи
лируется в двоичную версию байт - кода Java со всеми адресами, определенными компилятором
После этого Java-программа готова к запуску в интерпретаторе, который называется виртуальной
машиной Java (JVM). Эта виртуальная машина в процессе выполнения программы связывается
с нужными методами в Java-библиотеке. Для достижения более высокой производительности
JVM может вызвать JIT-компилятор, который выборочно компилирует методы в соответствующие
инструкции машинного языка той машины, на которой он запущен
Самопроверка
Как вы думаете, какие преимущества интерпретатора над транслятором были важ
нее всего для разработчиков Java?
Простота создания интерпретатора.
Более подробная система сообщения </
Л Т -ком пилятор
Название, часто присваиваемое компиля ошибках.
тору, который работает в процессе еыпол- 3 Более компактный объектный код.
нения программы, транслируя интерпрети
руемый кодовый сегмент в машинный код 4. Независимость от машины, на которой за
того компьютера, на котором он работает. пускается профамма.
2.13. Объединение всего ранее рассмотренного в упражнении 173
" и с т и н г 2.1 . Процедура на язы ке С, которая меняет местами содерж им ое двух ячеек
памяти. Ф рагм ент, использую щ ий эту процедуру, приведен в уп р а ж н е
нии по сортировке.
id swap(int v[], int k)
mt temp;
temp - v[k]:
»[k] - v[k+l]:
v[k+l] - temp:
Процедура swap
Начнем с кода процедуры обмена, показанной в листинге 2.1. Эта процедура просто
• няет местами содержимое двух ячеек памяти. При ручной трансляции с языка С
язык ассемблера мы пройдем следующие основные этапы:
Выделение регистров под переменные программы.
. Создание кода для тела процедуры.
1 Сохранение регистров на время вызова процедуры.
В этом разделе описывается процедура обмена, разбитая на три части, а в конце
части будут объединены.
Процедура sort
тобы вы по-настоящему смогли оценить скрупулезность программирования на
»ыкс ассемблера, мы рассмотрим второй, более длинный пример. На этот раз будет
«дана процедура, которая вызывает процедуру swap. Создаваемая программа сор-
трует массив целых чисел, используя пузырьковую сортировку, или сортировку
мена, которая является одной из самых простых и едва ли не самой быстрой из
зртировок. В листинге 2.4 показана версия программы на языке С. Мы еще раз
эедставим эту процедуру по частям, завершив ее рассмотрение полноценным
вариантом.
int 1. j .
for (1 - 0: 1 < n: 1 +- 1) {
for (j - i - 1; j >- 0 Si v[JJ > v[j ♦ 1]: J — 1) {
swap(v.j):
}
}
случае. Поскольку нам нужно проверить справедливость выражения $s0 > *al,
условный переход будет произведен в том случае, если значение регистра StO будет
равно нулю. Для всего этого потребуются две инструкции:
f o r l t s t :s i t S tO . SsO . Sal # р еги стр S tO - 0. если SsO > S a l 0> n)
b ee S tO . S z e r o .e x lt l # переход к нет ке e x i t l . если SsO i Sal d> n)
(те л о п е р в о го цикла fo r)
addr t s l. SsO . -1 # j - 1 - 1
r 2 t s t : s lt i S tO . S s l. 0 # реги стр S tO * 1 . если Ssl < 0 (J < 0)
bne S tO . sze ro . e x it 2 # п е р е х о д на e x 1 t 2 . если Ssl < 0 (j < 0)
s ll S t l. S s l. 2 # реги стр S t l - J * 4
add S t2 . S aO . S tl # р еги стр S t2 * v ♦ (j * 4)
lw S t3 . 0 (S t2 ) # р еги стр S t3 - v [ j]
lw S t4 . 4 (S t2 ) # р е ги стр S t4 = v[j + 1]
S it S tO . S t4 . S t3 # р е г и с т р S tO « 0 . если tt.4 > S t3
beq S tO . S z e ro . e x it 2 # переход на e x i t 2 . есл и S t4 > S t3
addl S s l. S s l. -1 # j -« 1
j fo r2 ts t # переход к проверке условия внутреннею цикла
a n t2
swap
ние р е ги с т р о в
Тело процедуры
Перемещение m ove S s 2 . SaO # к о п и р о в а н и е п а р а м е т р а SaO в S s 2 ( c o x p . SaO)
параметров m ove S s 3 . Sal # копирование парам етра $ a l a is 3 (со х р . S a l)
Внутренний addi S s l. S s l. -1 # j -= 1
Ц И КЛ j fo r2 ts t # переход к проверке условия в н у т р е н н е го цикла
Восстановление регистров
e x i t 1: lw SsO . 0 ($ sp ) # во сста н ов лен и е из с т е к а SsO
lw S s l. 4 (S sp ) # во сста н ов л ен и е из с т е к а Ssl
lw Ss2. 8 (S sp ) # во сста н ов лен и е из с т е к а Ss2
lw S s 3 .1 2 (S s p ) # во сста н ов л ен и е из с т е к а Ss3
lw S r a .l6 ( S s p ) # во сста н ов лен и е из с т е к а S ra
addi S s p .S s p . 20 # восстановление ука за те л я стека
Коэффициент
Относительная Относительная ускорения
Метод Оптими производитель производитель Quicksort по
Язык
выполнения зация ность пузырько ность сортировки сравнению
вой сортировки Quicksort с пузырьковой
сортировкой
С Компилятор Нет 1 ,0 0 1 ,0 0 2468
Компилятор 01 2,37 1,50 1562
Мы рассмотрели все части процедуры. Код M IPS для очистки массива с по
мощью индексов имеет следующий вид:
m ove П О . J z e r o # i - 0
loopl: s ll J t l. U O . 2 # J tl - 1 * 4
add J t2 .J a O .ttl # Jt2 = адрес a r r a y [ lj
sw Jze ro . 0 ($ t2 ) # a r r a y [ i] - 0
addi J tO .J tO .l # i - l ♦ 1
s it J t3 .ttO .J a l # Jt3 - (i < разм ер)
bne J t 3 .J z e r o ,lo o p l # если (i < р а зм е р ), п е р е х о д на lo o p l
(Этот код работает, пока size, то есть размер, больше нуля; ANSI С требует про
верки размера до запуска цикла, но здесь это правило будет проигнорировано.)
Режимы адресации
В табл. 2.13 показаны режимы адресации данных, поддерживаемые в ARM. В отли
чие от MIPS ARM не выделяет регистр для содержания нулевого значения. В MIPS
имеется всего три простых режима адресации данных (см. рис. 2.12), а вот у ARM
имеется девять режимов, которые включают довольно сложные вычисления. На
пример, в ARM имеется режим адресации, который для формирования адреса
186 Глава 2. Инструкции: язык компьютера
ARM MIPS
31 28 27 20 19 16 1S 12 11 0
ARM Op»* Op* R tf4 Rd4 Const’1
_L Г
Перенос данных 31 26 25 21 20 16 15 0
31 28 27 24 23
Условны* перевод
31 26 2$ 21 20 1 i IS
rr
MIPS Op* R sl5 | K i ' Const**
IK ТЛ %
Ъегусдоьмым nepeatopj
2b 2S
AWS
i в»*
1 C onsf*
Рис. 2.16. Ф орм аты инструкций ARM и MIPS. Разница заключается в том, что а одной
тектуре 16. а в другой 32 регистра
2.15. Реальное оборудование: инструкции ARM 189
Операция «population count* - это собственное имя операции вычисления веса Хэмминга
для битовой строки. Фактически подсчет суммы цифр в ней (или, что то же самое. —
числа единичных символов). — Примеч. ред
194 Глава 2. Инструкции: язык компьютера
registers). Микропроцессор 80386 содержит всего восемь GPR. Это означает, что
M IPS-программы могут использовать в 4 раза, а ARM-программы в 2 раза больше
регистров.
В табл. 2.15 показаны арифметические, логические инструкции и инструкции
переноса данных. Эти инструкции являются двухоперандными. У них есть две
важные характерные особенности. У арифметических и логических инструкций
х86 один операнд должен действовать и как источник, и как приемник, в то время
как ARM и M IPS предлагают для источника и приемника отдельные регистры
Это ограничение увеличивает нагрузку на сокращенное количество регистров, по
скольку один из регистров-источников должен быть изменен. Вторая характерная
особенность заключается в том, что один из операндов должен быть в памяти. Та
ким образом, в отличие от ARM и MIPS практически каждая инструкция должна
иметь один операнд в памяти.
Режимы адресации данных в памяти, подробно рассматриваемые ниже, пред
лагают два размера адресов внутри инструкций, Это так называемое смещение
может быть 8- или 32-разрядным.
Хотя для операндов в памяти может использоваться любой режим адресации,
существуют ограничения по выбору регистров, которые могут использоваться
в данном режиме. В табл. 2.16 показаны режимы адресации х86 и указаны те
регистры общего назначения, которые не могут быть использованы в каждом из
режимов, а также то, как можно получить такой же результат с использованием
М IPS-инструкций.
Т ип о п е р а н д а и с т о ч н и ка -п р и е м н и ка В тор о й о п е р а н д -и с то ч н и к
Регистр Регистр
Регистр Непосредственное значение
Регистр Память
Память Регистр
Память Непосредственное значение
2.16. Реальное оборудование: инструкции х86 195
Имя Использование
31 О
GPH О
GPR 1
GPR2
GPR3
GPR 4
GPRS
GPR 6
GPR 7
Ограниче
Режим Описание MIPS-эквивалент
ния
Косвенно- Адрес находится в регистре Только не ESP lw SsO.O(Ssl)
регистровый и EBP
Режим, ис Адрес содержится в базо Только не ESP Iw$s0,100($s1) # <= 16-разр.
пользующий вом регистре плюс смеще # смещение
базу с 8 - или ние
32-разрядным
смещением
База плюс Адрес — это База: любой mul $t0.$s2,4
масштабируе База + (2 ““ “ т',6х Индекс), GRP add $tO,StO,$s1
мый индекс где масштаб имеет значе Индекс: толь lw SsO.O(StO)
ние 0 , 1 , 2 или 3 ко не ESP
База плюс Адрес — это База: любой mul $t0,$s2,4
масштабируе База + ( 2 х Индекс) + GRP add StO.StO.Ss1
мый индекс смещение, где масштаб Индекс: толь )w Ss0,100($t0) # < * 16-разр.
С 8 - или имеет значение 0 ,1 . 2 или 3 ко не ESP # смещение
32 -разрядным
смещением
Инструкция Функция
je имя если равно (код условия) (Е1Р=имя),
EIP-128 <= имя < EIP-428
imp имя Е1Р=имя
—
call имя SP-SP-4; M[SP]=EIP+5; Е1Р=имя,
movwEBX,[EDI*45] EBX=M[EDI+45]
push ESI SP=SP-4; MJSP)=ESI
pop EDI EDI=M[SPJ; SP=SP*4
add EAX,#6765 EAX= EAX+6765
test EDX,#42 Установка кода условий (флагов) с помощью EDX и 42
movsl M|EDI)=M(ESI);
EDI-EDI-4; ESI=ESU4
Условные переходы в х86, как и в ARM, основаны на кодах условий, иди флагах.
Коды условий устанавливаются в качестве побочного результата операции и ис
пользуются чаще всею для сравнения значения результата с нулем. Затем переходы
проверяют коды условий. Переход на основе значения счетчика команд должен
быть указан в виде количества байтов, поскольку, в отличие от ARM и MIPS, не
все инструкции 80386 имеют длину 4 байта.
Строковые инструкции являются той самой частью, которая досталась се
мейству х86 по наследству от микропроцессора 8080 и в большинстве программ
обычно не используются. Зачастую они работают медленнее, чем их программные
эквиваленты (см. описание заблуждения в разделе 2.17 «Заблуждения и недораз
умения*).
Некоторые целочисленные инструкции х86 показаны в табл. 2.18. Многие ин
струкции доступны как формате байтов, так и в формате слов,
198 Глава 2. Инструкции: язык компьютера
Инструкция Значение
Управление Условные и безусловные переходы
|П2. jz Переход при соответствующем условии на EIP + 8 -разрядное смещение;
JNE (для JNZ), JE (для JZ) являются альтернативными именами
imp Безусловный переход —8 - или 16-разрядное смещение
call Вызов подпрограммы — 16-разрядмое смещение; адрес возврата про
талкивается в стек
ret Выталкивание адреса возврата из стека и переход на этот адрес
loop Циклический переход — декремент ЕСХ; переход на EIP + 8 -разрядное
смещение, если ЕСХ» 0
Перенос данных Перемещение данных между регистрами или между регистром
и памятью
move Перемещение между двумя регистрами или между регистром и памятью
push, pop Проталкивание операнда-источника в стек; выталкивание операнда из
вершины стека в регистр.
les Загрузка ES и одного из регистров общего назначения (GPR) из памяти
Арифметика, Арифметические и логические операции, использующие регистры
логика данных и память
add.sub Сложение источника с приемником; вычитание источника из приемника;
формат регистр-память
2.16. Реальное оборудование: инструкции х86 199
Инструкция Значение
Сравнение источника и приемника; формат регистр-память
Л shr. гсг Сдвиг влево; логический сдвиг вправо; вращение вправо с установкой
кода условия carry (перенос) по заполнению
Превращение байта в восьми самых правых битах per истра ЕАХ в 16-раз-
* *
рядное слово в правой части ЕАХ
М Логическое И над источником и приемником, установка кодов условий
«с. dec Инкремент приемника; декремент приемника
or. хек Логическое ИЛИ; исключающее ИЛИ; формат регистр-память
Работа со стр о Перемещение между строковы м и операндами; длина задается
ками преф иксом повторения
-novs Копирование из строки-источника в место назначения путем инкремента
ESI и EDI; может повторяться
tods Загрузка байта, слова или двойного слова из строки в регистр ЕАХ
Итог з н а к о м с т в а с х 8 6
У Intel 16-разрядный микропроцессор появился на два года раньше, чем более эле
гантные по архитектуре изделия его конкурентов, например микропроцессор Mo
torola 68000, и это обстоятельство стало главным фактором выбора микроироцес-
>ра 8086 в качестве центрального процессора для компьютера IBM PC. Инженеры
Intel в целом согласны с тем, что х86 труднее создавать, чем такие компьютерные
истемы, как ARM и MIPS, но более широкие рыночные возможности позволяют
выделять больше ресурсов на преодоление дополнительных сложностей. Стилевые
недостатки х86 компенсируются количественными показателями, создавая этому'
семейству привлекательность в обозримой перспективе.
Этому способствует то обстоятельство, что наиболее часто используемые ком
поненты архитектуры х86 не слишком сложны в реализации, судя но тому, что
AMD и Intel продемонстрировали, быстро подняв производительность программ
целочисленного вычисления с того уровня, который был в 1978 году. Чтобы до
стичь этого уровня производительности, компиляторы должны избегать тех частей
архитектуры, от которых трудно добиться работы с высокой скоростью.
200 Глава 2. Инструкции: язык компьютера
a) JE EIP + смещение
4 4 8
JE У сп еем * Смещение
б) CALL
8 32
г) PUSH ESI
S 3
PUSH Reg
e)TESTEDX, #42
7 1 8 32
Рис. 2.18. Форматы типичной инструкции х86. Кодирование постбайта показано на рис 2.19
Многие инструкции имею! одноразрядное поле w, которое сообщает о том, ивлиегся ли операция
байтом или двойным словом. Поле d в инструкции MOVиспользуется в инструкциях, которые могут
перемещать данные в память или из памяти, и показывает направление перемещения. Инструк
ция ADD требует 32 бита для поля непосредственного значения — immediate, поскольку в 32-раз-
рядном режиме непосредственные значения имеют размер либо 8 . либо 32 разряда В инструк
ции TEST поле immediate имеет длину 32 разряда, поскольку 8 -раэрядных непосредственных
значений при тестировании в 32-разрядном режиме не существует. В общем, длина инструкций
может варьироваться от 1 до 17 байт. Большая длина обусловливается дополнительными одно
байтными префиксами, наличием как 4-байткых непосредственных значений, так и 4-байтных
адресов перемещений, использованием кода операции (opcode) из 2 байтов и спецификатора
режима масштабируемого индекса, при котором добавляется еще 1 байт
reg w = 0 w= = 1 r/m mod =0 mod ■ 1 mod - 2 mod * S
0 AL AX EAX 0 addr=BX+SI =EAX Тот же адрес, Тот же адрес, Тот же адрес, Тот же адрес, To же,
что и в mod = 0 ♦ что и в mod - 0 + что и в mod = 0 ♦ что и в mod^O + что и
1 CL cx ECX 1 addr=BX+DI =ECX dispS disp8 displfi disp32 в поле
reg
2 DL DX EDX 2 addr-BP»SI “EDX
Рис. 2.19. Кодирование первого спецификатора адреса х86: mod, reg, r/m. Перныенегыре столбца покапывают кодирование 3-бито
вого поля reg, которое зависит от значения бита w кода операции (opcode) и от режима, в котором находится машина: 16-раэрядного режима
(8086) или 32-раэрядного режима (80386), Остальные столбцы раскрывают значения полей mod и r/m. Значение 3-битового поля r/m зависит
от значения 2-битового поля mod и размера адреса. В основном регистры, используемые в вычислениях адреса, перечислены в шестом и
седьмом столбцах под общим заголовком mod = 0 ; в режиме mod = 1 к ним добавляется 8 -раэридное смещение (displacement, сокращенно
disp), а в режиме mod = 2 — 16-разрядное или 32-разрядное смещение, в зависимости от режима адресации Исключения следующие:
1) при r/m = 6 , когда mod = 1 или mod = 2, в 16-раэрядном режиме выбирается ВР плюс смещение; 2) при т/m = 5, когда mod = 1 или mod = 2,
в 32-раэрядмом режиме выбирается EBP плюс смещение; и 3) при r/m « 4, а 32-раэрядном режиме, когда значение mod * 3, (sib) означает
использование режима масштабируемого индекса, показанного в табл. 2 .15. Когда mod = 3, поле г/m показывает регистр, используя то же
самое кодирование, которое используется в поле reg в сочетании с битом w
201
202 Глава 2. Инструкции: язык компьютера
*' новлять код через каждые несколько лет, заставляя его работать с новыми вер-
т ями операционных систем или на машинах новой модели. Написание программы
« языке высокого уровня, а не на языке ассемблера, не только позволяет будущим
о чпиляторам привязывать код к будущим машинам, но и упрощает поддержку
.«ирам.много обеспечения и позволяет профамме работать на большем количестве
однотипных компьютеров.
Заблуждение. Коммерческая важность совместимости на уровне двоичных кодов
гначает, что удачный набор инструкций не будет подвергаться изменениям.
1000-
900 •
800-
700-
600 -
500 -
400 -
т
S 300 -
В
хО 20 0-
100 -
0- I I I I I I I 1 I I I I 1-1 I I I Г I" г т
Год
Рис. 2.20. График роста количества инструкций в наборе х86 с течением времени. Хотя
некоторые из расширений набора инструкций имели вполне очевидную техническую ценность,
схорост- изменений, помимо всего, усложняла другим компаниям задачу создания совместимых
процессоров
204 Глава 2. Инструкции: язык компьютера
ИЛИ (or) or R
Таблица 2 .1 9 (продолжение)
MIPS-инструкции Имя Ф ормат
set less than immediate (установка -если меньше чем непосредственное slti
значение»)
'
set less than immediate unsigned (установка «если меньше чем непо sltiu I
средственное значение без знака»)
lump (переход) i J
jump register (переход по регистру) Jr R
jump and link (переход и ссылка) jal J
MIPS-псевдоинструкции Имя Ф ормат
move (перемещение) move R
Multiply (умножение) mult R
multiply immediate (умножение на непосредственное значение) multi I
load immediate (загрузка непосредственною значения) li I
branch less than (переход «если меньше чем») bit I
branch less than or equal (переход «если меньше чем или равно») Ые I
branch greater than (переход «если больше чем») bgt I
branch greater than or equal (переход «если больше чем или равно») bge I