Помощничек
Главная | Обратная связь


Археология
Архитектура
Астрономия
Аудит
Биология
Ботаника
Бухгалтерский учёт
Войное дело
Генетика
География
Геология
Дизайн
Искусство
История
Кино
Кулинария
Культура
Литература
Математика
Медицина
Металлургия
Мифология
Музыка
Психология
Религия
Спорт
Строительство
Техника
Транспорт
Туризм
Усадьба
Физика
Фотография
Химия
Экология
Электричество
Электроника
Энергетика

Специальные средства отладчика



 

В операционной системе DOS версии 2.0 и старше можно использовать

DEBUG для ввода команд ассемблера так же, как и команд машинного языка. На

практике можно пользоваться обоими методами.

 

 

Команда A

-----------

Команда отладчика A (Assemble) переводит DEBUG в режим приема команд

ассемблера и перевода их в машинные коды. Установим начальный адрес

следующим образом:

 

A 100 [Return]

 

Отладчик выдаст значение адреса сегмента кодов и смещения в виде

хххх:0100. Теперь можно вводить каждую команду, завершая клавишей Return.

Когда вся программа будет введена, нажмите снова клавишу Return для выхода

из режима ассемблера. Введите следующую программу:

 

MOV AL,25 [Return]

MOV BL,32 [Return]

ADD AL,BL [Return]

RET [Return]

 

по завершению на экране будет следующая информация:

 

хххх:0100 MOV AL,25

хххх:0102 MOV BL,32

хххх:0104 ADD AL,BL

хххх:0106 RET

 

В этот момент отладчик готов к приему следующей команды. При нажатии

Return операция будет прекращена.

Можно видеть, что отладчик определил стартовые адреса каждой команды.

Прежде чем выполнить программу, проверим сгенерированные машинные коды.

 

 

Команда U

-----------

Команда отладчика U (Unassemble) показывает машинные коды для команд

ассемблера. Необходимо сообщить отладчику адреса первой и последней

команды, которые необходимо просмотреть (в данном cлучае 100 и 106).

Введите:

 

U 100,106 [и Return]

 

и на экране появится

 

хххх:0100 B025 MOV AL,25

хххх:0102 B332 MOV BL,32

хххх:0104 00D8 ADD AL,BL

хххх:0106 C3 RET

 

Теперь проведем трассировку выполнения программы, начиная с команды R для

вывода содержимого регистров и первой команды программы. С помощью команд

T выполним последовательно все команды программы.

Теперь вы знаете, как вводить программу в машинном коде или на языке

ассемблера. Обычно используется ввод на языке ассемблера, когда машинный

код неизвестен, а ввод в машинном коде - для изменения программы во время

выполнения. Однако в действительности программа DEBUG предназначена для

отладки программ и в следующих главах основное внимание будет уделено

использованию языка ассемблера.

 

 

Сохранение программы из отладчика

-----------------------------------

Можно использовать DEBUG для сохранения программ на диске в следующих

случаях:

 

1. После загрузки программы в память машины и ее модификации

необходимо сохранить измененный вариант. Для этого следует:

 

- загрузить программу по ее имени: DEBUG n:имя файла

[Return]

- просмотреть программу с помощью команды D и ввести

изменения по команде E,

- записать измененную программу: W [Return]

 

2. Необходимо с помощью DEBUG написать небольшую по объему

программу и сохранить ее на диске. Для этого следует:

 

- вызвать отладчик DEBUG,

- с помощью команд A (assemble) и E (enter) написать

программу,

- присвоить программе имя: N имя файла.COM [Return]. Тип

программы должен быть COM (см. гл.6 для пояснений по

COM-файлам),

- так как только программист знает, где действительно

кончается его программа, указать отладчику длину программы в

байтах. В последнем примере концом программы является команда

 

хххх:0106 C3 RET

 

Эта команда однобайтовая и поэтому размер программы будет равен

106 (конец) минус 100 (начало), т.е. 6.

- запросить регистр CX командой: R CX [Return]

- отладчик выдаст на этот запрос CX 0000 (нулевое значение)

- указать длину программы - 6,

- записать измененную программу: W [Return]

 

В обоих случаях DEBUG выдает сообщение "Writing nnnn bytes." (Запись

nnnn байтов). Если nnnn равно 0, то произошла ошибка при вводе длины

программы, и необходимо повторить запись cнова.

 

 

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

________________________________________________________________

 

Отладчик DOS DEBUG это достаточное мощное средство, полезное для

отладки ассемблерных программ. Однако следует быть осторожным с ее

использованием, особенно для команды E (ввод). Ввод данных в неправильные

адреса памяти или ввод некорректных данных могут привести к

непредсказуемым результатам. На экране в этом случае могут появиться

"странные" символы, клавиатура заблокирована или даже DOS прервет DEBUG и

перезагрузит себя с диска. Какие-либо серьезные повреждения вряд ли

произойдут, но возможны некоторые неожиданности, а также потеря данных,

которые вводились при работе с отладчиком.

Если данные, введенные в сегмент данных или сегмент кодов, оказались

некорректными, следует, вновь используя команду E, исправить их. Однако,

можно не заметить ошибки и начать трассиpовку программы. Но и здесь

возможно еще использовать команду E для изменений. Если необходимо начать

выполнение с первой команды, то следует установить в регистре командного

указателя (IP) значение 0100. Введите команду R (register) и требуемый

регистр в следующем виде:

 

R IP [Return]

 

Отладчик выдаст на экран содержимое регистра IP и перейдет в ожидание

ввода. Здесь следует ввести значение 0100 и нажать для проверки результата

команду R (без IP). 0тладчик выдаст содержимое регистров, флагов и первую

выполняемую команду. Теперь можно, используя команду T, вновь выполнить

