Доброго времени суток! Сегодня речь пойдет об основах архитектуры IBM PC.
Итак, зададимся философским вопросом: что такое компьютер? Я рассматриваю компьютер
как нечто, состоящее из: a) совокупность всех УСТРОЙСТВ, имеющихся в нем (да,
с точки зрения компьютера не существует устройств "винчестер", "монитор", etc
- есть устройства "контроллер винчестера", "видеокарта"); b) имеющейся в компьютере
ОПЕРАТИВНОЙ ПАМЯТИ; c) ПРОЦЕССОРА, который этим всем делом управляет и производит
какие-то вычисления и прочие манипуляции. Это, конечно, состав не компьютера,
а его МОДЕЛИ, с которой имеют дело все программы. Отсюда любая операция обмена
устройство - память и устройство/память - процессор является чтением/записью
из(в) устройства(о)/памяти(ь).
Как производятся указаные операции? В наличии существует 65536 (2^16) номеров
устройств (т.н. ПОРТОВ ввода/вывода, не путать с LPT и COM-портами!) и уже_не_знаю_даже_сколько
адресов памяти (во времена 486-го процессора - 2^32). В памяти по каждому адресу
хранится один байт (8 бит, кто не знает). Одно устройство занимает, как правило,
несколько смежных портов. Таким образом, для выполнения операции обмена достаточно
знать адрес памяти или номер порта устройства (он иногда тоже называется адресом).
Есть еще одна деталька - процессор. Кроме АЛУ (арифметико-логического устройства)
и УУ (устройства управления) в нем есть еще одна важная часть - РЕГИСТРЫ. Регистры
представляют из себя особые ячейки хранения тех данных, с которыми процессор
работает в настоящий момент, и делятся на несколько групп. Первая из них - РЕГИСТРЫ
ОБЩЕГО НАЗНАЧЕНИЯ - как это видно из названия, служат для многих целей. Они
обозначаются AX (Accumulator), BX (Base register), CX (Counter), DX (Data register),
SP (Stack Pointer), BP (Base Pointer), SI (Source Index), DI (Destination Index).
Все они имеют разрядность 16 бит, при этом первые 4 регистра имею псевдонимы
для обращения к старшим (High) и младшим (Low) 8 битам по отдельности (AH, BH,
CH, DH, AL, BL, CL, DL). Начиная с 386-го процессора разрядность регистров увеличили
до 32 и дали им новые названия, прибавив к старым префикс E (Extended). (То
есть теперь регистры называются EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI). Старые
регистры теперь являются псевдонимами для доступа к нижним 16 битам новых (в
целях совместимости).
Среди всей памяти выделяется отдельная область, называемая СТЕКОМ (stack). Стек
можно представить как трубочку, запаянную с одного конца, куда запихиваются
слова или двойные слова, в зависимости от разрядности процессора (слово (word)
= 2 байта, двойное слово (double word, dword) = 4 байта). Стек используется
для хранения временных данных.
Теперь о великой подлости Intel, о которой я обещал поведать в прошлый раз.
Первый процессор из семенства х86 (8086) имел разрядность 16 бит и, таким образом,
мог по идее адресовать память 64К, чего, в принципе, уже тогда было маловато.
Инженеры Intel пошли по следующему пути: адрес памяти стали представлять в виде
не одного 16-битного числа, а двух (записываются через двоеточие, например 1234:4321).
При этом одно из них стали называть СЕГМЕНТОМ, а другое - СМЕЩЕНИЕМ. Теперь
линейный адрес (то есть тот, по которому идет собситвенно обращение к памяти)
стал вычисляться как (сегмент * 16 + смещение). Разрядность линейного адреса
составила 20 бит, или 1 мегабайт, чего в принципе тогда было достаточно. В
процессор ввели четыре новых 16-разрядных регистра, названных СЕГМЕНТНЫМИ. Они
обозначаются CS (Code Segment), DS (Data Segment), ES (уже не помню, как расшифровывается)
и SS (Stack Segment). Их названия говорят об их назначении, ES представляет
собой дополнительный регистр, который программа может использовать по своему
назначению). Теперь все обращения к памяти можно было вести только через сегменты.
Как вы можете понять, такое кодирование адреса является избыточным, то есть
один и тот же адрес 0x3E148 (так я буду обозначать число в шестнадцатеричной
системе) может быть представлен в сегментированной модели как 3000:E148, 3E00:0148,
3E10:0048, 3E14:0008, 3C52:1C28, и т.д. Но адресовать память выше 1 Mb таким
образом невозможно. Таким образом, все программы под DOS имеют в своем распоряжении
не более 1 Mb памяти (на самом деле - меньше, так как на часть этой памяти проецируется
BIOS и видеопамять, кроме того, внутри этого же мегабайта находится сама ОС).
Вы, вероятно, спросите: почему сегмент умножается на 16, а не на, скажем, 65536?
Отвечу честно: не знаю. Но в любом случае этот факт послужил палкой в колесах
для развития ПО под DOS. В Windows (начиная с 95-х и во всех NT) реализован
другой способ адресации: как вы помните, с 386-го процессора разрядность регистров
составила 32 бита, что позволило адресовать 4 Gb памяти безо всяких сегментов.
Итак, теперь мы знаем все, что нам необходимо, об устройстве ПРОГРАММНОЙ МОДЕЛИ
компьютера. Что ж, в следующий раз начнем писать нашу первую программу на С.
За сим все. Тема следующей рассылки - основные правила языка. До встречи!
Напоминание: если вы только что подписались на рассылку - напишите по адресу
av_13@mail.ru и сообщите примерный уровень ваших знаний (это необходимо мне,
чтобы знать, на какую аудиторю рассчитывать). И еще настоятельно рекомендую
прочитать все выпуски рассылки, начиная с первого.
Ведущий рассылки, av