1.4. Определите двоичные дополнения для следующих двоичных чисел: а)
00010011, б) 00111100, в) 00111001.
1.5. Определите положительные значения для следующих отрицательных
двоичных чисел: а) 11001000, б) 10111101, в) 10000000.
1.6. Определите шест. представления для а) ASCII символа Q, б) ASCII
числа 7, в) двоичного числа 01011101, г) двоичного 01110111.
1.7. Сложите следующие шест. числа:
а) 23A6 б) 51FD в) 7779 г) EABE
0022 3 887 26C4
---- ---- ---- ----
1.8. Определите шест. представления для следующих десятичных чисел.
Метод преобразования приведен в прил.2. Проверьте также полученные
результаты, преобразовав шест. значения в двоичные и сложив единичные
биты: а) 19, б) 33, в) 89, г) 255, д) 4095, е) 63398.
1.9. Что представляют собой три типа сегментов, каковы их
максимальные размеры и адреса, с которых они начинаются.
1.10. Какие регистры можно использовать для следующих целей: а)
сложение и вычитание, б) подсчет числа циклов, в) умножение и деление, г)
адресация сегментов, д) индикация нулевого результата, е) адресация
выполняемой команды?
1.11. Что представляют собой два основных типа памяти компьютера и
каково их основное назначение?
ГЛАВА 2 Выполнение программ
__________________________________________________________________________
Ц е л ь: Представить машинный язык, ввод команд в память и выполнение
программ.
ВВЕДЕНИЕ
________________________________________________________________
Основой данной главы является использование DOS программы с именем
DEBUG, которая позволяет просматривать память, вводить программы и
осуществлять трассировку их выполнения. В главе показан процесс ввода этих
программ непосредственно в память в область сегмента кодов и объяснен
каждый шаг выполнения программы.
Начальные упражнения научат проверять содержимое конкретных ячеек
памяти. В первом примере программы используются непосредственные данные
определенные в командах загрузки регистров и арифметических командах.
Второй пример программы использует данные, определенные отдельно в
сегменте данных. Трассировка этих команд в процессе выполнения программы
позволяет понять действия компьютера и роль регистров.
Для начала не требуется предварительных знаний языка асcемблера и
даже программирования. Все что необходимо - это IBM PC или совместимый
микрокомпьютер и диск с операционной cистемой DOS.
НАЧАЛО РАБОТЫ
________________________________________________________________
Прежде всего необходимо вставить дискету с DOS в левый дисковод A.
Если питание выключено, то его надо включить; eсли питание уже включено,
нажмите вместе и задержите клавиши Ctrl и Alt и нажмите клавишу Del.
Когда рабочая часть DOS будет загружена в память, на экране появится
запрос для ввода даты и времени, а затем буква текущего дисковода, обычно
A для дискеты и C для винчестера (твердого диска). Изменить текущий
дисковод можно, нажав соответствующую букву, двоеточие и клавишу Return.
Это обычная процедура загрузки, которую следует использовать всякий раз
для упражнений из этой книги.
ПРОСМОТР ЯЧЕЕК ПАМЯТИ
________________________________________________________________
В этом первом упражнении для просмотра содержимого ячеек памяти
используется программа DOS DEBUG. Для запуска этой пограммы введите DEBUG
и нажмите Return, в результате программа DEBUG должна загрузится с диска в
память. После окончания загрузки на экране появится приглашение в виде
дефиса, что свидетельствует о готовности программы DEBUG для приема
команд. Единственная команда, которая имеет oтношение к данному
упражнению, это D - для дампа памяти.
1. Р а з м е р п а м я т и. Сначала проверим размер доступной
для работы памяти. В зависимости от модели компьютера это значение
связано с установкой внутренних переключателей и может быть меньше,
чем реально существует. Данное значение находится в ячейках памяти
шест.413 и 414 и его можно просмотреть из DEBUG по адресу, состоящему
из двух частей:
400 - это адрес сегмента, который записывается как 40
(последний нуль подразумевается) и
13 - это смещение от начала сегмента. Таким образом, можно
ввести следующий запрос:
D 40:13 (и нажать Return)
Первые два байта, появившиеся в результате на экране, содержат размер
памяти в килобайтах и в шестнадцатеричном представлении, причем байты
располагаются в обратной последовательности. Несколько следующих примеров
показывают шест. обратное, шест. нормальное и десятичные представления.
Шест. обратн. Шест. норм. Десятичн. (К)
8000 0080 128
0001 0100 256
8001 0180 384
0002 0200 512
8002 0280 640
2. С е р и й н ы й н о м е р. Серийный номер компьютера "зашит"
в ROM по адресу шест. FE000. Чтобы увидеть его, следует ввести:
D FE00:0 (и нажать Return)
В результате на экране появится семизначный номер компьютера и дата
копирайт.
3. Д а т а ROM BIOS. Дата ROM BIOS в формате mm/dd/yy находится
по шест. адресу FFFF5. Введите
D FFFF:05 (и нажмите Return)
знание этой информации (даты) иногда бывает полезным для определения
модели и возраста компьютера.
Теперь, поскольку вы знаете, как пользоваться командой D (Display),
можно устанавливать адрес любой ячейки памяти для просмотра содержимого.
Можно также пролистывать память, периодически нажимая клавишу D, - DEBUG
выведет на экран адреса, следующие за последней командой.
Для окончания работы и выхода из отладчика в DOS введите команду Q
(Quit). Рассмотрим теперь использование отладчика DEBUG для
непосредственного ввода программ в память и трассировки их выполнения.
ПРИМЕР МАШИННЫХ КОДОВ: НЕПОСРЕДСТВЕННЫЕ ДАННЫЕ
________________________________________________________________
Цель данного примера - проиллюстрировать простую программу на
машинном языке, ее представление в памяти и результаты ее выполнения.
Программа показана в шестнадцатиричном формате:
Команда Назначение
B82301 Переслать шест. значение 0123 в AX.
052500 Прибавить шест. значение 0025 к AX.
8BD8 Переслать содержимое AX в BX.
03D8 Прибавить содержимое AX к BX.
8BCB Переслать содержимое BX в CX.
2BC8 Вычесть содержимое AX из AX (очистка AX).
90 Нет операции.
CB Возврат в DOS.
Можно заметить, что машинные команды имеют различную длину: один, два
или три байта. Машинные команды находятся в памяти непосредственно друг за
другом. Выполнение программы начинается с первой команды и далее
последовательно выполняются остальные. Не следует, однако, в данный момент
искать большой смысл в приведенном машинном коде. Например, в одном случае
MOV - шест.B8, а в другом - шест.8B.
Можно ввести эту программу непосредственно в память машины и выполнить
ее покомандно. В тоже время можно просматривать cодержимое регистров после
выполнения каждой команды. Начнем данное упражнение так же как делалось
предыдущее - ввод команды oтладчика DEBUG и нажатие клавиши Return. После
загрузки DEBUG на экране высвечивается приглашение к вводу команд в виде
дефиса. Для печати данного упражнения включите принтер и нажмите Ctrl и
PrtSc одновременно.
Для непосредственного ввода программы на машинном языке введите
следующую команду, включая пробелы:
E CS:100 B8 23 01 05 25 00 (нажмите Return)
Команда E обозначает Enter (ввод). CS:100 определяет адрес памяти,
куда будут вводиться команды, - шест.100 (256) байт от начала сегмента
кодов. (Обычный стартовый адрес для машинных кодов в отладчике DEBUG).
Команда E записывает каждую пару шестнадцатиpичных цифр в память в виде
байта, начиная с адреса CS:100 до адреса CS:105.
Следующая команда Enter:
E CS:106 8B D8 03 D8 8B CB (Return)
вводит шесть байтов в ячейки, начиная с адреса CS:106 и далее в 107, 108,
109, 10A и 10B. Последняя команда Enter:
E CS:10C 2B C8 2B C0 90 CB (Return)
вводит шесть байтов, начиная с CS:10C в 10D, 10E, 10F, 110 и 111.
Проверьте правильность ввода значений. Если есть ошибки, то следует
повторить команды, которые были введены неправильно.
Теперь осталось самое простое - выполнить эти команды. На pис.2.1
показаны все шаги, включая команды E. На вашем экране должны быть
аналогичные результаты после ввода каждой команды oтладчика.
Введите команду R для просмотра содержимого регистров и флагов. В
данный момент отладчик покажет содержимое регистров в шест. формате,
например,
AX=0000, BX=0000, ...
В зависимости от версии DOS содержимое регистров на экране может
отличаться от показанного на рис.2.1. Содержимое регистра IP (указатель
команд) выводится в виде IP=0100, показывая что выполняемая команда
находится на смещении 100 байт от начала сегмента кодов. (Вот почему
использовалась команда E CS:100 для установки начала программы.)
Регистр флагов на рис.2.1 показывает следующие значения флагов:
NV UP DI PL NZ NA PO NC
Данные значения соответствуют: нет переполнения, правое направление,
прерывания запрещены, знак плюс, не ноль, нет внешнего переноса, контроль
на честность и нет переноса. В данный момент значение флагов не
существенно.
__________________________________________________________________________
D>DEBUG
-E CS:100 B8 23 01 05 25 00
-E CS:106 8B D8 03 D8 8B CB
-E CS:10C 2B C8 2B C0 90 CB
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC
13C6:0100 B8230 MOV AX,0123
-T
AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0103 NV UP EI PL NZ NA PO NC
13C6:0103 052500 ADD AX,0025
-T
AX=0148 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0106 NV UP EI PL NZ NA PE NC
13C6:0106 8BD8 MOV BX,AX
-T
AX=0148 BX=0148 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0108 NV UP EI PL NZ NA PO NC
13C6:0108 03D8 ADD BX,AX
-T
AX=0148 BX=0290 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010A NV UP EI PL NZ AC PO NC
13C6:010A 8BCB MOV CX,BX
-T
AX=0148 BX=0290 CX=0290 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=010C NV UP EI PL NZ AC PO NC
13C6:010C 2BC8 SUB CX,AX
-T
AX=0148 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ AC PO NC
13C6:010E 2BC0 SUB AX,AX
-T
AX=0000 BX=0290 CX=0148 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS=13C6 CS=13C6 IP=0110 NV UP EI PL ZR NA PO NC