КОДИРОВАНИЕ

Процесс кодирования программ на языке ассемблера подробно рассмотрен в гл. 5. В данном параграфе излагаются некоторые соображения по поводу стиля программирования, которые могут быть полезны независимо от используемого языка или типа микропроцессора. Многие из изложенных рекомендаций заимствованы из работы Кернигана и Плоджера1.

 

 
Программа 1 обозначения
(выбранные
произвольны)
Программа 2 (обозначения несут содержательную нагрузку)
 
LXT
H, X
 
LXT
H, BLOCK
Z:
MOV
A, M
NEWMX:
MOV
A, M
W:
INX
н
NEXTE:
INX
H
 
DCR
в
 
DCR
В
 
JZ
Y
 
JZ
DONE
 
CMP
М
 
CMP
M
 
JC
Z
 
JC
NEWMX
 
JMP
W
 
JMP
NEXTE
Y:
STA
V
DONE:
STA
MAX
 
HLT
 
 
HLT
 

 

1. Используйте вместо конкретных значений адресов памяти, констант, масок, номеров устройств ввода-вывода или числовых величин символические имена.

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

OUT 2.

Если при изменении конфигурации аппаратурных средств потребуется использовать устройство с другим номером, программист должен найти в программе все ссылающиеся на него команды и изменить

их. Однако, если программист использовал символическое имя, до* статочно изменить тот оператор, в котором этому имени присваивается конкретное значение. Другими словами, если номер устройста был ранее задан с помощью операторов

PRNTR EQU 2

OUT PRNTR

то при изменении номера устройства на #3 достаточно изменить один оператор

PRNTR EQU 3

Использование символических имен позволит избежать путаницы адресов и данных. Например, операторы

Р1ТОР EQU 255 MINI EQU OFFH

присваивают различные символические имена адресу 255 (Р1ТОР) и числу 255 (MINI) : FF — дополнительный код для числа 1.

2. Используйте содержательные имена и метки. Осмысленные имена и метки помогут документировать и сопровождать программу. Они также удобны при отладке и включении программы в систему. На рис. 6.9 приведены два варианта одной и той же программы для МП Intel 8080: с произвольными и содержательными обозначениями меток и адресов. Дополнительные затраты на подготовку программы окупаются внесением ясности выполняемых операций даже при отсутствии документации. Имена должны быть как можно более простыми и очевидными, например: PRNTR —для системного принтера; TTY — для телетайпа; МАХ—для максимального значения; START — для начала программы. Использование при кодировании содержательных символических имен позволит программисту сэкономить время для других этапов разработки ПО.

3. Располагайте все ойераторы определения данных в начале программы. В этом случае етх легко найтн, проверить и при необходимости изменить. На рис. 6.10 приведен пример, в котором каждая определяемая величина сопровождается комментарием. Очевидно, что определения, разбросанные по всей программе, существенно затрудняют отладку и документирование программы.

4. Выбирайте метки и имена так, чтобы они легко различались. Это уменьшит вероятность возникновения ошибки. Использование цифр

0, 1 и 2, а также букв О, I и Z должно быть сведено к минимуму. Конечно, не следует использовать в одной программе в качестве идентификаторов имена MINI и MINI. В этом случае вероятность ошибки очень велика. Те имена, которые постоянно приводят к путанице, должны быть изменены. В программе и без того будет достаточно ошибок, потому не создавайте лишних.

5. Избегайте использования неясных адресных выражений. Примерами могут служить указанные значения смещения по отношению к текущему значению счетчика команд (PC) в ЭВМ с командами переменной длины, использование сложных выражений, значения которых зависят от порядка выполнения операций или использования редких операций, а также средств условного ассемблера. Что именно делает программа, показанная на рис. 6.11? Если даже в момент составления программы программист ясно понимает смысл используемых выражений, то через несколько дней или месяцев они будут ему совершенно непонятны.

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

7. Делайте модули короткими. Расчленяйте длинные модули на секции. Короткий модуль не только проще отлаживать и корректиро вать. Такой модуль с большой вероятностью можно будет использовать при разработке других программ, поскольку выполняемая им операция будет простой и поэтому часто встречающейся. Максималь ный размер модуля не должен превышать одной или двух страниц ма шинного кода (от 50 до 75 строк). Стандартные модули могут быть оформлены как макрокоманды или просто вставляться (в программу) как фрагменты, чтобы избежать большого числа команд вызова подпрограмм и возврата (в микропроцессорах операции вызова подпрограмм не только вызывают дополнительные затраты памяти и времени, но также могут привести к переполнению стека адресов возврата).

8. Делайте модули как можно более обобщенными. Очевидно, что очень специализированный модуль (например, сортирующий 32 элемента или отыскивающий букву R) вряд ли будет часто использоваться Нередко большая общность выполняемых функций может 0ыть достигнута за счет небольшого увеличения или без увеличения длины машинной программы: программу сортировки для обработки массива «произвольной длины написать также просто, как и программу для сортировки массива фиксированной длины. Универсальность, требующая существенного усложнения программы (например, единая программа преобразования из кода ASCII д EBCDIC), нецелесообразна. Ранее упоминались следующие простые способы достижения универсальности: использование символических имен вместо задания конкретных адресов и числовых значений, группировка всех определений в начале процедуры (возможно, специальное выделение параметров) и использование содержательных имен, которые поясняют смысл и идентифицируют объекты. С помощью подобных средств можно написать про грамму, которая будет часто использоваться и может быть легко модифицирована.

9. Обращайте внимание на простоту и ясность программы. Целью программирования для микропроцессоров является создание работающей программы. Чаще всего экономия нескольках ячеек памяти или нескольких микросекунд не имеет смысла; оптимизация машинной программы может быть выполнена впоследствии. Первоначальная программа должна быть скорее простой, чем изощренной. Следует избегать инициализации переменных в операторах DATA, использования команд не по их прямому назначению, длинных команд для обработки явно непомеченных переменных, результатов предыдущей операции для инициализации переменных или выполнения вычислений, параметров в качестве постоянных данных. Приведем несколько примеров (для Intel 8080), иллюстрирующих приемы, которые следует избегать:

а) LXI В,264 ;Установить В = 1, С = 8

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

MVI В, 1 ; Установить В = 1

MVI С,8 ; Установить С = 8

б) DCR С JNZ STRT

' MOV В,с

Не следует счищать регистр В таким образом. Лучше написать

DCR С JNZ STRT MVI В,0

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

В данном параграфе основное внимание было уделено «защищающему» программированию, т. е. такому стилю программирования, который упрощает внесение исправлений и гарантирует от неправильного понимания выполняемых программой действий и от возникновения ряда ошибок. Разумеется, такой стиль программирования приводит к увеличению затрат времени на кодирование программы; кроме того, программист никогда не смажет предусмотреть всех проблем, которые могут возникнуть впоследствии. Однако более тщательное программирование окупает себя за счет уменьшения числа ошибок и упрощения последующего использования и сопровождения программ. Конечно, ни один программист не будет буквально следовать всем этим советам, однако разумный подход к кодированию программ может существенно облегчить процесс разработки ПО для микропроцессоров.

 

 



http://profnastil-nn.ru/ системы водостока водосточные системы купить.