Выполнение инструкций программы



Теперь можно выполнить введенные инструкции по очереди. Можно также просматривать содержимое регистров после выполнения каждой инструкции с помощью команд R (registers - регистры) и Т (trace - отследить).

Для просмотра начального состояния регистров и флагов введите команду R и нажмите <Enter>. DEBUG показывает содержимое регистров в шестнадцатеричной форме в виде

АХ=0000 ВХ=0000 ...

DEBUG проинициализировал DS, CS, SS и ES одним и тем же адресом, xxxx[0]. IP должен показывать 0100, указывая, что выполнение инструкций начинается со смещения 100Н относительно начала сегмента кода.

Регистр флагов показывает следующие значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:

NV UP El PL NZ NA PO NC

Эти значения соответствуют слева направо: отсутствию переполнения, направлению вверх (или вправо), разрешению прерываний, положительному знаку, ненулевому значению, отсутствию дополнительного переноса, нечетному слову, и отсутствию переноса. В данный момент эти значения не важны.

Сразу после регистров командой R показана первая, подлежащая выполнению инструкция:

хххх:0100 В82301  MOV АХ,0123

хххх означает начало сегмента кода по адресу хххх[0]Н. Значение хххх:0100 означает смещение 100Н от начала сегмента кода, начинающегося по адресу хххх[0]Н.

В82301 – машинный код, введенный по адресу CS:100.

MOV АХ,0123 – символьная инструкция на языке Ассемблера, определенная DEBUG из машинного кода. Эта инструкция перемещает (копирует) непосредственное значение 0123Н в регистр АХ. DEBUG дизассемблировал машинный код для лучшего его понимания.

Для выполнения инструкции MOV введите команду Т и нажмите <Enter>. Машинный код команды – В8 (поместить в АХ), операнд – 2301. Операция помещает 23 в младшую половину регистра (AL) и 01 – в старшую (АН).

DEBUG выводит результаты выполнения – эффект, оказанный операцией на содержимое регистров. Регистр IР содержит теперь 0103Н (0100Н плюс 3 байта – длина выполненной инструкции). Это значение указывает на адрес, по которому расположена следующая подлежащая выполнению инструкция, то есть:

хххх:0103 052500  ADD AX,0025

Для выполнения этой инструкции вновь введите Т. Инструкция добавит 25Н к младшему байту (AL) регистра АХ и 00Н – к старшему (АН), то есть добавит 0025Н к содержимому АХ. Теперь АХ содержит 0148Н, a IP – 0106Н, указывая на следующую инструкцию, которую необходимо выполнить:

xxxx:0106 8BD8  MOV AX,BX

Вновь введите команду Т. Инструкция MOV заносит содержимое регистра АХ в регистр ВХ. После выполнения инструкции ВХ содержит 0148Н. АХ все еще хранит 0148Н, поскольку инструкция MOV копирует данные, не удаляя их из источника.

Теперь последовательно вводите команды Т для выполнения оставшихся инструкций. Инструкция ADD суммирует содержимое регистров АХ и ВХ, записывая значение 0290Н в регистр ВХ. Затем программа копирует содержимое ВХ в СХ, вычитает АХ из СХ и вычитает АХ из самого себя. Последняя инструкция очищает АХ, устанавливая его в 0, и устанавливает флаг ZF из NZ (nonzero – не нуль) в ZR (zero – нуль), отображая результат операции.

Инструкция JMP устанавливает IP в 100Н, и обработка возвращается обратно к началу программы. Эта инструкция введена из соображений предосторожности, поскольку за последней введенной инструкцией следует "мусор", который при попытке выполнения мог бы вызвать останов процессора или другие нежелательные результаты.

Регистры DS, ES, SS и CS содержат один и тот же адрес сегмента. Это потому, что DEBUG рассматривает весь введенный код как программу .СОМ, хранящую данные, стек и код в одном сегменте, хотя вы и храните их по отдельности внутри сегмента. При написании программы .ЕХЕ стек, данные и код хранятся в отдельных сегментах с разными адресами.

Для повторного выполнения программы введите еще раз команду Т, DEBUG выполнит инструкцию JMP и перейдет к началу введенной программы.

Просмотр содержимого памяти

Для просмотра программы на машинном языке в сегменте кода запросите вывод информации командой D CS:100. Результаты выполнения этой команды представляются строками с 16 байтами (32 шестнадцатеричными разрядами) в каждой строке. Справа – ASCII представление (если соответствующий символ можно вывести) каждого байта. В случае машинного кода ASCII представление бессмысленно и может игнорироваться.

Первая строка начинается со смещения 100Н в сегменте кода и содержит байты с адресами от CS:100H до CS:10FH. Вторая строка выводит байты с адресами от CS:110H до CS:11FH. Хотя введенная программа заканчивается байтом с адресом CS:111H, DEBUG автоматически выводит восемь строк – от CS:100H до CS:170H. В этом примере все данные, следующие за CS:111H – "мусор".

Введите Q для завершения работы с DEBUG или начните выполнение следующего упражнения.


Дата добавления: 2018-04-04; просмотров: 482; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!