— Шаг с заходом
— Шаг без захода
— Шаг с выходом
На Рис. 8.7 показан конечный результат симуляции нашей программы вычисления среднеквадратичного значения. Как и все три окна с исходными файлами, окно просмотра переменных (Watch) было открыто с помощью меню
Кроме того, на Рис. 8.7 показано содержимое окна Stop-watch. Из данных этого окна следует, что для выполнения программы потребовалось 292 машинных цикла при начальных значениях NUM_1 и NUM_2 соответственно 0x05 и 0x08. Поскольку симулировалась работа с кварцевым резонатором частотой 8 МГц, время выполнения программы составило 146 мкс.
В процессе симуляции выполняемая в данный момент команда помечается символом
Симуляция не позволяет выявить все проблемы, особенно те, которые связаны со сложным взаимодействием программной части и аппаратных средств. Однако более 95 % всех проблем вызываются исключительно ошибками при написании программы, и симуляция представляет собой хороший инструмент для тестирования и отладки подобного кода.
Например, наша программа не будет работать, если результат операции NUM_12 + NUM_22 > 65535, поскольку размер переменной SUM составляет два байта (см. Вопрос для самопроверки 8.5). При отладке всегда необходимо первым делом проверить функционирование программы при максимально и минимально возможных значениях переменных. Тем не менее такая проверка никоим образом не гарантирует корректную работу программы при всех возможных сочетаниях значений входных переменных.
* * *
В заключение приведем общую информацию, специфичную для Microchip-совместимых ассемблеров, которая может вам понадобиться при чтении программ из оставшейся части книги:
•
— Шестнадцатеричные: начинаются с символа «h», после которого следует шестнадцатеричное число, заключенное в кавычки, например h’41’. Также может использоваться завершающий символ «h» (например, 41h) или префикс «0х» (например, 0x41). Как правило, в ассемблере это основание используется по умолчанию, поэтому в некоторых программах указатели шестнадцатеричной системы могут быть опущены. Однако лучше на это не полагаться.
— Двоичные: начинаются с символа «Ь», после которого следует двоичное число, заключенное в кавычки, например Ь’01000001’.
— Десятичные: начинаются с символа «d», после которого следует десятичное число, заключенное в кавычки, например d’65’. Также могут обозначаться префиксом в виде точки (.65 в нашем случае).
— Символы ASCII: заключаются в одинарные кавычки, например ’А’.
•
— Текущее положение в программе: обозначается $, например goto $+2.
— Сложение: +, например, goto LOOP+6.
— Вычитание: - например, goto LOOP-8.
— Умножение: *, например, subwf LAST*2.
— Деление: /, например, subwf LAST/2.
•
— org: помещает последующий код в память программ, начиная с указанного адреса, например org h’100’. Если директива org не используется, то код размещается, начиная с адреса вектора сброса, т. е. h’000’. Может использоваться только при абсолютном ассемблировании.
— code: аналог директивы org для перемещаемого ассемблирования. Реальный адрес секции кода определяется в командном файле компоновщика. В данном файле может быть определено более одной секции кода, в этом случае их имена записываются в поле меток, например SUBROUTINES code.
— equ: связывает числовое значение с символьным именем, например PORTB equ 06. Вместо директивы equ можно использовать директиву #define (заимствованную из языка Си): #define PORTB 06.
— cblock…endc: используется при абсолютном ассемблировании для размещения переменных программы в памяти данных, например: