Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

5. ОСОБЕННОСТИ ПРОЦЕССОРОВ I80386 И I80486

5.1. Преобразование адресов

5.2. Обработка прерываний

5.3. Мультизадачность

5.4. Режим виртуального процессора i8086

5.5. Виртуальные машины

5.6. Переключение в защищённый и реальный режимы

5.7. Процессор i80486

5.8. 80286, 80386, 80486...Что дальше?

Появление следующей после i80286 модели процессора фирмы Intel - процессора i80386 - предопределило конец эры использования средними и некоторыми большими организациями крупных компьютеров класса IBM-360/370 (аналогами которых являются широко распространённые в нашей стране ЭВМ серии ЕС). По своим возможностям персональные компьютеры, выполненные на базе процессора i80386 сопоставимы, а в ряде случаев превосходят ЭВМ серии ЕС. И это ещё без учёта потребительских свойств и затрат на ремонт и обслуживание. Последняя на момент написания данной книги модель - процессор i80486 - обладает ещё большей производительностью.

Несмотря на значительные архитектурные отличия по сравнению с процессорами i8086 и i80286, процессоры i80386 и i80486 обеспечивают полную совместимость с программным обеспечением, разработанным для более ранних моделей процессоров. Процессор i80386 выполняет все программы, составленные для процессора i8086, и притом делает это значительно быстрее, чем сам i8086.

К сожалению, часто владельцы такой мощной техники, как персональные компьютеры на базе i80386 и i80486, не используют возможностей этих компьютеров даже наполовину. Работая в среде операционной системы MS-DOS с программами, подготовленными специально для этой операционной системы, вы будете использовать только режим совместимости процессоров i80386 и i80486, остальные преимущества новых процессоров (помимо более высокой скорости выполнения программ) будут вам недоступны.

Аналогичное можно сказать и об операционной системе OS/2 версий от 1.0 до 1.3. Эта операционная система рассчитана на процессор i80286. Разумеется, вы можете использовать OS/2 этих версий в компьютерах на базе i80386 или i80486, однако лучше приобрести OS/2 версии 2.0 или более старшей версии, ориентированной на использование архитектурных особенностей новых процессоров.

Какие же преимущества имеют процессоры i80386 и i80486 перед предыдущими моделями? Приведём только самые важные, на наш взгляд, особенности новых процессоров:

  • Высокое быстродействие, определяемое, в частности, высокой тактовой частотой (25 Мгц, 33 Мгц и даже больше).
  • Разрядность процессоров i80386 и i80486 составляет 32 бита (предыдущие модели от i8086 до i80286 были 16-разрядными). Увеличение разрядности процессора приводит к увеличению скорости выполнения программ, так как процессор способен за один машинный такт обработать больший объём информации.
  • Расширенный набор машинных команд и большое количество поддерживаемых процессором типов данных позволяют создавать более эффективные, более компактные программы, которые работают значительно быстрее ориентированных на 16-разрядные процессоры.
  • Новый механизм преобразования адресов, являющийся дальнейшим развитием механизма, использованного в процессоре i80286. Теперь процессор может рассматривать память как один или несколько сегментов, причём размер сегмента может достигать 4 гигабайт (4*2*30 байт). С другой стороны, страничная адресация позволяет организовать защиту памяти для каждой страницы. Размер страницы составляет 4 килобайта. Использование страниц значительно облегчает реализацию виртуальной памяти.
  • Помимо реального и защищённого режима работы, в процессорах i80386 и i80486 предусмотрен режим виртуального процессора 8086 (виртуальный режим), в который процессор может войти из защищённого режима. Виртуальный режим позволяет эмулировать процессор i8086, находясь в защищённом режиме. Это, в частности, даёт возможность в мультизадачной операционной системе организовать одновременное выполнение нескольких программ, ориентированных на процессор i8086.

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

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

Итак, мы сконцентрируем внимание на практическом использовании самых важных особенностей процессора i80836. И первое, с чего мы начнём - это механизм преобразования адресов в процессоре i80836.

5.1. Преобразование адресов

Процессор i80386 в защищённом режиме использует трёхступенчатую схему преобразования адреса.

Программы используют логический адрес, состоящий из селектора и смещения (аналогично процессору i80286). Селектор полностью аналогичен используемому в процессоре i80286. Компонента смещения является 32-разрядной, т.к. допустимый размер сегмента значительно превышает 64 килобайта.

Уровень логического адреса - это первая ступень в схеме преобразования адресов.