трассировку программы.

Если ваша программа выполняет какие-либо подсчеты, то возможно

потребуется очистка некоторых областей памяти и регистров. Но yбедитесь в

сохранении содержимого регистров CS, DS, SP и SS, которые имеют

специфическое назначение.

Прочитайте в руководстве по DOS главу о программе DEBUG. В настоящий

момент рекомендуется: вводный материал и следующие команды oтладчика: дамп

(D), ввод (E), шестнадцатиричный (H), имя (N), выход (Q), регистры (R),

трассировка (T) и запись (W). Можно oзнакомиться также и с другими

командами и проверить как они работают.

 

Машинная адресация

Для доступа к машинной команде процессор определяет ее адрес из

содержимого регистра CS плюс смещение в регистре IP. Например,

предположим, что регистр CS содержит шест.04AF (действительный адрес

04AF0), а регистр IP содержит шест. 0023:

 

CS: 04AF0

IP: 0023

-----

Адрес команды: 04B13

 

Если, например, по адресу 04B13 находится команда:

 

A11200 MOV AX,[0012]

|

Адрес 04B13

 

то в памяти по адресу 04B13 содержится первый байт команды. Процессор

получает доступ к этому байту и по коду команды (A1) oпределяет длину

команды - 3 байта.

Для доступа к данным по смещению [0012] процессор определяет aдрес,

исходя из содержимого регистра DS (как правило) плюс cмещение в операнде

команды. Если DS содержит шест.04B1 (реальный адрес 04B10), то

результирующий адрес данных определяется cледующим образом:

 

DS: 04B10

Смещение: 0012

-----

Адрес данных: 04B22

 

Предположим, что по адресам 04B22 и 04B23 содержатся следующие

данные:

 

Содержимое: 24 01

| |

Адрес: 04B22 04B23

 

Процессор выбирает значение 24 из ячейки по адресу 04B22 и помещает

его в регистр AL, и значение 01 по адресу 04B23 - в регистр AH. Регистр AX

будет содержать в результате 0124. В процессе выборки каждого байта

команды процессор увеличивает значение регистра IP на единицу, так что к

началу выполнения следующей команды в нашем примере IP будет содержать

смещение 0026. Таким обpазом процессор теперь готов для выполнения

следующей команды, которую он получает по адресу из регистра CS (04AF0)

плюс текущее смещение в регистре IP (0026), т.е. 04B16.

 

 

Четная адресация

------------------

Процессор 8086, 80286 и 80386 действуют более эффективно, eсли в

программе обеспечиваются доступ к словам, расположенным по четным адресам.

В предыдущем примере процессор может сделать oдну выборку слова по адресу

4B22 для загрузки его непосредственно в регистр. Но если слово начинается

на нечетном адресе, процессор выполняет двойную выборку. Предположим,

например, что команда должна выполнить выборку слова, начинающегося по

адреcу 04B23 и загрузить его в регистр AX:

 

Содержимое памяти: |хх|24|01|хх|

|

Адрес: 04B23

 

Сначала процессор получает доступ к байтам по адресам 4B22 и 4B23 и

пересылает байт из ячейки 4B23 в регистр AL. Затем он получает доступ к

байтам по адресам 4B24 и 4B25 и пересылает байт из ячейки 4B23 в регистр

AH. В результате регистр AX будет содержать 0124.

Нет необходимости в каких-либо специальных методах программирования

для получения четной или нечетной адресации, не обязательно также знать

является адрес четным или нет. Важно знать, что, во-первых, команды

обращения к памяти меняют слово при загрузке его в регистр так, что

получается правильная последовательность байт и, во-вторых, если программа

имеет частый доступ к памяти, то для повышения эффективности можно

определить данные так, чтобы они начинались по четным адресам.

Например, поскольку начало сегмента должно всегда находиться по

четному адресу, первое поле данных начинается также по четному адресу и

пока следующие поля определены как слова, имеющие четную длину, они все

будут начинаться на четных адресах. В большинстве случаев, однако,

невозможно заметить ускорения работы при четной адресации из-за очень

высокой скорости работы процессоров.

Ассемблер имеет директиву EVEN, которая вызывает выравнивание данных

и команд на четные адреса памяти.

 

 

ПРИМЕР МАШИННЫХ КОДОВ: ОПРЕДЕЛЕНИЕ РАЗМЕРА ПАМЯТИ

________________________________________________________________

 

В первом упражнении в данной главе проводилась проверка размера

памяти (RAM), которую имеет компьютер. BIOS (базовая система ввода/вывода)

в ROM имеет подпрограмму, которая определяет pазмер памяти. Можно

обратиться в BIOS по команде INT, в данном cлучае по прерыванию 12H. В

результате BIOS возвращает в регистр AX размер памяти в килобайтах.

Загрузите в память DEBUG и введите для INT 12H и RET следующие машинные

коды:

 

E CS:100 CD 12 CB

 

Нажмите R (и Return) для отображения содержимого регистров и первой

команды. Регистр IP содержит 0100, при этом высвечивается команда INT 12H.

Теперь нажмите T (и Return) несколько раз и просмотрите выполняемые

команды BIOS (отладчик показывает мнемокоды, хотя в действительности

выполняются машинные коды):

 

STI

PUSH DS

MOV AX,0040

MOV DS,AX

MOV AX,[0013]

POP DS

IRET

 

В этот момент регистр AX содержит размер памяти в шестнадцатиpичном

формате. Теперь введите еще раз команду T для выхода из BIOS и возврата в

вашу программу. На экране появится команда RET для машинного кода CB,

который был введен вами.

 




Поиск по сайту:

©2015-2020 studopedya.ru Все права принадлежат авторам размещенных материалов.