Жанр: Учеба
Справочник программиста на IBM PC
...как это делается
при дисковых операциях. ES:BX указывают на буфер в памяти, куда
будут посылаться данные, а CX - число байтов, которые надо считать.
При возврате DX сообщит сколько байтов прочитано на самом
деле, а ES:BX будут указывать на последний считанный байт плюс 1.
Флаг переноса будет равен 0, если чтение прошло успешно, а в
противном случае AH будет содержать 1, если проблема с контролем
ошибки, 2 - при ошибке чтения данных и 3 - при отсутствии данных
на ленте.
Функция 3 прерывания 15H записывает данные на кассету. ES:BX
указывают на первый байт данных, а CX содержит число байтов,
которое надо записать. При возврате ES:BX указывают на байт,
следующий за последним записанным. Мотор управляется функциями 0
(включение) и 1 (выключение) прерывания 15H. Для этих функций нет
выходных регистров.
7.3.2 Чтение позиции светового пера.
Хотя очень немногие компьютеры оснащены световым пером, тем не
менее это одно из немногих вспомогательных устройств, которое
поддерживается как оборудованием, так и операционной системой.
Световое перо работает с помощью небольшого оптического детектора
на кончике пера. По ходу сканирования экрана электронным лучом
инициируется импульс оптического детектора, когда пучок достигает
точки экрана, над которой находится перо. Время возникновения
этого импульса, относительно сигналов горизонтальной и вертикальной
синхронизации, позволяет определить позицию светового пера.
Высокий уровень.
Бейсик может определять позицию светового пера двумя способами.
При первом программа непрерывно определяет статус пера. При
втором, когда перо используется, то управление временно передается
процедуре, обеспечиваемой Вашей программой. Для непрерывного
контроля за пером надо использовать оператор PEN как функцию в
форме X = PEN(n), где n - кодовый номер, определяющий какую информацию
Вы хотите получить о пере и его позиции. Возможные значения
n такие:
0 возвращает -1, если перо было выключено со времени послед-
него запроса, 0 - если нет
1 возвращает последнюю координату x (0-319 или 0-639), в ко-
торой перо было включено (оно могло быть впоследствии
передвинуто, если оставалось включенным)
2 возвращает последнюю координату y (0-199), в которой перо
было включено.
3 возвращает -1, если перо включено и 0 - если нет
4 возвращает текущую x координату (0-319 или 0-639) пера
5 возвращает текущую y координату (0-199) пера
6 возвращает позицию - номер строки (1-24), в которой перо
было последний раз активизировано
7 возвращает позицию - номер столбца (1-40 или 1-80), в ко-
торой перо было последний раз активизировано
8 возвращает текущую позицию - номер строки (1-24)
9 возвращает текущую позицию - номер столбца (1-40 или 1-80)
В данном примере определяется включено ли перо, и если это
так, то берется текущее его положение:
100 IF NOT PEN(3) THEN 130 'проверяем включено ли перо
110 X = PEN(4) 'получаем координату точки по оси x
120 Y = PEN(5) 'получаем координату точки по оси y
130 ... 'продолжаем программу
Более гибкие возможности использования светового пера предоставляются
оператором ON PEN GOSUB. Этот оператор указывает номер
строки, в которой начинается процедура, активизируемая при включении
пера. Бейсик достигает этого проверкой состояния пера после
выполнения каждой его инструкции. Процедура может получить позицию
пера и предпринять требуемые действия. Когда процедура заканчивается,
то программа продолжается с того места, где она была
при включении пера.
ON PEN GOSUB не работает до тех пор, пока она не активизирована
оператором PEN ON. PEN OFF отменяет ее работу. Смысл этого
состоит в том, что постоянная проверка статуса пера замедляет
работу программы, поэтому ее надо осуществлять только когда это
необходимо. Если программа начинает выполнять критичекую часть
кода, когда нельзя использовать процедуру ON PEN GOSUB, напишите
PEN STOP. В этом случае будет продолжаться проверка статуса пера,
и если перо будет включено, то этот факт будет запомнен. Однако
пока не будет встречен оператор PEN ON, управление не будет передаваться
процедуре ON PEN GOSUB.
Данный пример вызывает остановку программы, когда нажата кнопка
на световом пере. Точка в позиции светового пера включается
процедурой, обрабатывающей включение светового пера.
100 ON PEN GOSUB 5000 'устанавливаем процедуру для светового
110 PEN ON 'пера и включаем режим отслеживания его
5000 '''процедура обработки светового пера
5010 X = PEN(4) 'получаем координату X
5020 Y = PEN(5) 'получаем координату Y
5030 PSET(X,Y) 'включить эту точку
5040 RETURN '
Средний уровень.
Функция 4 прерывания 10H BIOS сообщает текущую позицию светового
пера. У нее нет входных регистров. При возврате AX содержит
0, если перо не включено и 1 - если получены новые значения для
его позиции. Возвращается два набора координат, позиции точки и
позиции строки и столбца. Позиции символа содержатся в DX, причем
DH содержит строку (0-24), а DL - столбец (0-79). Позиция точки
содержится в CH и BX, причем CH содержит вертикальную координату
(0-199), а BX - горизонтальную (0-319 или 0-639, в зависимости от
режима терминала).
;---читаем и запоминаем положение светового пера
MOV AH,4 ;номер функции
INT 10H ;прерывание BIOS
CMP AH,1 ;новая позиция?
JE NO_READING ;если нет, то уходим
MOV COL,BX ;сохраняем горизонтальную координату
MOV CL,CH ;помещаем вертикальную координату
MOV CH,0 ;в CX
MOV ROW,CX ;сохраняем вертикальную координату
Низкий уровень.
По своей сути световое перо является расширением видеосистемы
и как таковое использует микросхему контроллера CRT 6845. Позиция
светового пера дается одним 2-хбайтным значением, хранящимся в
регистрах 10H (старший байт) и 11H (младший байт) микросхемы. В
[4.1.1] объясняется как читать регистры микросхемы. Посмотрите
пример. Порт с адресом 3DCH устанавливает задвижку светового
пера, а с номером 3DBH - сбрасывает ее.
;---проверка светового пера и чтение его позиции
MOV DX,3DAH ;указываем на регистр статуса
IN AL,DX ;получаем информацию
TEST AL,4 ;проверяем выключатель
JNZ NOT_SET ;на выход
TEST AL,2 ;проверяем триггер
JZ NOT_SET ;на выход
SUB DX,7 ;указываем на регистр адреса 6845
MOV AL,10H ;запрос на старший байт позиции пера
OUT DX,AL ;посылаем запрос
INC DX ;указываем на регистр данных 6845
IN AL,DX ;получаем значение
XCNG AH,AL ;запоминаем его в AH
DEC DX ;возвращаемся к адресному регистру
MOV AL,11H ;теперь хотим получить младший байт
OUT DX,AL ;посылаем запрос
INC DX ;назад к регистру данных
IN AL,DX ;теперь это значение в AX
7.3.3 Получение аналогового ввода через игровой порт.
Игровой порт может поддерживать 2 джойстика или 4 "весла". Для
джойстика он сообщает две координаты и статус двух кнопок; для
весла он сообщает одну координату и статус одной кнопки. Несколько
вспомогательных устройств, таких как графическое табло, также
может быть подключено к игровому порту; их работа может осуществляться
параллельно с работой джойстика. Данный раздел посвящен
чтению координат, а в следующем обсуждается как получить статус
кнопок.
Высокий уровень.
Функция STICK возвращает позиции по осям, указываемую следующими
кодовыми номерами:
0 ось X джойстика A
1 ось Y джойстика A
2 ось X джойстика B
3 ось Y джойстика B
Вам нужно написать, например, X = STICK(0) и в X будет содержаться
значение координаты X для джойстика A. Но эта функция имеет
ловушку, о которой Вам необходимо знать. Только при использовании
кода 0 действительно читаются координаты джойстика, при этом
читаются все 4 значения. Кодовые номера 1-3 просто сообщают показания,
прочитанные кодом 0. Чтобы получить последние 3 координаты
Вам необходимо перед этим использовать функцию X = STICK(0), даже
если Вам не нужно знать значение, возвращаемое кодом 0.
Джойстики отличаются по своим физическим характеристикам,
поэтому необходимо настраивать их, чтобы их предельные положения
совпадали с границами экрана. В следующем примере показано как
это делается. В примере непрерывно рисуется точка, в позиции,
указываемой джойстиком, действие, которое требуется, чтобы диапазон
значений, принимаемых игровым портом, преобразовывался в
диапазон позиций экрана.
100 '''получаем предельные показания джойстика
110 STRIG ON 'разрешаем кнопки
120 V= STRIG(0) 'чистим старые показания
130 PRINT "Briefly push button 1 when stick is farthest to left"
140 XLEFT = STICK(0) 'получаем самое левое значение
150 IF STRIG(0) = 0 THEN 140 'ждем нажатия кнопки
160 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
170 PRINT "Briefly push button 1 when stick is farthest to right"
180 XRIGHT = STICK(0) 'получаем самое правое значение
190 IF STRIG(0) = 0 THEN 180 'ждем нажатия кнопки
200 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
210 PRINT "Briefly push button 1 when stick is farthest to top"
220 V = STICK(0): YTOP = STICK(1) 'самое верхнее значение
230 IF STRIG(0) = 0 THEN 220 'ждем нажатия кнопки
240 STRIG OFF: FOR N = 1 TO 1000: NEXT: STRIG ON
250 PRINT "Briefly push button 1 when stick farthest to bottom"
260 V = STICK(0): YBOTTOM = STICK(1) 'самое нижнее значение
270 IF STRIG(0) = 0 THEN 260 'ждем нажатия кнопки
280 STRIG OFF 'закончили
290 '''получаем множители для установки на размер экрана
300 XRIGHT = XRIGHT - XLEFT 'горизонтальный размер
310 XMULTIPLIER = 320/XRIGHT 'вычисляем число точек на деление
320 YBOTTOM = YBOTTOM - YTOP 'вертикальный размер
330 YMULTIPLIER = 200/B/YBOTTOM 'число точек на деление
340 '''теперь вычисляем координаты в режиме умеренного разрешения
350 X = STICK(0) 'получаем горизонтальную позицию
360 Y = STICK(1) 'получаем вертикальную позицию
370 X = (X - XLEFT)*XMULTIPRIER 'приводим к экрану
380 Y = (Y - YTOP)*YMULTIPRIER '
390 PSET(X,Y) 'выводим точку в нужной позиции
400 GOTO 350 'повторяем
Средний уровень.
Только AT предоставляет поддержку джойстика на уровне операционной
системы. Это функция 84H прерывания 15H, которая возвращает
координаты, причем:
AX = координата X джойстика A
BX = координата Y джойстика A
CX = координата X джойстика B
DX = координата Y джойстика B
При входе поместите в DX 1. Когда в DX содержится 0, то эта функция
возвращает состояние кнопок джойстика [7.3.4]. При возврате
флаг переноса установлен, когда у машины нет игрового порта.
Низкий уровень.
Информация о координатах обоих джойстиков или всех четырех
весел хранится в одном байте, доступ к которому осуществляется
через порт 201H. Вот значение его битов:
Бит Джойстик Весло
3 координата Y джойстика B координата весла D
2 координата X джойстика B координата весла C
1 координата Y джойстика A координата весла B
0 координата X джойстика A координата весла A
Координата может описываться одним битом за счет измерения
временных интервалов. Пошлите в порт байт с произвольным значением.
Это приведет к тому, что младшие 4 бита обнулятся. Затем
постоянно считывайте значение из порта, замеряя интервал времени,
через который интересующий Вас бит станет равным 1. Этот интервал
пропорционален позиции джойстика по интересующей Вас оси. Максимальны
еинтервалы соответствуют нижней позиции по оси Y и правой
позиции по оси X. Независимо от позиции, биты меняются от 0 к 1
очень быстро, по сравнению с механической скоростью перемещения
джойстика или весла. Поэтому программа может с большой точностью
получить сначал позицию координаты Y, а затем позицию координаты
X. Нет необходимости тестировать каждую координату отдельно. В
данном примере определяется координата X джойстика A.
;---получаем координату X джойстика A
MOV DX,201H ;адрес игрового порта
OUT DX,AL ;посылаем в порт произвольное значение
MOV AH,1 ;проверяем бит 1
MOV SI,0 ;инициализируем счетчик
NEXT: IN AL,DX ;читаем значение из порта
TEST AL,AH ;проверяем бит 1
JE FINISHED ;выход, когда бит установлен
INC SI ;иначе, увеличиваем счетчик
LOOP NEXT ;на начало цикла
FINISHED:
7.3.4 Получение цифрового ввода из игрового порта.
Игровой порт поддерживает два джойстика или четыре "весла", а
также ряд графических устройств. При этом может определяться
статус до четырех кнопок устройств. Проверка состояния кнопок
может быть сложным делом, поскольку программа может не иметь
возможности постоянно проверять их, а кнопка может быть нажата и
отпущена, пока программа занята другими делами. Может быть создана
специальная процедура для решения этой проблемы. Статус кнопок
автоматически читается несколько раз в секунду, без специального
запроса на это программы; когда оказывается, что кнопка нажата,
то управдение передается процедуре, которая определяет какая
кнопка нажата и предпринимает нужные действия.
Высокий уровень.
Бейсик использует оператор STRIG для чтения статуса кнопок.
Оператор STRIG достаточно хитрый, чтобы обнаружить нажатие кнопки,
даже если программа в данный момент не занимается статусом
кнопки, т.е. программа может запросить: "Было ли нажатие кнопки,
со времени моего последнего запроса?" Это свойство очень полезно
для видеоигр, поскольку программа может заниматься манипуляциями
с экраном, не заботясь о постоянной проверке статуса кнопок.
Однако это существенно замедляет скорость выполнения программы,
поскольку проверка статуса кнопок осуществляется после выполнения
каждого оператора. По этой причине, STRIG работает только когда
он преднамеренно включен, а он может включаться и выключаться по
ходу программы.
STRIG работает двумя способами. Во-первых, он может работать
как функция, которая непосредственно читает текущие значения
кнопок, в форме X = STRIG(n). Здесь n - кодовый номер:
0 Кнопка A1 нажата со времени последнего вызова
1 Кнопка A1 в данный момент отпущена
2 Кнопка B1 нажата со времени последнего вызова
3 Кнопка B1 в данный момент отпущена
4 Кнопка A2 нажата со времени последнего вызова
5 Кнопка A2 в данный момент отпущена
6 Кнопка B2 нажата со времени последнего вызова
7 Кнопка B2 в данный момент отпущена
Во всех случаях функция возвращает -1, если описание применимо и
0 - если нет.
Второй способ использования STRIG это форма, в которой он
автоматически переключает на процедуру при нажатии кнопки. Надо
написать ON STRIG(n) GOSUB номерстроки. Номер строки дает начальный
номер строки процедуры. Число n относится к кнопке, где 0 =
A1, 2 = B1, 4 = A2 и 6 = B2. Каждая кнопка может обрабатываться
своей процедурой или может быть одна процедура для всех кнопок.
Для активизации функции STRIG включите в программу оператор
STRIG(n) ON. В качестве значения n используются четыре перечисленных
кода. Чтобы отменить его (ускоряя работу программы) напишите
STRIG(n) OFF. Имеется также третья возможность. STRING(n)
STOP приводит к тому, что нажатие кнопки запоминается, но никаких
действий не предпринимается до очередного оператора STRING(n) ON.
Это свойство предохраняет от нежелательных перерывов из-за оператора
ON STRING GOSUB. Тем не менее, при выполнении условия
STRIG(n) STOP программа замедляется.
Следующий пример показывает действие ON STRIG GOSUB. Пример
пункта [7.3.3] содержит строки, показывающие форму X = STRIG.
100 ON STRIG(0) GOSUB 5000 'переход на 5000 при нажатии
. 'кнопки A1
200 STRIG(0) ON 'включаем проверку нажатия кнопки
300 STRIG(0) STOP 'отменяем уход на процедуру
400 STRIG(0) ON 'возобновляем уход на процедуру
500 STRIG(0) OFF 'отменяем проверку нажатия кнопки
5000 '''здесь находится процедура обработки нажатия кнопки A1
5500 RETURN 'возврат к тому месту, откуда попали сюда
Средний уровень.
Только AT предоставляет поддержку джойстика на уровне операционной
системы. Функция 84H прерывания 15H возвращает установку
кнопок в битах 4-7 регистра AL, как показано ниже. При входе DX
должен содержать 0; когда DX содержит 1, то вместо этого возвращаются
координаты джойстика [7.3.3]. При возврате регистр переноса
устанавливается, когда машина не имеет игрового порта.
;---проверяем кнопку #2 джойстика B (бит 7)
MOV AH,84H ;номер функции
MOV DX,0 ;запрос состояния кнопок
INT 15H ;вызов функции
JC NO_JOYSTICK ;если нет джойстика, то на выход
TEST AL,10000000B ;проверяем бит 7
JNZ BUTTON_DOWN ;переход если кнопка нажата
Низкий уровень.
Биты 7-4 порта с адресом 201H содержат статус кнопок, связанных
с игровым портом. Значение битов меняется в зависимости от
того, присоединены ли джойстики или весла:
Бит Джойстик Весло
7 Кнопка #2 джойстика B Кнопка весла D
6 Кнопка #1 джойстика B Кнопка весла C
5 Кнопка #2 джойстика A Кнопка весла B
4 Кнопка #1 джойстика A Кнопка весла A
Программе нужно просто прочитать значение из порта и проверить
установку соответствующих битов:
MOV DX,201H ;адрес порта игрового адаптера
IN AL,DX ;получаем значение из него
TEST AL,0010B ;проверяем бит 1 (кнопка A2 нажата?)
JNZ BUTTON_A2 ;если да, то на процедуру обработки
Программа имеет обычно более важные дела, чем постоянно проверять
игровой порт, однако настолько же быссмысленно время от времени
проверять порт, рассовывая процедуру по разным частям программы.
Чтобы получить эффект отлова нажатия кнопок, аналогичный описанному
в Бейсике, Вам придется создать дополнение к прерыванию
времени суток, как описано в [2.1.7]. Прерывание обычно выполняется
18.2 раза в секунду и каждый раз Вы можете проверять игровой
порт и предпринимать нужные действия при необходимости.
Приложения.
Приложение А. Двоичные и шестнадцатиричные числа и адресация
памяти.
Основной единицей хранения данных в компьютере является бит. В
большинстве микрокомпьютеров восемь битов объединены в байт, при
этом каждый бит байта может быть установлен или "включен" (= 1)
или сброшен или "выключен" (= 0), допуская 256 разных вариантов.
Таким образом, в одном байте можно представить 256 разных символов
(расширенный набор кодов ASCII) или целое число в диапазоне
от 0 до 255. Хотя мы привыкли записывать эти числа в десятичной
форме, они могут записываться также в двоичной или шестнадцатиричной
форме - их значения при этом не изменяются, а программы
могут с одинаковой легкостью читать эти значения как в той, так и
в другой форме. Вместо того, чтобы говорить, что в одном байте
могут храниться числа от 0 до 255, можно сказать, что могут храниться
двоичные числа от 00000000 до 11111111 или шестнадцатиричные
числа от 00 до FF. Поскольку можно перепутать разные формы,
то двоичные и шестнадцатиричные числа отмечаются специальным
образом. В языке ассемблера за двоичными числами следует буква B,
а за шестнадцатиричными числами - буква H, например, 11111111B
или FFH. Бейсик фирмы Microsoft предваряет шестнадцатиричные
числа символами &H, например &FFH; к сожалению, он не распознает
числа в двоичной форме.
Двоичные числа:
Когда содержимое байта представляется в двоичной форме, то
требуется 8 цифр. Каждая цифра соответствует одному биту, которые
нумеруются от 0 до 7. Как и в десятичных числах цифры располагаются
справа налево, от младших к старшим разрядам. В отличии от
десятичных чисел, в которых каждая последующая цифра весит в 10
раз больше своей соседки справа, двоичные цифры имеют только
вдвое больший вес. Таким образом, самая правая цифра считает
единицы, вторая - двойки, третья - четверки и т.д., до значения
128 для восьмой цифры байта. Это означает, что если первая цифра
равна 1, то прибавление к ней 1 приводит к тому, что она станет
0, а 1 будет перенесена во вторую цифру, как для десятичных чисел
9 + 1 = 0 и перенос единицы в следующий разряд. Вот как числа
первого десятка представляются в двоичной форме:
00000000 0
00000001 1
00000010 2
00000011 3
00000100 4
00000101 5
00000110 6
00000111 7
00001000 8
00001001 9
00001010 10
В этой последовательности большинство нулей слева необязательны,
т.е. эту последовательность можно записать и в виде 0, 1, 10,
11, 100, 101 и т.д. Нули включены только для того, чтобы напомнить
Вам, что байт составляется восемью цифрами, соответствующими
битам. В то время как набор нулей и единиц может быть несколько
утомительным, Вы можете легче работать с двоичными числами, если
будете представлять их себе следующим образом:
бит 7 6 5 4 3 2 1 0
значение 128 64 32 16 8 4 2 1
Когда Вы встречаете двоичное число 10000001, то установлены биты
7 и 0. Бит 7 соответствует 128, а бит 0 - 1, поэтому десятичное
значение байта равно 129. Если этот байт представляет символ, то
он соответствует коду ASCII 129, который представляет букву u с
умляутом (в альтернативной кодировке ГОСТа - букву Б). Наоборот,
чтобы определить цепочку битов для буквы A, которая равна ASCII
65, просмотрите вышеприведенную таблицу на значения битов, которые
она содержит: 64 и 1, что соответствует 01000001B.
Зачем связываться с двоичными числами? Одна из причин состоит
в том, что компьютер хранит информацию в статусных байтах памяти
и статусных регистрах микросхем. Отдельные части этой информации
распределены по одному или двум байтам. Это достигается назначением
определенных битов определенным данным. Например, помимо
других вещей, байт статуса может сообщить сколько принтеров и
дисковых накопителей присоединено к Вашей машине. Скажем два
старших байта содержат число принтеров, а два младших - число
дисковых накопителей. Байт статуса расположен в определенной
ячейке памяти и как и любой байт может иметь значения от 0 до
255. Если значение этого байта равно 66 или 01000010 в двоичной
форме, то два старших байта равны 01, а два младших байта - 10.
Первая пара говорит о том, что у нас имеется один принтер, а
вторая - что 2 дисковых накопителя. Группа битов, рассматриваемая
совместно таким образом называется полем. Часто Вашим программам
приходится читать статусные байты или регистры, а иногда Вам
нужно изменить установку битов. Эти операции тривиальны в языке
ассемблера, но не в Бейсике. В приложении Б объясняется как они
производятся в Бейсике.
Шестнадцатиричные числа:
В то время как в двоичных числах каждая последующая цифра
вдвое больше предыдущей, в шестнадцатиричных числах каждая последующая
цифра больше в 16 раз. У десятичных чисел первая позиция
соответствует единицам, вторая - десяткам, третья - сотням. У
двоичных чисел первая позиция соответствует единицам, вторая -
двойкам, третья - четверкам. У шестнадцатиричных чисел первая
позиция соответствует единицам, вторая - 16, третья - 256 и т.д.
Это означает, что когда в позиции единиц расположена цифра 9, то
прибавление единицы не приводит к переносу в следующий разряд,
как это было бы в случае десятичных чисел. Но как записать десятичное
число 10 одной цифрой? Ответ состоит в том, что шестнадцатиричные
числа используют первые 6 букв латинского алфавита в
качестве дополнительных цифровых символов:
шестнадцатиричный символ десятичный эквивалент
A 10
B 11
C 12
D 13
E 14
F 15
Перечисление шестнадцатиричных чисел продолжается так: ... 8, 9,
A, B, C, D, E, F, 10, 11 ... 19, 1A, 1B и т.д.
Полезность шестнадцатиричных чисел опирается на тот факт, что
одна шестнадцатиричная цифра описывает содержимое ровно 1/2 байта.
Например, в числе F6 F соответствует старшим четырем битам
байта, а 6 - младшим четырем битам (четыре бита взятые вместе
называются ниблом, или по-русски "огрызком"). Несложно вычислить
двоичный эквивалент четверки битов. FH = 1111B, а 6H = 0110B
(напоминаем, что H и B - суффиксы, помогающие Вам отличить 11
двоичное от 11 десятичного и 11 шестнадцатиричного). Таким образом
число F6H представляет цепочку битов 11110110. Двухбайтное
число (целое) может равняться 6FF6H. В этом случае цепочка битов
для него имеет вид 0110111111110110. Если число состоит только из
трех цифр, то верхняя половина старшего байта равна нулю, например,
числу F6FH соответствует цепочка битов 0000111101101111.
Шестнадцатиричные числа намного легче читать, чем двоичные.
После небольшой практики оказывается, что работать с ними намного
удобнее, чем с десятичными.
Адреса памяти и портов:
Теперь, когда Вы разобрались с шестнадцатиричными числами,
можно разбираться в системе, которой пользуется процессор при
адресации памяти. Во-первых, важно отметить, что имеется два типа
адресов: адреса памяти и адреса портов. Номера адресов используемые
теми и другими совершенно не связаны; засылка значения в
ячейку памяти с алресом 2000
...Поділитися у соцмережах