Вторая ступень - получение из логического адреса 32-разрядного линейного адреса. Линейный адрес берётся из глобальной или локальной таблицы дескрипторов (GDT или LDT) в зависимости от соответствующего бита селектора (бит 2). Механизм получения линейного адреса напоминает механизм получения 24-разрядного физического адреса в процессоре i80286. Однако линейный адрес не отображается непосредственно на адресную шину памяти, то есть он не является физическим адресом.

Для получения из линейного адреса физического адреса используется третья ступень - механизм страничной адресации. С помощью этого механизма 20 старших бит линейного адреса используются для выбора блока памяти размером 4 килобайта. Такой блок называется страницей физической памяти. Оставшиеся 12 бит линейного адреса представляют собой смещение внутри страницы.

Процесс преобразования логического адреса в линейный иллюстрируется рис. 17.

Рис. 17. Преобразование логического адреса в линейный.

Значение из поля индекса селектора используется в качестве индекса в таблице LDT или GDT для выборки 32-разрядного базового адреса. Этот базовый адрес складывается со второй компонентой логического адреса - смещением. В результате получается 32-разрядный линейный адрес.

Преобразование линейного адреса в физический иллюстрируется рис. 18.

Рис. 18. Преобразование линейного адреса в физический.

Процесс вычисления адреса страницы часто называют трансляцией страниц. Старшие 10 бит линейного адреса используются как индекс в таблице, называемой каталогом таблиц страниц. Расположение каталога таблиц страниц в физической памяти определяется содержимым системного регистра процессора CR3.

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

Следующие 10 бит линейного адреса предназначены для индексации таблицы страниц, выбранной с помощью старших 10 бит адреса. Таблица страниц содержит 1024 дескриптора, определяющих физические адреса страниц памяти. Размер одной страницы составляет 4 килобайта, т.е. 4096 байт.

Младшие 12 бит линейного адреса указывают смещение к адресуемому байту внутри страницы.

На рис. 19 представлен формат дескриптора таблицы страниц.

Рис. 19. Дескриптор таблицы страниц.

Для представления старших 20 битов физического адреса таблицы сраниц в дескрипторе используются биты 12-31. Младшие 12 битов адреса таблицы всегда равны нулю, таким образом, таблица страниц должна быть выровнена в памяти на границу 4096 байт (на границу страницы).

Формат дескриптора страницы представлен на рис. 20.

Рис. 20. Дескриптор страницы.

Биты 12-31 в дескрипторе страниц указывают старшие 20 бит физического адреса страницы. Младшие 12 бит адреса страницы всегда равны нулю.

Назначение бит 0-11 одинаково и для дескриптора таблицы страниц, и для дескриптора страницы. В таблице 4 приведено описание этих бит.

Таблица 5. Биты 0-12 дескрипторов таблиц страниц и страниц.

Номер битаНазначение
0 (P)Бит присутствия в памяти. Установлен в 1, если определяемая данным дескриптором таблица страниц находится в оперативной памяти. Этот бит используется для организации виртуальной памяти.
1 (W)Разрешение записи. Если бит установлен в 1, то запись в страницы разрешена. Бит используется для организации защиты от записи на уровне страниц.
2 (U)Пользователь/супервизор. Используется для разграничения доступа к страницам операционной системы (страницы супервизора) и страницам программ пользователя. Значение бита, равное 0, соответствует страницам супервизора, 1 - страницам программы пользователя.
3-4Эти биты зарезервированы и должны быть установлены в 0 для совместимости со следующими моделями процессора.
5 (A)Бит доступа. Он устанавливается процессором перед выполнением операций чтения страницы или записи в страницу.
6 (D)Бит мусора. Устанавливается, если была выполнена запись в каталог или страницу.
7-8Эти биты зарезервированы и должны быть установлены в 0 для совместимости со следующими моделями процессора.
9-12 (AVL)Эти биты доступны для использования операционной системой (AVL - Available for use).

Мы видим, что для процессора i80386 добавилось ещё два типа таблиц, содержащих дескрипторы и, соответственно, два типа дескрипторов - дескриптор таблиц страниц и дескриптор страниц.

Для использования механизма трансляции страниц операционная система должна установить в 1 старший бит системного регистра CR0. Если этот бит не установлен в 1, физический адрес будет равен линейному, содержимое регистра адреса каталога таблиц страниц CR3 при этом для преобразования адреса использоваться не будет.

Форматы дескрипторов, располагающихся в таблицах GDT, LDT и IDT претерпели изменения по сравнению с используемыми в процессоре i80286. Например, вместо 24-битового физического адреса в дескрипторах должен находиться 32-битовый линейный адрес.

