Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

ВСВ Переслать содержимое ВХ в СХ



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 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.022 с)...