Жанр: Учеба
Ассемблер и программирование для IBM PC
... Начальный адрес Память
Дес. Шест. -----------------------------¬
0K 00000 ¦ RAM 256K основная ¦
¦ оперативная память ¦
+----------------------------+
256K 40000 ¦ RAM 384K расширение опера- ¦
¦ тивной памяти в канале I/O ¦
+----------------------------+
640K A0000 ¦ RAM 128K графический/ ¦
¦ экранный видеобуфер ¦
+----------------------------+
768K C0000 ¦ ROM 192K дополнительная ¦
¦ постоянная память ¦
+----------------------------+
960K F0000 ¦ ROM 64K основная системная ¦
¦ постоянная память ¦
L-----------------------------
__________________________________________________________________________
Рис.1.4. Карта физической памяти.
Все дальнейшие упоминания RAM используют общий термин - память.
А д р е с а ц и я. Все ячейки памяти пронумерованы последовательно от
00 - минимального адреса памяти. Процессор обеспечивает доступ к байтам
или словам в памяти. Рассмотрим десятичное число 1025. Для записи в память
шест. представления этого числа - 0401 требуется два байта или одно слово.
Оно состоит из старшей части - 04 и младшей части - 01. Система хранит в
памяти байты слова в обратной последовательности: младшая часть по
меньшему адресу, а старшая - по большему адресу. Предположим, что
процессор записал шест.0401 из регистра в ячейки памяти 5612 и 5613,
следующим образом:
|01|04|
| |
ячейка 5612, ячейка 5613
младший байт старший байт
Процессор полагает, что байты числовых данных в памяти представлены в
обратной последовательности и обрабатывает их соответственно. Несмотря на
то, что это свойство полностью автоматизировано, следует всегда помнить об
этом факте при программировании и отладке ассемблерных программ.
ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ
________________________________________________________________
- Единицей памяти является байт, состоящий из восьми информационных и
одного контрольного битов. Два смежных байта образуют слово.
- Сердцем компьютера является микропроцессор, который имеет доступ к
байтам или словам в памяти.
- ASCII код есть формат представлением символьных данных.
- Компьютер способен различать биты, имеющие разное значение: 0 или
1, и выполнять арифметические операции только в двоичном формате.
- Значение двоичного числа определено расположением единичных битов.
Так, двоичное 1111 равно 2**3 + 2**2 + 2**1 + 2**0, или 15.
- Отрицательные числа представляются двоичным дополнением: обратные
значения бит положительного представления числа +1.
- Сокращенная запись групп из четыре битов представляет собой
шестнадцатиричный формат. Шест. цифры 0-9 и A-F представляют двоичные
числа от 0000 до 1111.
- Программы состоят из сегментов: сегмент стека для хранения адресов
возврата, сегмент данных для определения данных и рабочих областей и
сегмент кода для выполняемых команд. Все адреса в программе представлены
как относительные смещения от начала сегмента.
- Регистры управляют выполнением команд, адресацией, арифметическими
операциями и состоянием выполнения.
- ROM (ПЗУ) и RAM (ОЗУ) представляют собой два типа внутренней
памяти.
- Процессор хранит двухбайтовые числовые данные (слова) в памяти в
обратной последовательности.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
________________________________________________________________
1.1. Напишите битовые представления ASCII кодов для следующих
однобитовых символов. (Используйте приложение 1 в качестве справочника):
а) P, б) p, в) #, г) 5.
1.2. Напишите битовые представления для следующих чисел: а) 5, б) 13,
в) 21, г) 27.
1.3. Сложите следующие двоичные:
а) 00010101 б) 00111110 в) 00011111
00001101 00101001 00000001
-------- -------- --------
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, которая позволяет просматривать память, вводить программы и
осуществлять трассировку их выполнения. В главе показан процесс ввода этих
программ непосредственно в память в область сегмента кодов и объяснен
каждый шаг выполнения программы.
Начальные упражнения научат проверять содержимое конкретных ячеек
памяти. В первом примере программы используются непосредственные данные
определенные в командах загрузки регистров и арифметических командах.
Второй пример программы использует данные, определенные отдельно в
сегменте данных. Трассировка этих команд в процессе выполнения программы
позволяет понять действия компьютера и роль регистров.
Для начала не требуется предварительных знаний языка ассемблера и
даже программирования. Все что необходимо - это IBM PC или совместимый
микрокомпьютер и диск с операционной системой DOS.
НАЧАЛО РАБОТЫ
________________________________________________________________
Прежде всего необходимо вставить дискету с DOS в левый дисковод A.
Если питание выключено, то его надо включить; если питание уже включено,
нажмите вместе и задержите клавиши Ctrl и Alt и нажмите клавишу Del.
Когда рабочая часть DOS будет загружена в память, на экране появится
запрос для ввода даты и времени, а затем буква текущего дисковода, обычно
A для дискеты и C для винчестера (твердого диска). Изменить текущий
дисковод можно, нажав соответствующую букву, двоеточие и клавишу Return.
Это обычная процедура загрузки, которую следует использовать всякий раз
для упражнений из этой книги.
ПРОСМОТР ЯЧЕЕК ПАМЯТИ
________________________________________________________________
В этом первом упражнении для просмотра содержимого ячеек памяти
используется программа DOS DEBUG. Для запуска этой пограммы введите DEBUG
и нажмите Return, в результате программа DEBUG должна загрузится с диска в
память. После окончания загрузки на экране появится приглашение в виде
дефиса, что свидетельствует о готовности программы DEBUG для приема
команд. Единственная команда, которая имеет отношение к данному
упражнению, это 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.
Можно ввести эту программу непосредственно в память машины и выполнить
ее покомандно. В тоже время можно просматривать содержимое регистров после
выполнения каждой команды. Начнем данное упражнение так же как делалось
предыдущее - ввод команды отладчика DEBUG и нажатие клавиши Return. После
загрузки DEBUG на экране высвечивается приглашение к вводу команд в виде
дефиса. Для печати данного упражнения включите принтер и нажмите Ctrl и
PrtSc одновременно.
Для непосредственного ввода программы на машинном языке введите
следующую команду, включая пробелы:
E CS:100 B8 23 01 05 25 00 (нажмите Return)
Команда E обозначает Enter (ввод). CS:100 определяет адрес памяти,
куда будут вводиться команды, - шест.100 (256) байт от начала сегмента
кодов. (Обычный стартовый адрес для машинных кодов в отладчике DEBUG).
Команда E записывает каждую пару шестнадцатиричных цифр в память в виде
байта, начиная с адреса 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.
Проверьте правильность ввода значений. Если есть ошибки, то следует
повторить команды, которые были введены неправильно.
Теперь осталось самое простое - выполнить эти команды. На рис.2.1
показаны все шаги, включая команды E. На вашем экране должны быть
аналогичные результаты после ввода каждой команды отладчика.
Введите команду 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
13C6:0110 90 NOP
-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=0111 NV UP EI PL ZR NA PO NC
13C6:0111 CB RETF
-
__________________________________________________________________________
Рис.2.1. Трассировка машинных команд.
Команда R показывает также по смешению 0100 первую выполняемую
машинную команду. Регистр CS на рис.2.1 содержит значение CS=13C6 (на
разных компьютерах оно может различаться), а машинная команда выглядит
следующим образом:
13C6:0100 B82301 MOV AX,0123
CS=13C6 обозначает, что начало сегментов кода находится по
смещению 13C6 или точнее 13C60. Значение 13C6:0100 обозначает 100
(шест.) байтов от начального адреса 13C6 в регистре CS.
B82301 - машинная команда, введенная по адресу CS:100.
MOV AX,0123 - ассемблерный мнемонический код, соответствующий
введенной машинной команде. Это есть результат операции
дисассемблирования, которую обеспечивает отладчик для более простого
понимания машинных команд. В последующих главах мы будем кодировать
программы исключительно в командах ассемблера. Рассматриваемая в
данном случае команда обозначает пересылку непосредственного значения
в регистр AX.
В данный момент команда MOV еще не выполнена. Для ее выполнения
нажмите клавишу T (для трассировки) и клавишу Return. В результате команда
MOV будет выполнена и отладчик выдаст на экран содержимое регистров,
флаги, а также следующую на очереди команду. Заметим, что регистр AX
теперь содержит 0123. Машинная команда пересылки в регистр AX имеет код B8
и за этим кодом следует непосредственные данные 2301. В ходе выполнения
команда B8 пересылает значение 23 в младшую часть регистра AX, т.е.
однобайтовый регистр AL, а значение 01 - в старшую часть регистра AX, т.е.
в регистр AH:
AX: | 01 | 23 |
Содержимое регистра IP:0103 показывает адрес следующей выполняемой
команды в сегменте кодов:
13C6:0103 052500 ADD AX,0025
Для выполнения данной команды снова введите T. Команда прибавит 25 к
младшей (AL) части регистра AX и 00 к старшей (AH) части регистра AX, т.е.
прибавит 0025 к регистру AX. Теперь регистр AX содержит 0148, а регистр IP
0106 - адрес следующей команды для выполнения.
Введите снова команду T. Следующая машинная команда пересылает
содержимое регистра AX в регистр BX и после ее выполнения в регистре BX
будет содержаться значение 0148. Регистр AX сохраняет прежнее значение
0148, поскольку команда MOV только копирует данные из одного места в
другое.
Теперь вводите команду T для пошагового выполнения каждой оставшейся
в программе команды. Следующая команда прибавит содержимое регистра AX к
содержимому регистра BX, в последнем получим 0290. Затем программа
скопирует содержимое регистра BX в CX, вычтет AX из CX, и вычтет AX из
него самого. После этой последней команды, флаг нуля изменит свое
состояние c NZ (не нуль) на ZR (нуль), так как результатом этой команды
является нуль (вычитание AX из самого себя очищает этот регистр в 0).
Можно ввести T для выполнения последних команд NOP и RET, но это мы
сделаем позже. Для просмотра программы в машинных кодах в сегменте кодов
введите D для дампа:
D CS:100
В результате отладчик выдаст на каждую строку экрана по 16 байт
данных в шест. представлении (32 шест. цифры) и в символьном представлении
в коде ASCII (один символ на каждую пару шест. цифр). Представление
машинного кода в символах ASCII не имеет смысла и может быть игнорировано.
В следующих разделах будет рассмотрен символьный дамп более подробно.
Первая строка дампа начинается с 00 и представляет содержимое ячеек
от CS:100 до CS:10F. Вторая строка представляет содержимое ячеек от CS:110
до CS:11F. Несмотря на то, что ваша программа заканчивается по адресу
CS:111, команда Dump автоматически выдаст на восьми строках экрана дамп с
адреса CS:100 до адреса CS:170.
При необходимости повторить выполнение этих команд сбросьте
содержимое регистра IP и повторите трассировку снова. Введите R IP,
введите 100, а затем необходимое число команд T. После каждой команды
нажимайте клавишу Return.
На рис.2.2 показан результат выполнения команды D CS:100. Обратите
внимание на машинный код с CS:100 до 111 и вы обнаружите дамп вашей
программы; следующие байты могут содержать любые данные.
__________________________________________________________________________
-D CS:100
13C6:0100 B8 23 01 05 25 00 8B D8-03 D8 8B CB 2B C8 2B C0 .#..%.......+.+.
13C6:0110 90 CB 8D 46 14 50 51 52-FF 76 28 E8 74 00 8B E5 ...F.PQR.v(.t...
13C6:0120 B8 01 00 50 FF 76 32 FF-76 30 FF 76 2E FF 76 28 ...P.v2.v0.v..v(
13C6:0130 E8 88 15 8B E5 BF 36 18-12 FF 36 16 12 8B 76 28 ......6...6...v(
13C6:0140 FF 74 3A 89 46 06 E8 22-CE 8B E5 30 E4 3D 0A 00 .t:.F.."...0.=..
13C6:0150 75 32 A1 16 12 2D 01 00-8B 1E 18 12 83 DB 00 53 u2...-.........S
13C6:0160 50 8B 76 28 FF 74 3A A3-16 12 89 1E 18 12 E8 FA P.v(.t:.........
13C6:0170 CD 8B E5 30 E4 3D 0D 00-74 0A 83 06 16 12 01 83 ...0.=..t.......
-Q
__________________________________________________________________________
Рис.2.2. Дамп кодового сегмента.
Для завершения работы с программой DEBUG введите Q (Quit - выход). В
результате произойдет возврат в DOS и на экране появится приглашение A"
или C". Если печатался протокол работы с отладчиком, то для прекращения
печати снова нажмите Ctrl/PrtSc.
ПРИМЕР МАШИННЫХ КОДОВ: ОПРЕДЕЛЕНИЕ ДАННЫХ
________________________________________________________________
В предыдущем примере использовались непосредственные данные,
описанные непосредственно в первых двух командах (MOV и ADD). Теперь
рассмотрим аналогичный пример, в котором значения 0123 и 0025 определены в
двух полях сигмента данных. Данный пример позволяет понять как компьютер
обеспечивает доступ к данным посредством регистра DS и адресного смещения.
В настоящем примере определены области данных, содержащие
соответственно следующие значения:
Адрес в DS Шест. знач. Номера байтов
0000 2301 0 и 1
0002 2500 2 и 3
0004 0000 4 и 5
0006 2A2A2A 6, 7 и 8
Вспомним, что шест. символ занимает половину байта, таким образом,
например, 23 находится в байте 0 (в первом байте) сегмента данных, 01 - в
байте 1 (т.е. во втором байте).
Ниже показаны команды машинного языка, которые обрабатывают эти
данные:
Команда Назначение
A10000 Переслать слово (два байта), начинающееся в DS по адресу
0000, в регистр AX.
03060200 Прибавить содержимое слова (двух байт), начинающегося в DS
по адресу 0002, к регистру AX.
A30400 Переслать содержимое регистра AX в слово, начинающееся в DS
по адресу 0004.
CB Вернуться в DOS.
Обратите внимание, что здесь имеются две команды MOV с различными
машинными кодами: A1 и A3. Фактически машинный код зависит от регистров,
на которые имеется ссылка, количества байтов (байт или слово), направления
передачи данных (из регистра или в регистр) и от ссылки на
непосредственные данные или на память.
Воспользуемся опять отладчиком DEBUG для ввода данной программы и
анализа ее выполнения. Когда отладчик выдал свое дефисное приглашение, он
готов к приему команд.
Сначала введите команды E (Enter) для сегмента данных:
E DS:00 23 01 25 00 00 00 (Нажмите Return)
E DS:06 2A 2A 2A (Нажмите Return)
Первая команда записывает три слова (шесть байтов) в начало сегмента
данных, DS:00. Заметьте, что каждое слово вводилось в обратной
последовательности, так что 0123 есть 2301, a 0025 есть 2500. Когда
команда MOV будет обращаться к этим словам, нормальная последовательность
будет восстановлена и 2301 станет 0123, а 2500 - 0025.
Вторая команда записывает три звездочки (***) для того, чтобы их
можно было видеть впоследствии по команде D (Dump) - другого назначения
эти звездочки не имеют.
Введем теперь команды в сегмент кодов, опять начиная с адреса CS:100:
E CS:100 A1 00 00 03 06 02 00
E CS:107 A3 04 00 CB
Теперь команды находятся в ячейках памяти от CS:100 до CS:10A. Эти
команды можно выполнить как это делалось ранее. На рис.2.3 показаны все
шаги, включая команды E. На экране дисплея должны появиться такие же
результаты, хотя адреса CS и DS могут различаться. Для пересмотра
информации в сегменте данных и в сегменте кодов введите команды D (Dump)
соответственно:
для сегмента данных: D DS:000 (Return)
для сегмента кодов: D CS:100 (Return)
Сравните содержимое обоих сегментов с тем, что вводилось и с
изображенным на рис.2.3. Содержимое памяти от DS:00 до DS:08 и от CS:100
до CS:10A должно быть идентично рис.2.3.
__________________________________________________________________________
D"DEBUG
-E DS:23 01 25 00 00
-E DS:2A 2A 2A
-E CS:100 A1 00 00 03 06 02 00
-E CS:107 A3 04 00 CB
-D DS:0
13C6:0000 23 01 25 00 00 9A 2A 2A-2A F0 F5 02 2C 10 2E 03 #.%...***...,...
13C6:0010 2C 10 BD 02 2C 10 B1 0D-01 03 01 00 02 FF FF FF ,...,...........
13C6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00 ..............d.
13C6:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 a...............
13C6:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13C6:0050 CD 21 CB 00 00 00 00 00-00 00 00 00 00 20 20 20 .!...........
13C6:0060 20 20 20 20 20 20 20 20 00 00 00 00 00 20 20 20 .....
13C6:0070 20 20 20 20 20 20 20 20-00 00 00 00 00 00 00 00 ........
-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 A10000 MOV AX,[0000] DS:0000=0123
-T
AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=13C6 ES=13C6 SS
...Поділитися у соцмережах