Напомним, что в дескрипторах процессора i80286 было зарезервировано два байта. Эти байты используются процессором i80386 (рис. 21).

Рис. 21. Дескрипторы для процессора i80386.

Процессор i80386 использует 32-разрядный базовый адрес сегмента и 20-разрядное поле предела. В зарезервированном для процессора i80286 поле в битах 24-31 находится старший байт 32-разрядного базового адреса сегмента. Биты 16-19 используются для хранения старших четырёх битов предела.

В процессоре i80286 поле предела указывало размер сегмента в байтах. Для процессора i80486 интерпретация поля предела зависит от установки бита G - бита гранулярности. Если бит G установлен в 1, поле предела содержит размер сегмента в страницах (размером 4096 байт). Если бит G сброшен, размер сегмента вычисляется в байтах.

Бит гранулярности G также находится в поле, которое в процессоре i80286 было отмечено как зарезервированное.

Поле, обозначенное на рис. 21 как X, указывает разрядность выполняемых команд, принятых по умолчанию. Если этот бит установлен в 1, используются 32-разрядные команды, если сброшен в 0 - 16-разрядные.

Бит AVL предназначен для использования системным программным обеспечением.

Бит S - признак системного сегмента. Если этот бит сброшен в 0, то сегмент системный.

Назначение остальных полей дескриптора аналогично используемому в процессоре i80286. В первой главе мы привели таблицу типов сегментов, в ней описаны и сегменты для процессора i80386.

5.2. Обработка прерываний

Процессор i80386 в защищённом режиме обрабатывает прерывания точно также, как и процессор i80286. Есть отличия в формате дескрипторов, располагающихся в дескрипторной таблице прерываний IDT. Эти отличия заключаются в использовании других значений в поле типа (см. таблицу 1 в главе 1) и в том, что два байта, зарезервированные в вентилях прерывания и исключения процессора i80286 используются процессором i80386 для хранения битов 16-31 32-разрядного смещения.

5.3. Мультизадачность

