Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Финогенов-основы_языка_ассемблера.doc
Скачиваний:
45
Добавлен:
17.09.2019
Размер:
3.35 Mб
Скачать

Глава 2

Основы программирования

47

В процессе отладки программы на экран приходится выводить много дополнительных окон; они перекрываются и часто скрывают друг друга. Чтобы увидеть их все одновременно, размер окон приходится уменьшать, а сами окна перемещать по экрану. Режим изменения размеров и положе­ния окна включается командой <Ctrl>+<F5>, после чего клавиши со стрел­ками перемешают окно по экрану, а те же клавиши при нажатой клавише <Shift> позволяют изменять его размер. Выход из режима настройки окна осуществляется нажатием клавиши <Enter>.

Начальное окно отладчика даст слишком мало информации для от­ладки программы. В нем можно выполнять программу по частям до место­положения курсора (клавиша <F4>) и команда за командой (клавиша <F8>); можно также с помощью окна Watches наблюдать изменения за­данных полей данных. Однако для отладки программы на уровне языка ассемблера необходимо контролировать все регистры процессора, вклю­чая регистр флагов, а также, во многих случаях, поля данных вне про­граммы (например, векторы прерываний или системные таблицы). Гораз­до более информативным является «окно процессора», которое вызыва­ется с помощью пункта View>CPU верхнего меню или командой <AK>+<V>+<C> (рис. 2.1).

Ё File Ш Module: ; Опишем се assume codes ^ begin:

*

: Выведен н

*

r U leu Run Breakpoints Data Options Uindou

Help ~ — —Z^l]

R

11

EftDV

13=n

сМЭ z=0 s=0 o=0 p=0 a=0 i=l

ttpRbegin a cs:OOQGKB8071Z *begin: now AX, data :Hact cs:8003 8ED8 мои DS.ftX :ма сегнемт 1 cs:Q005 B409 мои ЙН.ОЭЬ ; Функция DOi cs:0007 BftOOOO мои OX, offset nsg :Ащ>| cs:OOOA CDZ1 int Zlh : Вызов DOS | cs:00QC B8Q04C мои AX,4COOh ; Функция 1 cs:OOOF CB21 int Zlh ; Визой DOS I > cs:0011 0000 add [Ьх+sll.al I cs:0013 0000 add Ebx+sil.&l 1 cs:001S 0000 add Ebx*sU,al i cs:0017 0000 add Cbx*siJ,al | cs:OQ19 0000 add Ebx+si],al -»

ds:OOQO CD 20 7D 9D 00 9ft FO FE - >3 ЪБ1

ax 0000 bx 0000 ex 0000 dx 0000 si 0000 di 0000 bp 0000 sp 0100 ds 11F5

Оию исяоакогэ текста

Т

ss 1209 cs 1205

Окно [тагов

ip 0000

Окно регистров

Окно дал па памяти

_. ds:0008 ID FO 3Z OB B9 OF 6B 07 *E2fifl*R. ds:0010 H OD 28 08 14 OD 9Z OB WCQflTTff ds:0018 01 01 01 00 02 06 FF FF 933 B»

ss:G10Z 04 ss: 01001-52

1

03 FB

Fl-Help FZ-Bkpt F3-Hod F4-Here F5-2oon F6-Hext F?-Trace F8-Step F9-Run FlG-dem

Рис. 2.4. Окно процессора с внутренними окнами.

Окно процессора состоит, в свою очередь, из 5 внутренних окон для наблюдения текста программы на языке ассемблера и в машинных кодах, регистров процессора, флагов, стека и содержимого памяти. С помощью этих окон можно полностью контролировать ход выполнения отлаживае-

мой программы. Для того чтобы можно было работать с конкретным ок­ном, например, прокручивать его содержимое, надо сделать его актив­ным, щелкнув по нему мышью. Перейти из окна в окно можно также с помощью клавиатуры, нажимая клавишу Tab. Посмотрим, какие сведе­ния можно изшгечь из содержимого окна процессора.

Содержимое сегментных регистров DS и ES одинаково и составляет llF5h. Эта значит, что программа загружена в память, начиная с физи­ческого адреса 11F50, т.е. приблизительно с 70-го килобайта. Чем заняты первые 70 Кбайт памяти' Обычно компьютер конфигурируется так, что в обычной памяти размещается только малая часть DOS (около 16 Кбайт), драйверы обслуживания расширенной памяти и резидентная часть COMMAND.COM. Основная часть DOS, остальные драйверы и необхо­димые резидентные программы (например, русификатор) переносятся в расширенную память. В этом случае системные области в начале памя­ти занимают всего 20 — 25 Кбайт. Тем не менее наша программа начина­ется не с 25-го, а с 70-го килобайта. Произошло это из-за того, что программа запущена под управлением отладчика, который сначала заг­ружается в память сам, и лишь затем загружает отлаживаемую програм­му. Но отсюда следует, что если бы мы запустили программу без отлад­чика, она попшга бы на другое место в памяти, гораздо ближе к ее нача­лу. В большинстве случаев это обстоятельство не имеет особого значения, так как любая программа должна одинаково успешно выполняться в любом месте памяти, однако необходимо отдавать себе отчет, что отлад­чик изменяет операционную среду программы (в частности, переносит ее на другое место в памяти). Строго говоря, программа под управлени­ем отладчика выполняется не совсем так, как она выполнялась бы не­посредственно в DOS.

Еще один пример «самодеятельности» отладчика можно увидеть в том же окне регистров процессора. Содержимое всех регистров общего назна­чения (АХ, BX, CX, DX, SI, DI и ВР) равно 0. Отсюда можно сделать вывод, что DOS, загружая программу в память, очищает регистры про­цессора. Однако на самом деле это совсем не так! Регистры очищает не DOS, а отладчик. При обычном запуске программы исходное содержимое регистров практически непредсказуемо, и ни в косм случае нельзя рас­считывать, что в них будут нули. Иногда можно столкнуться и с более тонким влиянием отладчика на ход выполнения программы, вплоть до того, что некоторые виды программ, например, управляющие подклю­ченной к компьютеру аппаратурой, в отладчике будут выполняться про­сто неверно.

Итак, после загрузки программы в память содержимое регистров DS и ES оказалось одинаковым. Это вполне естественно, если вспомнить, что перед выполнением оба регистра указывают на префикс программы (см. рис. 1.9). Вслед за префиксом располагается сегмент команд и поскольку префикс всегда занимает точно lOOli байт (т.е. 10h параграфов по 16 байт), то содержимое CS в нашем случае должно быть равно llF5h + 10h = 1205U. Так оно и есть (см. рис. 2.4).