"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автора

16H память на системной плате (старший байт)
17H общая память (младший байт)
18H общая память (старший байт)
30H память сверх 1 мегабайта (младший байт)
31H память сверх 1 мегабайта (старший байт)

Высокий уровень.

В данной книге имеется множество примеров доступа к этим пор-
там. Ниже приводится программа на Бейсике, устанавливающая число
дисковых накопителей, присоединенных к IBM PC. Прежде чем прочи-
тать два старших бита порта A, бит 7 порта B должен быть установ-
лен в 1. Существенно, что Вы должны вернуть значение этого бита
назад в 0 перед дальнейшей работой, иначе клавиатура будет запер-
та и для восстановления работоспособности машины Вам придется
выключить ее. Бейсик не позволяет двоичное представление чисел,
что затрудняет работу с цепочками битов. Простая подпрограмма
может заменить любое целое вплоть до 255 (максимальное значение,
которое может принимать номер порта) на восьмисимвольную двоичную
строку. После этого строковая функция MID$ позволяет вырезать
нужные биты для анализа. Основы битовых операций в Бейсике описа-
ны в приложении Б.

100 A = INP(&H61) 'получаем значение из порта B
110 A = A OR 128 'устанавливаем бит 7
120 OUT &H61,A 'посылаем байт назад в порт B
130 B = INP(&H60) 'получаем значение из порта A
140 A = A AND 128 'сбрасываем бит 7
150 OUT &H61,A 'восстанавливаем значение порта B
160 GOSUB 1000 'преобразуем в двоичную строку
170 NUMDISK$ = RIGHT$(B$,1) 'получаем нулевой бит
180 IF D$ = 1 THEN NUMDISK = 0: GOTO 230 'нет дисков
190 C$ = LEFT$(B$,2) 'берем два старших бита строки
200 TALLEY = 0 'переменная для числа дисков
210 IF RIGHT$(C$,1) = "1" THEN TALLEY = 2 'берем старший бит
220 IF LEFT$(C$,1) = "1" THEN TALLEY = TALLEY + 1 'и младший
230 TALLEY = TALLEY + 1 'счет начинается с 1, а не с 0
'теперь имеем число накопителей
1000 '''Подпрограмма преобразования байта в двоичную строку
1010 B$ = "" 'заводим строку
1020 FOR N = 7 TO 0 STEP -1 'проверка очередной степени 2
1030 Z = B - 2^N
1040 IF Z >= 0 THEN B = Z: B$ = B$+"1" ELSE B$ = B$+"0"
1050 NEXT 'повторяем для каждого бита
1060 RETURN 'все закончено

Низкий уровень.

Ассемблерная программа получает число имеющихся дисковых нако-
пителей тем же способом, что и в вышеприведенном примере, но