В процессоре i80386 получила дальнейшее развитие аппаратная поддержка мультизадачности, впервые введённая в процессоре i80286.

  • На рис. 22 представлен формат сегмента TSS для процессора i80386.
  • Рис. 22. Сегмент TSS процессора i80386.

    Из рисунка видно, что в TSS предусмотрены поля для хранения сегментных регистров GS, FS, DS, SS, CS, ES (процессор i80386 имеет два новых сегментных регистра - GS и FS). Имеется поле для хранения содержимого регистра LDTR, указывающего на локальную таблицу дескрипторов, распределённую данной задаче.

    Для хранения содержимого 32-разрядных регистров используются поля TSS, обозначенные на рисунке как EDI, ESI, EBP, ESP, EBX, EDX, ECX, EAX, EFLAGS, EIP.

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

    TSS процессора i80386 содержит указатели на стеки для второго, первого и нулевого приоритетных колец. Это поля SS2:ESP2, SS1:ESP1, SS0:ESP0.

    Поле LINK используется для ссылки на TSS вызвавшей задачи при вложенном вызове задач, аналогично тому как это было в процессоре i80286.

    Бит T используется для отладки. Если он установлен в 1, при переключении на задачу возникает отладочное исключение, которое может быть использовано системным отладчиком.

    Есть ещё одно очень интересное новшество, введённое в процессор i80386 - битовая карта ввода/вывода. Что это такое?

    Мы уже говорили о том, что для обеспечения безопасной работы системы необходимо ограничить доступ программам пользователя ко всем или по крайней мере к некоторым портам ввода/вывода. Злонамеренная программа, имеющая доступ к портам контроллера прямого доступа к памяти, может выполнить с помощью этого контроллера чтение или запись информации по любым физическим адресам. Процессор i80286 хранит в регистре флагов уровень привилегий IOPL, на котором разрешено выполнять команды ввода/вывода. С помощью этого механизма можно запретить непривилегированным программам выполнять команды ввода/вывода.

    Однако такой способ защиты не слишком удобен. Некоторые порты ввода/вывода не только безопасны для использования, но и весьма полезны для обычных программ (например, порт системного динамика или принтера).

    Битовая карта ввода/вывода процессора i80386 позволяет для каждой задачи определить порты, которые эта задача может использовать. То есть операционная система имеет возможность санкционировать любую задачу для использования любого набора адресов портов ввода/вывода. Если задача попытается обратиться к несанкционированному порту ввода/вывода, произойдёт исключение.

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

    Поле базы карты ввода/вывода указывает 16-разрядное смещение начала битовой карты ввода/вывода относительно TSS. Предел TSS должен определяться с учётом карты ввода/вывода.

    Каждый бит в карте ввода/вывода соответствует адресу байта порта ввода/вывода. После битовой карты должен располагаться байт 0FFh.

    При выполнении 16- или 32-разрядных операций ввода/вывода процессор проверяет все биты (2 или 4 бита), соответствующие адресу порта. Если проверяемый бит установлен в 1, происходит исключение.

    Для тех программ, которые являются привилегированными, если уровень привилегий меньше или равен уровню IOPL, процессор не выполняет проверку битовой карты ввода/вывода.

    Для того чтобы полностью запретить задаче обращаться к портам ввода/вывода, достаточно установить базу карты ввода/вывода большей или равной пределу TSS. В этом случае любая команда ввода/вывода приведёт к генерации исключения.

    5.4. Режим виртуального процессора i8086

    Процессор i80386 содержит средства для работы в так называемом режиме виртуального процессора i8086, называемого также для краткости режимом V86 или просто виртуальным режимом. Заметим, что до разработки фирмой Intel процессора i80836 термин "виртуальный режим" иногда использовался в литературе для обозначения защищённого режима работы процессора i80286.

    В режим V86 процессор может перейти из защищённого режима, если установить в регистре флагов EFLAGS бит виртуального режима (VM-бит). Номер бита VM в регистре EFLAGS - 17.

    Когда процессор i80386 находится в виртуальном режиме, его поведение во многом напоминает поведение хорошо знакомого нам процессора i8086. В частности, для адресации памяти используется схема <сегмент:смещение>, размер сегмента составляет 64 килобайта, а размер адресуемой в этом режиме памяти - 1 мегабайт.

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

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

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

    Обработчики прерываний защищённого режима могут моделировать функции соответствующих прерываний реального режима, что необходимо для правильной работы программ, ориентированных на реальный режим операционной системы MS-DOS.

    5.5. Виртуальные машины

    Обычно мультизадачные операционные системы предоставляют для выполнения i8086-программ "виртуальные машины i8086". Эти виртуальные машины реализуются при помощи задач виртуального режима.

    Операционная система может виртуализовать ресурсы компьютера - память, порты ввода/вывода, систему обработки прерываний. При этом программа, ориентированная на реальный режим MS-DOS получает в своё распоряжение ресурсы, которые она воспринимает как физические.

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

    Виртуализация ввода/вывода основана на том, что такие команды, как IN, OUT, INS, OUTS, CLI, STI чувствительны к текущему уровню IOPL. Так как обычно виртуальная машина работает в непривилегированном третьем кольце защиты, выдача этих команд программой в виртуальном режиме приводит к исключению. Операционная система может эмулировать действие этих команд безопасным для себя образом, что однако может привести к существенному замедлению работы виртуальной машины.

    Виртуализация прерываний основана на выходе процессора из виртуального режима и возврате в защищённый при возникновении прерываний. При возникновении прерывания управление получает обработчик защищённого режима, установленный операционной системой. Операционная система может эмулировать функции соответствующего обработчика реального режима, например, функции обработчика прерывания INT 21h MS-DOS или BIOS.

    5.6. Переключение в защищённый и реальный режимы

    Процессоры i80386 и i80486 могут легко переключаться из реального режима в защищённый и обратно с помощью команды MOV. Младший бит PE системного регистра CR0 (см. приложение) определяет текущий режим работы процессора. Если этот бит установлен в 1, процессор работает в защищённом режиме, а если в 0 - в реальном.

    Для переключения процессора из реального режима в защищённый можно использовать, например, такую последовательность команд:

     mov     ax,     cr0
     or      ax,     1
     mov     cr0,    ax
     

    Для совместимости с процессором i80286 оставлена возможность переключения в защищённый режим с помощью команды LMSW.

    Для возврата в реальный режим необходимо сбросить бит PE:

     mov     ax,     cr0
     and     ax,     0fffe
     mov     cr0,    ax
     

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

    Перед переключением в реальный режим из защищённого программа должна выполнить следующие действия:

    • обеспечить равенство линейных адресов физическим;
    • отключить трансляцию страниц, сбросив бит PG в регистре CR0;
    • загрузить ноль в регистр CR3 для сброса кэш-памяти страниц;
    • передать управление сегменту кода с пределом 64 килобайта;
    • загрузить в сегментные регистры SS, DS, ES, FS, GS селекторы дескрипторов, подготовленных для адресации памяти в реальном режиме и содержащих соответствующие реальному режиму значения;
    • запретить маскируемые и немаскируемые прерывания;
    • сбросить бит PE, переключив процессор в реальный режим;
    • выполнить команду дальнего перехода для очистки внутренней очереди команд процессора;
    • настроить систему прерываний для работы в реальном режиме;
    • разрешить прерывания;
    • загрузить в сегментные регистры значения, необходимые для работы в реальном режиме.

    Как видите, процедура возврата в реальный режим сильно упростилась и ускорилась по сравнению с использованной для процессора i80286. Однако большинство программ, переключившись в защищённый режим, никогда больше не возвращаются назад. Они либо всё время работают в защищённом режиме, либо переключаются в режим виртуального процессора 8086.

    5.7. Процессор i80486

    В этом разделе мы очень кратко опишем последнее на момент написания данной книги достижение фирмы Intel - процессор i80486. Этот 32-разрядный быстродействующий процессор специально предназначен для работы мультизадачных операционных систем, таких как UNIX или OS/2.

    Процессор i80486 полностью совместим с более ранними моделями - i8086, i80286, i80386, но в тоже время обладает существенно более высоким быстродействием. Наиболее часто встречающиеся в программах команды выполняются за один машинный цикл. На кристалле процессора находится 8-килобайтный кэш оперативной памяти, обеспечивающий высокую производительность даже при использовании относительно медленной памяти.

    Кроме того, процессор i80486 содержит встроенный 32-разрядный арифметический сопроцессор, значительно увеличивающий скорость выполнения арифметических команд.

    С точки зрения прикладного программиста процессор i80486 практически не отличается от процессора i80386 (за исключением более высокой производительности). Все отличия касаются только системного уровня. Так как программирование процессора i80486 на системном уровне - достаточно сложный процесс, мы не станем описывать этот процессор во всех подробностях. Как правило, большинство программистов никогда не работают с системными регистрами процессоров i80386 и i80486, оставляя эту работу операционной системе или драйверам расширенной памяти.

    В процессоре i80486 стали определены некоторые, зарезервированные ранее в процессоре i80386, биты регистров CR0, CR3, EFLAGS, есть некоторые новшества в таблицах страниц, новое исключение и несколько новых команд.

    В регистре CR0 стали определены пять новых битов - NE, WP, AM, NW, CD.

    В регистре CR3 определены два новых бита - PCD и PWT.

    В регистре EFLAGS появился новый флаг AC (бит 18). Этот бит вместе с битом AM регистра CR0 контролирует проверку выравнивания объектов в памяти.

    Форматы системных регистров CR0 и CR3 для процессора i80486, а также регистра EFLAGS описаны в приложении.

    Новое исключение касается проверки выравнивания и имеет номер 17. Оно возникает при попытке обращения к данным, не выровненным в памяти. Для того, чтобы при обращении к не выровненному операнду в памяти произошло исключение контроля выравнивания, должны быть установлены флаг AC в регистре EFLAGS и бит AM в управляющем регистре CR0.

    Заметим, что исключение контроля выравнивания генерируется только в программах, работающих в третьем, непривилегированном кольце.

    Добавились три команды, предназначенные для использования прикладными программами - BSWAP, XADD, CMPXCHG, а также три новые системные команды, управляющие кэшем и TLB - INVD, WBINVD, INVLPG. Новые команды облегчают и ускоряют работу с семафорами, что очень важно для мультизадачных операционных систем.

    Есть также некоторые изменения в формате команды MOV, используемой для доступа к тестовым регистрам. Появились новые регистры для работы с кэшем.

    В целом можно отметить, что архитектура процессора i80486 не претерпела революционных изменений по сравнению с процессором i80386. Поэтому в большинстве случаев прикладной программист может считать, что процессор i80486 - это очень быстрый вариант процессора i80386.

    5.8. 80286, 80386, 80486...Что дальше?

    В 1993 году должен появиться новый процессор - i80586. Предполагается, что он по своей производительности сможет составить реальную конкуренцию RISC-процессорам, используемым в рабочих станциях типа SUN. Фирма Intel пока хранит в секрете подробности архитектуры нового процессора, поэтому мы можем только догадываться о его возможностях.

    Учитывая преёмственность во всех процессорах, разрабатываемых фирмой Intel начиная с модели i8080, можно предполагать, что этот суперсовременный скоростной процессор будет способен выполнять программы, разработанные когда-то для процессора i8086, причём с необычайно высокой скоростью!
    Оставьте свой комментарий !

    Ваше имя:
    Комментарий:
    Оба поля являются обязательными

     Автор  Комментарий к данной статье
    Лилия
      Супер!!!
    Спасибо за статью! Она мне очень помогла!
    2007-02-07 00:43:34