Ассемблирование и отладка программы, страница 3

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

В области адреса не выполняется автоматическое смещение курсора после ввода символа, поэтому нужно воспользоваться клавишами сдвига вправо или влево. В области данных автоматическое смещение курсора выполняется.

Когда курсор находится в области данных, в соответствующей его положению строке области адреса в инверсном цвете указывается адрес ячейки, на которую показывает курсор. На рис. 4 показано редактирование сегмента данных «DSEG». Курсор находится в позиции стершей тетрады ячейки с адресом 22h. В ячейки 20h и 21h записаны (но не введены) значения 12h и 34h, выделенные инверсным цветом.


На рис. 5 показано редактирование сегмента программного кода «CSEG». Курсор находится в позиции старшей тетрады ячейки с адресом 000Ch. В ячейки 000Ah и 000Bh записаны (но не введены) значения 12h и 34h, выделенные инверсным цветом. Введенные изменения дизассемблируются и показываются в окне «ФАЙЛ: ».

Редактирование программы выполняется следующим образом.

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

Если длина нового фрагмента программы (или команды) больше старого, то он может быть расположен в любой подходящей по размеру области памяти, не занятой программой. В этом случае в программе с адреса команды, с которой начинаются изменения, освобождается место для трехбайтовой команды LJMP. Для этого надо переписать удаляемые команды в конец нового фрагмента. На освободившееся место записывается команда LJMPдля безусловного перехода в начало нового фрагмента. Оставшиеся не занятыми байты заполняются нулями. Новый фрагмент завершается командой безусловного перехода для возврата в программу.


Редактирование регистров управления(IP, IE, TMOD, TCON, SCON, PCON) становится доступным при нажатии клавиши Kв режиме редактирования (рис. 6). Содержимое каждого регистра представлено в двух полях: в одном поле в шестнадцатеричной, в другом – в двоичной системе счисления. Переключение между полями выполняется клавишей табуляции «Tab» только в случае отсутствия выделенных изменений. При навигации курсор находится в поле с выделенными изменениями. Навигация в окне не отличается от рассмотренных выше случаев. На рис. 6 курсор находится в позиции старшего разряда регистра TMOD (TMOD.7). В разряды IE.0 (флаг EX0), IE.2 (флаг EX1) и IE.7 (флаг IE) записаны (но не введены) единицы. При вводе этих изменений будут разрешены прерывания (IE = 1) от внешних входов INT0 (EX0 = 1) и INT1 (EX1 = 1). Прерывания от таймеров и последовательного порта запрещены. Для ввода изменений нажать ENTER, а для их отмены – ESC.

Выполнение прерываний.

Прерывания, если они разрешены, можно выполнить как в пошаговом, так и непрерывном режиме. Для разрешения прерываний в программе необходимо установить бит IE.7 (IE = 1) и разрешить прерывание от выбранных источников. При запуске эмулятора регистр IE обнуляется, что запрещает все прерывания.

Запрос на прерывание вводится в любой момент времени набором Alt<S>, где S – буквенное имя прерывания. В эмулятореemu51 прерываниям присвоены следующие буквенные имена:

i –    прерывание INT0;

j –    прерывание INT1;

t –    прерывание таймера/счетчика T0;

u –   прерывание таймера/счетчика T1.

Например, для ввода запроса на прерывание INT0 необходимо при удерживаемой в нажатом состоянии клавише Alt нажать буквенную клавишу i (выполнить Alt-i).

В окне «КОММЕНТАРИИ» появится сообщение «Установлен запрос прерывания INT0 по уровню. (IT0 = 0).», если прерывание INT0 разрешено (рис. 7). После выполнения очередной команды (F8) по адресу 0028h, содержимое программного счетчика PC указывает на адрес следующей команды (002Ah) и появляется сообщение о готовности выполнения прерывания (рис. 8).


Следующим шагом (F8) эмулятор приступает к обработке прерывания. Содержимое программного счетчика PC (002Ah) запоминается в стеке, а в программный счетчик записывается адрес входа в прерывание INT0 (0003h), как показано на рис. 9.

Для наглядности на рис.9 область стека отображена в окне «DSEG». В микропроцессорах семейства MCS-51 при записи двухбайтовых чисел в память по старшему адресу записывается старший байт. Запись в стек выполняется по адресу (SP)+1. Стек заполняется в сторону увеличения адресов. Младший байт программного счетчика PC (2A) записывается в DSEG по адресу [08], а старший(00) - по адресу [09]. В данном случае начало области стека совпадает с началом первого банка регистров и находящаяся здесь информация о содержимом регистров будет безвозвратно потеряна. Если эта область используется для хранения данных, то возникают ошибки в работе программы.

Для завершения работы эмулятора нажать функциональную клавишу F10, ввести Y на запрос «Вы закончили работу (Y/N) ?» в окне «КОММЕНТАРИИ» и нажать ENTER.

Отладка программы


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

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

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

Для коррекции программы необходимо перейти в режим редактирования сегмента программного кода «CSEG» и исправить содержимое ячеек памяти, соответствующие ошибочным командам. Адреса ячеек памяти можно определить в окне «ФАЙЛ : ».

Проверку работы отдельных фрагментов программы и просмотр дизассемблированной программы можно выполнить, запуская эмулятор с произвольного адреса. Для этого нажать клавишу F5 и ответить на приглашение вводом начального адреса фрагмента. При вводе адреса необходимо проявить осторожность: вводится должен адрес первого байта команды. Для корректного выполнения программы в этом случае необходимо ввести перед ее запуском соответствующие проверяемому фрагменту начальные условия.

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