Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Низкоуровневое программирование для дZeнствующих # 4


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Мыши прикалывались. Им было больно,
но они все равно лезли на кактус...
/рассылка для изобретателей фонариков на солнечных батарейках
НИЗКОУРОВНЕВОЕ ПРОГРАММИРОВАНИЕ #4

ПРЕДУПРЕЖДЕНИЯ:
ПРИГЛАШАЮТСЯ:
САЙТ HI-TECH:
> В связи с присутствием в рассылке графики настоятельно рекомендуем подписываться на HTML-версию.
> В связи с затянувшимся "расширением канала" у нашего провайдера возможны задержки с выпуском рассылки.
> авторы.
> корректоры.
> художники/дизайнеры.
> владельцы сайтов, авторы рассылок (для взаимной рекламы)
> (хм) спонсоры и рекламодатели.

> архив рассылки
> коллекция инструментов
> исходные тексты
> документация
> учебники, статьи
> форум и хм... гостевая книга

 

 2.2. Первое погружение в регистры...


   [1] Наверняка вы имеете представление о том, что такое переменная. Наиболее продвинутые даже знают, что переменная имеет тип. Кажется вполне естественным, что любой высокоуровневый язык программирования позволяет создавать любое количество переменных того или иного типа.
   Так вот, господа: при программировании на языке ассемблер вас ждет большой облом. Потому что для всех ваших навороченных вычислений вам разрешается использовать только четыре "переменных" с фиксированными "именами собственными" и имеющих фиксированную "длинну".
   Роль этих переменных играют так называемые "регистры общего назначения", их "имена собственные": AX, BX, CX, DX. Посмотреть на этих "рабочих лошадок" вы можете прямо сейчас, запустив свою до боли любимую программу debug и введя команду "r" (от аглицкого register).

   [2] То, что у вас должно появиться - это список доступных регистров и текущее значение каждого из них. Как видите, значения регистров AX, BX, CX, DX равно 0. Это означает, что они просто-напросто ЖДУТ, что в них внесут какое-либо значение. Однако прежде чем мы сделаем это, давайте уточним тип этих "переменных".
   А он очень простой, этот тип: шестнадцатеричное число в диапазоне 0...FFFF. Или, если в BIN, то от 0 до 1111 1111 1111 1111.
   Маловато будет? Мне тоже так кажется. А вот создатели первых "IBM-совместимых" :) компьютеров посчитали, что и этого - много. Подумать только, целый регистр использовать, если в большинстве случаев - всего-то ничего - двумя тетрадами (0...FF или 0...1111 1111) ограничиться можно.
   И вот придумали они такую фичу: можно обращаться не только к регистру целиком, но и к его половинкам, к СТАРШЕЙ и МЛАДШЕЙ.
   Вот и рисутся с тех пор в умных книгах схемка такая вот нездоровая:

AX
AH
AL

   А означает она следующее: Физически существует один регистр - AX, а вот логически он делится на два, на старшую (AH) и младшую (AL) части (от аглицкого high и low).
  Очевидно, что присвоить AX значение, например 72F9 мы можем следующими способами:

  1. AX = 72F9h (одной командой);
  2. AH = 72h ; AL = F9h (двумя командами);

  Точно так как и присвоить значение 78h регистру AH можно двумя способами:

  1. AH = 78h;
  2. AX = 7800h;

  То же самое, но для регистра AL:

  1. AL = 78h;
  2. AX = 0078h;

   [3] В прошлом выпуске рассылки мы научились выводить на монитор так называемый "дамп памяти". Если вы помните, то в левой части дампа указан адрес выводимого диапазона в формате FFFF:FFFF (сегмент + смещение).
   К чему это я вдруг вспомнил? А к тому, что "в компьютере" все и вся повязано друг с другом. "Максимальное смещение" внутри сегмента - FFFF. Максимальное значение регистра - FFFF.
   Для тех, кто еще сомневается в "повязанности": сравните адрес сегмента, дамп которого выводится по умолчанию со значением регистров DS, ES, SS, CS (это так называемые "служебные" регистры, их мы будем колупать при следующем погружении). Повязано, не так ли?

  [4] Но вернемся к нашим "баранам". Хотя регистры AX, BX, CX, DX более-менее взаимозаменяемы, каждый из них имеет некоторую специализацию. В частности:
   AX - "аккумулятор" и основной регистр, используемый в арифметических операциях.
   BX часто используется для хранения адреса начала таблицы перекодирования символов, а также может содержать смещение для коссвенной адресации.
   CX - счетчик числа повторения циклов и блочных пересылок. Никакой другой регистр не может быть использован для этих целей.
   DX используется как расширение аккумулятора для операций, дающих 32-разрядный результат.

   [5] Если рассматривать регистр целиком, то кажый из них имеет "длинну" в одно слово (16 бит). Биты регистра принято нумеровать слева направо.
   Так для числа 2F4Dh, внесенного в регистр AX, мы можем нарисовать такую вот навороченную табличку:

AX
2F4D
AH | AL
2F
4D
Номер бита
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
Значение бита
1
0
1
1
1
1
0
1
0
1
0
0
1
1
0
1
Тетрады
старшая AH
младшая AH
старшая AL
младшая AL

   Повторение пройденого: одной шестнадцатеричной цифре соответствует тетрада (4 шт.) цифр двоичных (они же - 4 бита). "Емкость" регистров AH, AL - две тетрады, т. е. 8 бит. Точно такую "длинну" имеют: коды символов, скан-коды клавиш, номера функций прерываний и куча всего прочего, чего вы пока не знаете. Емкость AX (состоящего из двух половинок) - 4 тетрады, т. е. 16 бит; они же (эти 16 бит) - "слово".

   [6] "Принудительно" присвоить регистру значение можно при помощи той же команды "r", только с параметром "имя собственное регистра".
   Например:
   - r ax [Enter] выбросит вам на монитор ":" после которого вы можете ввести новое значение регистра.
   Когда начнем учиться "отладке" вам это еще ого как пригодится!

   Вот, в общем-то и все, что вы должны усвоить при первом "погружении" "в регистры"...

 АНОНС!

    Скоро... совсем уже скоро мы начнем ПРОГРАММИРОВАТЬ!


Рассылка "Низкоуровневое программирование для дZенствующих", #4

http://subscribe.ru/
E-mail: ask@subscribe.ru

В избранное