Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
2BC8 Вычесть содержимое AX из CX
2ВС0 Вычесть содержимое АХ из АХ (очистка АХ)
90 Нет операции
СВ Возврат в DOS
Можно заметить, что машинные команды имеют различную длину: один, два или три байта. Машинные команды находятся в памяти непосредственно друг за другом. Выполнение программы начинается с первой команды, и далее последовательно выполняются остальные. Не следует, однако, в данный момент искать большой смысл в приведенном машинном коде. Например, в одном случае команда пересылки (MOV) кодируется как В8, а в другом - 8В.
Можно ввести эту программу непосредственно в память машины и выполнить ее покомандно. В то же время можно просматривать содержимое регистров после выполнения каждой команды. Начнем данное упражнение так же, как делалось предыдущее,- введем команду запуска отладчика DEBUG и нажмем клавишу Return. После загрузки DEBUG на экране высвечивается приглашение к вводу команд в виде дефиса.
Для непосредственного ввода программы на машинном языке введите следующую команду, включая пробелы:
E CS:100 B8 23 01 05 25 00 (нажмите Return).
Команда Е обозначает Enter (ввод). Параметр CS:100 определяет адрес памяти, куда будут вводиться команды, - 10016 (256) байт от начала сегмента кодов (обычный стартовый адрес для машинных кодов в отладчике DEBUG). Команда Е записывает каждую пару шестнадцатиричных цифр в память в виде байта, начиная с адреса CS:100 до адреса CS:105.
Следующая команда Enter:
Е CS:106 8В D8 03 D8 8В CB (Return)
вводит шесть байтов в ячейки, начиная с адреса CS:106 и далее в 107, 108, 109, 10А и 10В. Последняя команда Enter:
Е CS:10C 2В С8 2В С0 90 CB (Return)
вводит шесть байтов, начиная с CS:10C в 10D, 10Е, 10F, 110 и 111. Проверьте правильность ввода значений. Если есть ошибки, то следует повторить команды, которые были введены неправильно.
Теперь осталось самое простое - выполнить эти команды. На рис.1.2 показаны все шаги, включая команды Е. На вашем экране должны быть аналогичные результаты после ввода каждой команды отладчика.
Введите команду R для просмотра содержимого регистров и флагов. В данный момент отладчик покажет содержимое регистров в шестнадцатиричном формате, например,
АХ= 0000, ВХ= 0000,...
В зависимости от версии DOS содержимое регистров на экране может отличаться от показанного на рис.1.2. Содержимое регистра IP (указатель команд) выводится в виде IP = 0100, показывая, что выполняемая команда находится на смещении 100Н байт от начала сегмента кодов. (Вот почему использовалась команда Е CS:100 для установки начала программы.)
Регистр флагов на рис.1.2 показывает следующие значения флагов:
NV UP EI PL NZ NA PO NC
Данные значения соответственно показывают: нет переполнения, правое направление, прерывания запрещены, знак плюс, не ноль, нет внешнего переноса, контроль на четность и нет переноса. В данный момент значение флагов несущественно.
Команда R показывает также по смещению 0100Н первую выполняемую машинную команду. Регистр СS на рис.1.2 содержит значение CS=13C6 (на разных компьютерах оно может различаться), а машинная команда выглядит следующим образом:
13С6:0100 B82301 MOV АХ,0123
• CS = 13С6 указывает, что начало сегмента кода находится по смещению 13C6 или, точнее, 13С60. Значение 13С6:0100 обозначает 10016 байт от начального адреса 13C6 в регистре CS.
• В82301 - машинная команда, введенная по адресу CS: 100.
• MOV АХ,0123 - ассемблерный мнемонический код, соответствующий введенной машинной команде. Это есть результат операции дисассемблирования, которую обеспечивает отладчик для более простого понимания машинных команд. Рассматриваемая в данном случае команда обозначает пересылку непосредственного значения в регистр АХ.
В данный момент команда MOV еще не выполнена. Для ее выполнения нажмите клавишу Т (для трассировки) и клавишу Return. В результате команда MOV будет выполнена и отладчик выдаст на экран содержимое регистров, флаги, а также следующую на очереди команду. Заметим, что регистр АХ теперь содержит значение 0123. Машинная команда пересылки в регистр АХ имеет код B8, за которым следуют непосредственные данные 2301. В ходе выполнения команда B8 пересылает значение 23 в младшую часть регистра АХ, т.е. однобайтовый регистр AL, а значение 01 - в старшую часть регистра АХ,т.е. в регистр АН:
AX: I 01 I 23 I
Содержимое регистра IР:0103 показывает адрес следующей выполняемой команды в сегменте кодов:
13С6:0103 052500 ADD АХ,0025
Для выполнения данной команды снова введите Т. Команда прибавит 25Н к младшей (AL) части регистра АХ и 00 к старшей (АН) части регистра АХ, т.е. прибавит 0025 к регистру АХ. Теперь регистр АХ содержит 0148, а регистр IP 0106 - адрес следующей команды для выполнения.
Введите снова команду Т. Следующая машинная команда пересылает содержимое регистра АХ в регистр ВХ, и после ее выполнения в регистре ВХ будет содержаться значение 0148. Регистр АХ сохраняет прежнее значение 0148, поскольку команда MOV только копирует данные из одного места в другое.
Теперь вводите команду Т для пошагового выполнения каждой оставшейся в программе команды. Следующая команда прибавит содержимое регистра АХ к содержимому регистра ВХ, в последнем получим 0290. Затем программа скопирует содержимое регистра ВХ в СХ, вычтет АХ из СХ и вычтет АХ из него самого. После этой последней команды флаг нуля изменит свое состояние с NZ (не нуль) на ZR (нуль), так как результатом этой команды является нуль (вычитание АХ из самого себя очищает этот регистр в 0).
D>DEBUG
-E CS:100 B8 23 01 05 25 00
-E CS:106 8В D8 03 D8 8В СВ
-E CS:10C 2В С8 2В С0 90 СВ
-R
AX=0000 ВХ=0000 СХ=0000 DХ=0000 SP=FFEE ВР=0000 SI=0000 DI=0000
DS=13С6 ES=13C6 SS=13C6 CS=13C6 IP=0100 NV UP EI PL NZ NA PO NC
13C6:0100 B82301 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 РO 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 NС
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 UPEI PL ZR NA PO NC
13C6:0111 CB retf
-
Рис.1.2. Трассировка машинных команд
Для просмотра программы в машинных кодах в сегменте кодов введите:
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, а затем необходимое число команд Т. После каждой команды нажимайте клавишу Return.
На рис.1.3 показан результат выполнения команды D CS:100. Обратите внимание на машинный код с CS:100 до 111, и вы обнаружите дамп вашей программы; следующие байты могут содержать любые данные.
-D CS:100
13C6:0100 B8 23 01 05 25 00 8В D8-03 D8 8В СВ 2В С8 2В С0 #. .%........ +.+.
13C6:0110 90 CB 8D 46 14 50 51 52-FF 76 28 E8 74 00 8В 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 8В 76 28......6...6...v(
13C6:0140 FF 74 3А 89 46 06 E8 22-CE 8В E5 30 E4 3D 0A 00.t:.F.."...0.=..
13C6:0150 75 32 А1 16 12 2D 01 00-8B 1E 18 12 83 DB 00 53 u2...-.........S
13C6:0160 50 8В 76 28 FF 74 3А A3-16 12 89 1E 18 12 E8 FA P.v(.t:.........
13C6:0170 СD 8В E5 30 E4 3D 0D 00-74 0A 83 06 16 12 01 83...0. =.. t ........
- Q
Рис.1.3. Дамп кодового сегмента
Для завершения работы с программой DEBUG введите Q (Quit - выход).
ПРИМЕР МАШИННЫХ КОДОВ: ОПРЕДЕЛЕНИЕ ДАННЫХ
В предыдущем примере использовалась непосредственная адресация данных, которая означает, что данные описаны непосредственно в первых двух командах (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 (во втором байте).
Ниже показаны команды машинного языка, которые обрабатывают эти данные:
Команда Назначение
А10000 Переслать слово (два байта), начинающееся в DS по
адресу 0000, в регистр АХ.
03060200 Прибавить содержимое слова (двух байт),
начинающегося в DS по адресу 0002, к регистру АХ.
А30400 Переслать содержимое регистра АХ в слово,
начинающееся в DS по адресу 0004.
CB Вернуться в DOS.
Обратите внимание, что здесь имеются две команды MOV с различными машинными кодами: A1 и A3. Фактически машинный код зависит от регистров, на которые имеется ссылка, количества байтов (байт или слово), направления передачи данных (из регистра или в регистр) и от ссылки на непосредственные данные или на память.
Воспользуемся опять отладчиком DEBUG для ввода данной программы и анализа ее выполнения. Когда отладчик выдал свое дефисное приглашение, он готов к приему команд. Сначала введите команды Е (Enter) для сегмента данных:
E DS:00 23 01 25 00 00 00 (Нажмите Return)
Е DS:06 2A 2A 2A (Нажмите Return)
Первая команда записывает три слова (шесть байтов) в начало сегмента данных, DS:00. Заметьте, что каждое слово вводилось в обратной последовательности, так что 0123 есть 2301, а 0025 есть 2500. Когда команда MOV будет обращаться к этим словам, нормальная последовательность будет восстановлена и 2301 станет 0123, а 2500 - 0025.
Вторая команда записывает три звездочки (***) для того, чтобы их можно было увидеть в последствии по команде D (Dump) - другого назначения эти звездочки не имеют.
Введем теперь команды в сегмент кодов, опять начиная с адреса CS:100:
Е CS:100 A1 00 00 03 06 02 00
E CS:107 A3 04 00 CB
Эти команды теперь находятся в ячейках памяти от CS:100 до CS:10A. Команды можно выполнить так же, как это делалось ранее. На рис.1.4 показаны все шаги, включая команды Е. На экране дисплея должны появиться такие же результаты, хотя адреса CS и DS могут различаться. Для просмотра информации в сегменте данных и в сегменте кодов введите команды D (Dump) соответственно:
длясегмента данных: D DS:000 (Return)
для сегмента кодов: D CS:100 (Return)
Сравните содержимое обоих сегментов с тем, что вводилось и с изображенным на рис.1.4. Содержимое памяти от DS:00 до DS:08 и от CS:100 до CS:10A должно быть идентично рис.1.4.
Теперь введите R для просмотра содержимого регистров и флагов и для отображения первой команды. Регистры содержат те же значения, что при старте первого примера. Команда отобразится в виде:
13С6:0100 А10000 MOV AX, [0000]
Так как регистр CS содержит 13С6, то CS: 100 содержит первую команду А10000. Отладчик интерпретирует эту команду как MOV и определяет ссылку к первому адресу [0000] в сегменте данных. Квадратные скобки необходимы для указания ссылки к адресу памяти, а не к непосредственным данным. Если бы квадратных скобок не было, то команда MOV AX,0000 обнулила бы регистр АХ непосредственным значением 0000.
Теперь введем команду Т. Команда MOV АХ,[0000] перешлет содержимое слова, находящегося по нулевому смещению в сегменте данных, в регистр АХ. Содержимое 2301 преобразуется командой в 0123 и помещается в регистр АХ.
Следующую команду ADD можно выполнять введением еще раз команды T. В результате содержимое слова в DS по смещению 0002 прибавится в регистр AX. Теперь регистр АХ будет содержать сумму 0123 и 0025, т. е. 0148.
Следующая команда MOV [0004],AX выполняется опять по вводу T. Эта команда пересылает содержимое регистра АХв слово по смещению 0004. Для просмотра изменений содержимого сегмента данных введите D DS:00. Первые девять байт будут следующими:
Значение в сегменте данных: 23 01 25 00 48 012А 2А 2А
Величина смещения: 00 0102 0304 05 06 0708
Значение 0148, которое было занесено из регистра АХ в сегмент данных по смещению 04 и 05, имеет обратное представление 4801. Заметьте, что эти шестнадцатеричные значения представлены в правой части экрана их символами в ASCII - коде. Например, 23Н генерируется в символ #, а 25H - в символ %. Три байта со значениями 2AH высвечиваются в виде трех звездочек (***). Левая часть дампа показывает действительные машинные коды, которые находятся в памяти. Правая часть дампа только помогает проще локализовать символьные (строчные) данные.
>DEBUG
-Е DS:00 23 01 25 00 00
-Е DS:06 2A 2А 2A
-е CS: l00 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 00 #.% ... ***...,...
13C6:0010 2C 10 ВD 02 2C 10 Bl 0D-01 03 01 00 02 FF FF FF,...,..................
13С6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00.....................d.
1306:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 а.......................
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.!.................
13С6: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=13C6 CS=13C6 IP=0103 NV UP EI PL NZ NA PO NC
13C6:0103 03060200 ADD AX, [0002] DS:0002=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=0107 NV UP EI PL NZ NA PE NC
l3C6:0107 A30400 MOV [0004],AХ DS:0004=9A00
- 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=01078 NV UP EI PL NZ NA PO NC
13C6:010A CB RETF
-D DS:0
13C6:0000 23 01 25 00 48 01 2A 2A-2A F0 F5 02 2C 10 2E 00 #.% ... ***...,...
13C6:0010 2C 10 ВD 02 2C 10 Bl 0D-01 03 01 00 02 FF FF FF,...,..................
13С6:0020 FF FF FF FF FF FF FF FF-FF FF FF FF EF 0F 64 00.....................d.
1306:0030 61 13 14 00 18 00 C7 13-FF FF FF FF 00 00 00 00 а.......................
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.!.................
13С6: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........
-
Рис.1.4. Трассировка машинных команд
Для просмотра содержимого сегмента кодов введите D CS:100. Для завершения работы с программой введите Q.
ОСОБЕННОСТИ МАШИННОЙ АДРЕСАЦИИ
Для доступа к машинной команде процессор определяет ее адрес из содержимого регистра CS плюс смещение в регистре IP. Например, пусть регистр CS содержит 04AFH (действительный адрес 04AF0), а регистр IP содержит 0023Н:
CS: 04AF0
IP: 0023
Адрес команды: 04В13
Если, например, по адресу 04В13 находится команда:
А11200 MOV АХ, [0012]
|
Адрес 04В13
то в памяти по адресу 04В13 содержится первый байт команды. Процессор получает доступ к этому байту и по коду команды (А1) определяет длину команды - три байта.
Для доступа к данным по смещению [0012] процессор определяет адрес, исходя из содержимого регистра DS (как правило) плюс смещение в операнде команды. Если DS содержит 04В1Н (реальный адрес 04В10), то результирующий адрес данных определяется следующим образом:
DS: 04В10
Смещение: 0012
Адрес данных: 04В22
Предположим, что по адресам 04B22 и 04В23 содержатся следующие данные:
Содержимое: 24 01
| |
Адрес: 04В22 04В23
Процессор выбирает значение 24 из ячейки по адресу 04В22 и помещает его в регистр AL, а значение 01 по адресу 04В23 - в регистр АН. Регистр АХ будет содержать в результате 0124. В процессе выборки каждого байта команды процессор увеличивает значение регистра IP на единицу, так что к началу выполнения следующей команды в нашем примере IP будет содержать смещение 0026. Таким образом, процессор теперь готов для выполнения следующей команды, которую он получает по адресу из регистра CS (04AF0) плюс текущее смещение в регистре IP (0026), т. е. 04В16.
Дата публикования: 2014-12-11; Прочитано: 387 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!