* C for Dummies * Aleph * 2000-08-27 * 009 *
-----[00]----------[Quote of Day]-----------------------------------------
В замечательной книге Никлауса Вирта (автора языков Pascal, Modula и
Oberon) "Алгоритмы + Структуры данных = Программы", про которую я уже
упоминал в предыдущем выпуске, приводится следующая поучительная
история со ссылкой на цюрихскую газету от июля 1922 года.
> В этой истории говорится о человеке, который так описывает несчастье
> своей жизни:
>
> Я женился на вдове, у которой была взрослая дочь. Мой отец, который
> довольно часто нас навещал, влюбился в мою падчерицу и женился на
> ней. Следовательно, мой отец стал моим зятем, а моя падчерица стала
> моей матерью. Спустя несколько месяцев, моя жена родила сына,
> который стал шурином моего отца и одновременно моим дядей. У жены
> моего отца, то есть моей падчерицы, тоже родился сын. Таким образом,
> у меня появился брат и одновременно внук. Моя жена является моей
> бабушкой, так как она мать моей матери. Следовательно, я муж моей
> жены и одновременно ее внук, другими словами, я - свой собственный
> дедушка.
-----[01]----------[Hot News]---------------------------------------------
1. Очень старая, но все еще очень полезная книга Питера Нортона о
внутреннем устройстве IBM PC.
http://members.xoom.com/c4dummies/files/InsidePC.zip (246,149)
2. Документация по процессору x86
http://members.xoom.com/c4dummies/files/i086.zip ( 7,677)
http://members.xoom.com/c4dummies/files/i287.zip (106,391)
http://members.xoom.com/c4dummies/files/i386.zip (369,003)
http://members.xoom.com/c4dummies/files/i386tutorial.zip (123,909)
http://members.xoom.com/c4dummies/files/i387.zip (108,344)
http://members.xoom.com/c4dummies/files/i486.zip (409,200)
http://members.xoom.com/c4dummies/files/i586.zip ( 14,147)
-----[02]----------[Blah-Blah-Blah]---------------------------------------
Вероятно, все Вы слышали про язык программирования С++. Но, наверное, не
все знают про С--. Подробнее об истории этого языка, его достоинствах и
"второй жизни" можно прочитать на русской страничке программиста Михаила
Шекера: http://www.chat.ru/~sheker/.
> C-- - это язык программирования, занимающий промежуточное положение
> между Ассемблером и Си. Идеально подходит для написания маленьких
> программ, резидентов (TSR), драйверов, обработчиков прерываний. Для
> работы с языком C-- необходимо знакомство с Ассемблером и Си. Сейчас
> С-- умеет генерировать 32-битный код под ДОС и Windows. Автором языка
> SPHINX C-- является Peter Cellik (CANADA). Последняя авторская версия
> SPHINX C-- v0.203 от 28.Oct.96.
Там же Вы сможете найти большое количество примеров, последнюю версию
компилятора (обратите особое внимание на консольную версию) и документацию
по языку С--, которую советую внимательно изучить.
На той же страничке есть ссылка и на другой очень интересный проект C--
подобного языка (А.Халимовский) : http://www.chat.ru/~sheker/32.zip
(84,473)
> Идея написать компилятор для Win32 родилась при моем первом знакомстве
> с компилятором Sphinx C-- Питера Селлика (Peter Cellik) в 1996 году, но
> реализовать ее удалось лишь недавно, когда появилась возможность через
> Интернет найти исходные тексты для C--, поскольку начинать с нуля
> желания не было.
>
> Итак, коротко о главном. Основной принцип построения приложений для
> 32-разрядной системы, предлагаемый в различных компиляторах,
> заключается в разделении кода на несколько секций: .text, .data,
> .idata, .reloc, .rsrc и т.д., которые строятся из самих исходных
> текстов и различных файлов описаний и ресурсов на стадии сборки
> программой-линковщиком (link). По сути дела осталась старая схема
> построения: compiler + linker -> exe-file. Кроме того, большой набор
> различных библиотек... которые к тому же существенно меняются от версии
> к версии, что совсем не радует. И если вы переходите на новую, более
> продвинутую версию компилятора, то нет никакой гарантии, что вы сможете
> на нем перекомпилировать свои старые программы - примером служит DDK от
> MicroSoft.
>
> Sphinx C-- изначально был задуман и реализован для создания компактных
> по размеру COM-файлов и поэтому вполне подходит для генерации
> 32-разрядных приложения в модели плоской (flat) памяти. Помимо этого
> большим плюсом является идея открытого кода для всех вызываемых в
> программе библиотечных функций, реализованная посредством *.h-- файлов.
>
> Еще одна идея из компилятора Sphinx C--, заслуживающая внимания, - это
> динамические процедуры, т.е. процедуры, которые могут быть помещены в
> тело компилируемой программы только тогда, когда к ним есть обращение.
> Таким образом, в процессе написания программы с использованием
> динамических процедур гарантируется включение в тело программы только
> того кода, который действительно необходим.
>
> В процессе работы по переводу компилятора Sphinx C-- на платформу Win32
> произведены весьма существенные изменения как в самом компиляторе, так
> и в идеях, на которых он реализован. Я не буду здесь выделять все
> отличия настоящего компилятора от его прародителя по той простой
> причине, что те, кто с ним знаком, их смогут увидеть сами, а тем, кто
> не имел дела с С--, нет нужды вникать в эти детали.
>
> Отмечу, однако, что принцип генерации кода, использовавшийся в С--,
> заменен на принцип, используемый в макроассемблере TMA Свена Клозе (TMA
> macro assembler Sven Klose), с проведением его адаптации к нуждам С--.
>
> В результате появился данный компилятор, целью которого является
> заполнение ниши между языком ассемблера и языком С.
Разумеется, я советую Вам внимательно изучить документацию и к этому
языку.
Вы не должны опасаться, что у Вас в голове все смешается - синтаксис этих
языков практически повторяет синтаксис C.
-----[03]----------[Topic]------------------------------------------------
Memory Models.
-----[04]----------[Body]-------------------------------------------------
Memory Models
-------------
Фирма IBM, разработчик и производитель непревзойденной OS/360, с большим
пренебрежением отнеслась к только что возникшему рынку персональных
компьютеров. Она вышла на него очень поздно, с большой неохотой и с
плохоньким компьютером, собранным из самых дешевых компонентов.
К несчастью, и операционная система для него была наспех переделана из
8-разрядной CP/M. Все это имело совершенно ублюдочный вид и элитарные
пользователи роскошных Mac'ов на процессоре Motorola просто надрывали
животики, разглядывая карикатуры на IBM PC в компьютерных журналах.
Никто в те годы не мог и предположить, что исключительная дешевизна,
открытая архитектура и примитивнейшая операционная система станут
факторами, на десятилетия определившими понятие "Персональный компьютер".
Миллионы людей начнут свое знакомство с вычислительной техникой с этого
кошмара, сам термин "персоналка" в сознании масс закрепится именно за IBM
PC, а недоделанная MS DOS станет самой популярной операционной системой
всех времен и народов, обогнавшей по количеству написанных под нее игр,
утилит и приложений все другие OS вместе взятые.
Но вернемся к исходной точке: дешевка.
Все в этом уродце, IBM PC, было подчинено одной цели - подешевле.
Дешевым был и процессор - псевдо 16-разрядный 8088 фирмы Intel.
В отличие от более дорогой модели - 8086, он имел 8-разрядную шину данных,
что существенно снижало быстродействие.
Весь сегодняшний выпуск построен на материале книг двух замечательных
авторов, по книгам которых выучилось не одно поколение программистов.
Мне показалось нелепым пересказывать их своими словами и я ограничился
простым цитированием.
Приводимый ниже текст взят из книги одного из разработчиков IBM PC D.D.
Bradley.
> Внутри процессора имеются специальные ячейки памяти, называемые
> регистрами. В регистрах можно сохранять данные-операнды или адреса
> памяти. Поскольку регистры расположены внутри самого процессора, он
> имеет очень быстрый доступ к находящимся в них данным, намного более
> быстрый, чем к данным в памяти. Если в программе требуется быстрый
> доступ к какой-либо переменной, то хранение ее значения в регистре
> ускоряет выполнение. Набор регистров 8088 состоит из нескольких групп.
>
>
> Регистры 8088
>
> +-------------+-------------+
> | AX | AH | AL |
> | BX | BH | BL | Регистры общего
> | CX | CH | CL | назначения
> | DX | DH | DL |
> +-------------+-------------+
>
> +---------------------------+
> | SI |
> +---------------------------+
> | DI | Адресные регистры
> +---------------------------+
> | BP |
> +---------------------------+
>
> +---------------------------+
> | SP |
> +---------------------------+
> | IP | Регистры управления
> +---------------------------+
> | FLAGS |
> +---------------------------+
>
> +---------------------------+
> | CS |
> +---------------------------+
> | DS |
> +---------------------------+ Сегментные регистры
> | ES |
> +---------------------------+
> | SS |
> +---------------------------+
>
>
> РЕГИСТРЫ ОБЩЕГО НАЗНАЧЕНИЯ
>
> В первую группу входят регистры, используемые в основном для
> вычислений. Все эти общие регистры имеют размер 16 бит, но программа
> может работать и со старшими или младшими 8-ю битами каждого регистра
> отдельно. Например. регистр AX состоит из 16 бит. Программа может
> обратиться к старшим 8 битам AX как к регистру AH, а младшие 8 бит
> образуют регистр AL.То же самое верно для регистров BX, CX и DX.
> Программа может рассматривать эту группу регистров как четыре
> 16-битовых, восемь 8-битовых или некоторую комбинацию 8- и 16-битовых
> регистров.
>
> Основное назначение группы общих регистров - хранить операнды. Общие
> регистры характерны способностью хранить как слово, так байт данных.
> Однако эти регистры при выполнении определенных операций имеют
> специальное назначение, либо они могут иметь особые возможности помимо
> тех, которые имеются у остальных регистров этой группы. В следующих
> разделах отмечены некоторые из специальных функций этих регистров.
>
> Регистр AX соответствует сумматору более ранних процессоров. Хотя 8088
> значительно более универсален, например, в части арифметических
> операций, чем ранние машины вроде процессора 8080, регистр AX имеет
> несколько специальных функций. Фирма Intel оптимизировала набор команд
> 8088, привлекая к выполнению некоторых операций регистр AX. Например,
> существуют непосредственные операции, в которых один из операндов
> подразумевается самой командой. Непосредственные операции с регистрами
> AX и AL (16- и 8-битовый сумматоры соответственно) обычно требуют более
> короткой команды, чем аналогичные операции с привлечением других
> регистров общего назначения. А меньший размер команды позволяет
> получать более компактные и быстродействующие программы.
>
> Регистр BX служит как регистром для вычислений, так и адресным
> регистром. При использовании в качестве 16-битового регистра он может
> служить для определения адреса операнда. Способы адресации для
> микропроцессора 8088 выделены в следующий пункт.
>
> Набор команд 8088 использует регистр CX в качестве счетчика к некоторым
> инструкциям. Эти команды используют находящееся в CX значение как
> указатель числа итераций команды или фрагмента программы.
>
> Регистр DX служит как расширение аккумулятора для много разрядных
> операций умножения и деления. В этих 32-битовых операциях участвуют
> одновременно регистры AX и DX.
>
>
> РЕГИСТРЫ АДРЕСАЦИИ
>
> В процессоре 8088 имеется четыре 16-битовых регистров, которые могут
> принимать участие в адресации операндов. Один из них является
> одновременно регистром общего назначения - регистр базы BX. Другие три
> - это указатель базы (Base Pointer - BP), индекс источника (Source Index
> - SI) и индекс назначения (Destination Index - DI).
>
> Программа может использовать регистры BP, SI и DI в качестве 16-битовых
> операндов, но отдельные байты в них недоступны. Основное назначение
> этих регистров - поставлять 16-битовые значения, используемые в
> формировании адресов операндов.
>
> Каждая команда в 8088 задает для выполнения некоторую операцию. Разные
> операции могут иметь от нуля до двух операндов. Например, команде
> разрешения прерываний Set Interrupt (STI) операнды не нужны. Команда
> Increment (INC) требует, чтобы программист определил один операнд, -
> регистр или ячейку памяти, - который должен быть увеличен на единицу.
> Команда ADD (сложение) должна иметь два операнда - складываемые
> величины. Некоторые команды неявно задают расположение операнда, но
> большинство команд позволяют программисту выбирать в качестве операнда
> регистр или ячейку памяти. Если в качестве операнда выбран регистр, то
> программисту остается только указать его имя. Для указания же в
> качестве операнда участка памяти есть много различных способов.
Хотя книга Брэдли посвящена ассемблеру IBM PC, приводимые в ней сведения
равно относятся к любому языку и компилятору для этого компьютера.
Вот что пишется там об использованном инженерами Intel трюке с
формированием адреса (это позволило обойтись 16-разряднами регистрами и
привело к необходимости сегментированной модели памяти, на многие годы
ставшей кошмарным проклятием разработчиков программного обеспечения для
IBM PC).
> ФИЗИЧЕСКАЯ АДРЕСАЦИЯ
>
> Все, что до сих пор говорилось об адресации, относится к генерации так
> называемого смещения (offset) адреса. Смещение имеет 16-битовое
> значение. 8088 сегментирует память таким образом, что можно
> адресоваться к памяти большей чем 64K. В этом пункте будет показан
> способ сегментации 8088.
>
> Поскольку размер слова в микропроцессоре 8088 равен 16 бит, для него
> естественно генерировать адреса в 16 бит длиной. Это делает доступными
> для прямой адресации 2^16 элементов или 65,535 байт памяти. Однако
> для некоторых программ 64K ячеек памяти недостаточно. Поэтому фирма
> Intel сконструировала 8088 для адресации 2^20 байт или одного мегабайта
> памяти.
>
> Для получения 20-битовой адресации требуется еще четыре бита к
> имеющимся 16-ти. Добавочные 4 бита адресной информации берутся из
> сегментных регистров. Сегментные регистры сами имеют размер 16 бит.
> 8088 комбинирует 16-битовый адрес смещения и 16-битовый регистр сегмента
> как показано на рисунке ниже. Процессор дополняет сегментный регистр
> 4-мя нулевыми битами, что составляет вместе полное 20-битовое значение.
> К расширенному значению сегмента процессор добавляет адрес смещения,
> определяемый через вычисление адреса. 20-битовый результат является
> указателем на исполнительный адрес.
>
> +---------+
> | Сегмент | 0000
> +---------+
> +-----------+
> + | Смещение |
> +-----------+
> --------------------
> +------------------+
> | 20-битовый адрес |
> +------------------+
>
> Каждая обращающаяся к памяти команда может сформировать только
> 16-битовый адрес операнда. В действительности процессор применяет этот
> адрес внутри определенного сегмента. Рисунок ниже иллюстрирует такой
> способ применения сегментации.
>
> +------------------+ -----+----Сегментный регистр
> || | |
> || | смещение
> || | |
> Сегмент |+------------------+ -----+----Адресуемая область
> 64К +------------------+
> || |
> || |
> || |
> +------------------+
> | |
>
> Начальный адрес сегмента всегда имеет нули в младших четырех битах.
> Такой адрес имеет каждая шестнадцатая ячейка памяти. Конструируя
> расположение данных в своей программе помните, что сегмент всегда
> должен приходиться на такую 16-битовую границу. Эти границы называются
> также границами параграфов.
>
>
> СЕГМЕНТНЫЕ РЕГИСТРЫ
>
> Intel 8088 имеет четыре сегментных регистра: CS,DS,SS и ES - для
> кодового, данных, стекового и дополнительного сегментов соответственно.
> Это их обычное использование, но применение этих регистров может
> изменяться в соответствии с потребностями программы.
>
> 8088 использует регистр сегмента программы для идентификации того
> сегмента, который содержит выполняемую в данный момент программу. В
> сочетании с указателем команд регистр CS используется для указания
> текущей команды. Каждая выполняемая команда находится в ячейке, на
> которую указывает пара регистров CS:IP.
>
> Комбинация сегментного регистра с регистром смещения для указания
> физического адреса записывается в виде сегмент:смещение, например,
> CS:IP. Значение сегмента стоит перед двоеточием, смещение - после.
> Такая нотация используется и для регистров, и для абсолютных адресов.
> Вы можете писать такие адреса как CS:100, DS:BX, 570:100, или 630:DI.
>
> Регистр сегмента данных (DS) процессор использует для обычного доступа
> к данным. Схемы адресации для операндов, которые мы рассматривали в
> предыдущем пункте, дают 16-битовое смещение, и в большинстве случаев
> для формирования исполнительного адреса процессор комбинирует это
> смещение с регистром DS.
>
> Регистр сегмента стека указывает на системный стек. Команды PUSH, POP,
> CALL и RET управляют данными в стеке в позиции по адресу SS:SP.
> Регистр SP - указатель стека - служит для определения смещения в стеке.
> Кроме того, сегмент стека подразумевается по умолчанию при адресации с
> использованием регистра BP. Это дает доступ к данным в стеке с
> использованием в качестве указателя регистра BP. В следующей главе есть
> пункт о стековых операциях, который демонстрирует, каким образом
> адресация через BP упрощает связь с данными в стеке.
>
> Наконец, регистр дополнительного сегмента используется 8088 для доступа
> к данным, когда требуется более одного сегмента. Обычной операцией
> такого рода является копирование данных из одной области памяти в
> другую. Между областями, находящимися не внутри одного и того же блока
> памяти размером 64К, невозможно произвести обмен данными, используя
> единственный сегментный регистр. Имея в распоряжении дополнительный
> сегментный регистр, программа, как показано на рисунке, может указать
> одновременно исходный и целевой сегменты. Регистр DS указывает область
> исходных данных, а регистр ES -
>
> | |
> +--------------------+ ----- DS
> Копировать | Сегмент - |
> отсюда --------+ |
> | | источник |
> | +--------------------+
> | | |
> | | |
> | +--------------------+ ----- ES
> | | Сегмент |
> | | |
> сюда --------+ назначения |
> +--------------------+
>
> сегмент назначения. Для передачи данных существуют специальные
> строковые команды, которые автоматически используют регистры DS и ES
> для указания исходного и целевого регистров.
Итак, подытоживая:
Выбранный способ адресации накладывает физическое ограничение на доступ к
памяти компьютера.
Несмотря на то, что общий объем адресуемой памяти 2^20 -> 1 Mb,
одномоментно доступна только небольшая часть памяти - сегмент в 64 Kb,
для доступа к памяти за пределом сегмента, необходимо изменить значение
сегментного регистра.
Сегмент всегда начинается с границы параграфа (кратен 16 байт), то есть
младшие 16 бит сегментного адреса всегда нулевые.
Поскольку этот материал очень важен для понимания работы компилятора, я
приведу еще одно описание, взятое из книги P. Norton "Inside the IBM PC".
> Каждая ячейка памяти имеет адрес, который используется для ее
> нахождения. Адреса - это числа, начиная с нуля для первой ячейки
> увеличивающиеся по направлению к последней ячейке памяти. Поскольку
> адреса - это те же числа, компьютер может использовать арифметические
> операции для вычисления адресов памяти.
>
> Архитектура каждого компьютера накладывает собственные ограничения на
> величину адресов. Наибольший возможный адрес определяет объем адресного
> пространства компьютера или то, какой объем памяти он может
> использовать. Обычно компьютер использует память меньшего объема, чем
> допускается его возможностями адресации. Если архитектура компьютера
> предусматривает небольшое адресное пространство, это накладывает
> суровые ограничения на возможности такого компьютера.
>
> IBM/PC использует возможности адресации микропроцессора 8088 полностью.
> Адреса в 8088 имеют длину 20 бит, следовательно, процессор позволяет
> адресовать два в двадцатой степени байта или 1024 К.
>
> Такое большое адресное пространство позволяет свободно использовать
> ресурсы памяти для специальных целей, что мы увидим в следующем
> разделе. Перед этим необходимо разобраться в том, как 16-разрядный
> компьютер работает с 20-разрядными адресами и какие ограничения это
> может наложить на программы пользователя.
>
> Большая часть арифметических операций, которые может выполнять
> микропроцессор 8088, ограничивается манипуляцией с 16-разрядными
> числами, что дает диапазон значений от 0 до 65,535 или 64 К. Поскольку
> полный адрес должен состоять из 20 разрядов, необходимо было
> разработать способ управления 20 разрядами. Решение было найдено путем
> использования принципа сегментированной адресации.
>
> Если взять 16-ти разрядное число и добавить к нему в конце четыре
> двоичных нуля, то получится 20-ти разрядное число, которое может
> использоваться как адрес. Добавлением четырех нулей или сдвиг числа
> влево на четыре разряда фактически означает умножение числа на 16 и
> теперь диапазон значений будет составлять 1.024К. К сожалению, число с
> четырьмя нулями в конце может адресовать только одну из 16 ячеек памяти
> - ту, адрес которой оканчивается на четыре нуля. Все остальные ячейки,
> адреса которых оканчиваются на любую из остальных 16 комбинаций из
> четырех бит, не могут быть адресованы при таком методе адресации.
>
> Для окончательного решения проблемы 20-разрядной адресации используются
> два 16-разрядных числа. Считается, что одно из них имеет еще четыре
> нуля в конце (выходящие за пределы разрядной сетки). Такое как бы
> 20-разрядное число называется сегментной частью адреса. Второе
> шестнадцатеричное число не сдвигается на четыре разряда и используется
> в своем нормальном виде. Это число называется относительной частью
> адреса. Сложением этих двух чисел получают полный 20-разрядный адрес,
> позволяющий адресовать любую из 1.024 К ячеек памяти в адресном
> пространстве IBM/PC. Сегментная часть адреса задает ячейку с адресом,
> кратным 16, эта ячейка называется границей параграфа. Окончательное
> значение указывает конкретную ячейку на определенном удалении от границы
> параграфа.
>
> Хотя относительная часть адреса могла бы задавать только четыре
> последних цифры адреса, она принимает значения от 0 до без единицы 64К.
> Большая часть манипуляций с адресами связана с относительной частью
> адреса. Сегментная часть адреса фактически становится базовым адресом
> для рабочей области размером 64К, которую позволяет адресовать
> относительная часть адреса.
>
> Имеется удобный способ записи сегментированных адресов. Сначала
> записывается сегментная часть адреса, после нее следует двоеточие, а
> затем относительная часть адреса.
>
> Например, если сегментная часть адреса (в шестнадцатеричной форме)
> 2222, а относительная часть - 3333, то полный сегментированный адрес
> будет записываться как 2222:3333. Фактический 20-разрядный адрес будет
> в шестнадцатеричном виде иметь значение 25553, получаемое таким простым
> сложением:
>
> 22220
> +
> 3333
> _____
>
> 25553
>
> Для работы с сегментированными адресами микропроцессор 8088 имеет
> специальные регистры сегментов, предназначенные для хранения сегментной
> части адресов. Загрузив в регистр сегмента некоторое значение, можно
> адресовать следующие за ним 64К ячеек памяти. Без изменения значения в
> регистре сегмента компьютер может работать только с 64К байтами из
> общего адресного пространства в 1.024К. Путем изменения значения в
> регистре сегмента можно адресовать любую ячейку памяти.
>
> Чтобы иметь возможность в каждый момент времени работать более чем с
> 64К памяти, в микропроцессоре 8088 предусмотрены четыре различных
> регистра сегмента, каждый из которых имеет особое назначение. Память
> компьютера используется для различных целей - часть ее занимает
> программа, другая часть используется для хранения данных, с которыми в
> данный момент работает программа. Поэтому два регистра сегмента
> выделены для программы и для данных. Для указания базового адреса
> программного или кодового сегмента используется регистр CS. Для
> указания сегмента данных используется регистр DS. Еще одна область
> памяти, используемая для специальных целей, называется стеком и ее
> адрес указывается регистром стека SS. И, наконец, для обеспечения
> дополнительных возможностей адресации имеется регистр дополнительного
> сегмента (или сегмента расширения), ES.
>
> Когда программа подготавливается к выполнению, операционная система,
> такая как DOS, выбирает ячейки каких разделов будут использоваться для
> размещения кодовой части программ, данных и стека. В регистры сегментов
> CS,DS и SS заносятся адреса этих ячеек. При выполнении программы адреса
> в этих регистрах позволяют находить нужные ячейки памяти.
>
> Следует понять, что эти регистры совсем не обязательно должны указывать
> на сегменты памяти, расположенные далеко друг от друга. Они могут
> указывать на любые ячейки, находящиеся далеко или близко друг от друга
> и даже располагающиеся в одном разделе. Если необходимо всего пару
> тысяч байт для размещения программы и данных, кодовый сегмент и сегмент
> данных могут располагаться рядом. И хотя фрагменты кодового сегмента и
> сегмента данных используются при выполнении программы по-разному,
> 64К-байтные области, адресуемые соответствующими регистрами сегментов,
> могут пересекаться.
>
> Если программа не изменяет содержимого своих регистров сегментов, то
> она может использовать только 64К данных и кодовую часть объемом 64К. С
> другой стороны, если программа будет манипулировать содержимым
> регистров сегментов, то она сможет работать с данными любого объема,
> вплоть до 1024К. Может использоваться любой из режимов работы, но на
> практике обычно фиксируют содержимое регистра сегмента данных и при
> необходимости изменяют содержимое регистра кодового сегмента. Такой
> способ организации работы поддерживается набором команд микропроцессора
> 8088, обеспечивающим очень удобный способ загрузки регистра кодового
> сегмента CS, путем использования команд FARCALL и FARRET.
>
> Практические результаты такой организации выразились в том, что DOS и
> языковые процессоры используют программные соглашения, которые
> позволяют увеличивать объем программ практически неограниченно, в то
> время как их адресуемая область данных ограничена 64К.
В следующем выпуске мы выясним, каким образом эта физическая сегментная
модель адресации памяти процессора 8086/8088 отображается в логические
модели памяти компилятора Turbo C.
-----[05]----------[Info]-------------------------------------------------
Вопросы и замечания принимаются по адресу: aleph@canada.com
Предыдущие выпуски доступны со страницы архива:
http://www.subscribe.ru/archive/comp.prog.c4dummies/
или (в упакованном виде):
http://members.xoom.com/c4dummies/archive/000.zip
. . .
http://members.xoom.com/c4dummies/archive/008.zip
Рассылка дублируется (только текстовый вариант) с сервера www.egroups.com
Подписка: c4d-subscribe@egroups.com
-----[--]----------[The End]----------------------------------------------
© Gazlan 2009 * gazlan@yandex.ru
|