Программирование на языке ассемблера NASM для ОС UNIX, 2-е издание

Программирование на языке ассемблера NASM для ОС UNIX, 2-е издание
Автор: Столяров А.В.
Год: 2011
ISBN: 978-5-317-03627-0
Страниц: 190
Язык: Русский
Формат: PDF
Размер: 10 Мб

Download

Пособие основано на лекциях, читавшихся автором в рамках курса «Архитектура ЭВМ и язык ассемблера» в Ташкентском филиале МГУ весной 2007 года; часть материала также прошла апробацию в рамках курса «Архитектура ЭВМ и системное программное обеспечение» кафедры Прикладной математики МГТУГА в 2008, 2009 и 2010 гг.
Пособие ориентировано на практические занятия с использованием системы команд i386, «плоской» (бессегментной) модели памяти, ассемблера NASM и операционной системы Linux или FreeBSD; в частности, описываются конвенции системных вызовов обеих систем, также для обеих систем приводятся исходные тексты файлов с макроопределениями, призванными облегчить ассемблерное программирование на ранних этапах изучения дисциплины.

+

Глава 1. Введение

§1.1. Машинный код и ассемблер

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

Оперативная память состоит из одинаковых ячеек памяти, каждая из которых имеет свой уникальный номер, называемый адресом. Ячейка содержит несколько (чаще всего — восемь) двоичных разрядов, каждый из которых может находиться в одном из двух состояний, обычно обозначаемых как «ноль» и «единица». Это позволяет ячейке как единому целому находиться в одном из 2n состояний, где n — количество разрядов в ячейке; так, если разрядов восемь, то возможных состояний ячейки будет 28 = 256, или, иначе говоря, ячейка может «помнить» число от 0 до 255. Если требуется хранить число из большего диапазона, используют несколько идущих подряд ячеек памяти. Отметим, что при рассмотрении нескольких соседних ячеек как представления одного целого числа на разных машинах используют два разных подхода к порядку следования байтов. Один подход, называемый little-endian1, предполагает, что первым идёт самый младший байт числа, далее в порядке возрастания, и самый старший байт идёт последним. Второй подход, который называют big-endian, прямо противоположен: сначала идёт старший байт числа, а младший располагается в памяти последним. Процессоры, которые мы будем рассматривать, относятся к категории «little-endian», то есть хранят младший байт первым.

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

Важно понимать, что сама но себе ячейка памяти «не знает», как именно следует интерпретировать хранящуюся в ней информацию. Рассмотрим это па простейшем примере. Пусть у нас есть четыре идущие подряд ячейки памяти, содержимое которых соответствует шестнадцатеричным числам 41, 4Е, 4Е и 41 (соответствующие десятичные числа — G5, 79, 79, G5). Pin формацию, содержащуюся в такой области памяти, можно с совершенно одинаковым успехом истолковать:

• как целое число 1095G50881;

• как дробное число (т.п. число с плавающей точкой) 12.894105;

• как текстовую строку, содержащую имя ’ANNA’;

• и, наконец, как последовательность машинных команд; в частности, на процессорах платформы i38G это будут команды, условно обозначаемые inc есх, dec esi, dec esi, inc ecx. Что делают эти команды, мы узнаем позже.

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