При написании программы нужно стремиться, чтобы текст был (для читабельности) разбит на колонки:
метка | код | операнды | комментарии (т.к. программное
обеспечение может не поддерживать русские символы, надёжнее писать латиницей) |
<m1>: <m2>: |
- - mov mov END |
- - 10, #11 11, #12h - |
; метка 1 ; метка 2 ; заносим в ячейку 10 число 11 ; заносим в ячейку 11 число 12h ; конец программы |
без этого слова в конце программа ни за что не откомпилируется.
пишется после символа ';' до конца строки.
состоит из названия + символ ':' (пишется слитно), например:
metka: ;метка . . . . . . JZ metka ;Переход на метку 'metka' если аккумулятор равен нулю
- позволяет выполнять над текстом программы некоторые действия перед тем, как он подвергается трансляции.
EQU - одна из команд препроцессора. EQU присваивает ячейке символическое имя и позволяет работать в тексте программы с именем переменной. ПРИМЕР: count EQU 8 ; объявляем переменную 'count' . . . . . . mov count, #10 ; count = 10; и т.д. Возможен и такой вариант объявления переменной: count EQU 8 ; объявляем переменную 'count' count1 EQU count + 1 ; объявляем переменную 'count1' count2 EQU count1 + 1 ; объявляем переменную 'count2' Иногда удобнее иметь список переменных отдельно от остальных текстов. Строки, содержащие объявление переменных, можно сохранить в виде отдельного файла, с произвольным именем, допустим, 'variable.equ'. Тогда для подключения variable.equ при трансляции, в основной текст нужно вставить строчку: $variable.equ (Символ '$' должен быть первым символом в строке и пишется слитно с названием подключаемого файла!!!)
Трансляцию текстов программ будем
осуществлять программами работающими в
командном режиме.
Программы сохраняем под именами из 8-ми
символов с расширением a51
Программа a8051.exe формирует из файла *.a51
файл объёктного кода *.obj
Формат командной строки для трансляции файла *.a51:
> a8051 progname.a51 - по этой
команде будет сформирован файл 'progname.o51'
В результате получаем файл progname.o51, содержащий объектный код.
Если набрать
> a8051.exe progname.a51 listing,
то дополнительно к файлу 'progname.o51' будет
сформирован отчёт (листинг) под именем
'listing.lst', содержащий сведения об ошибках и пр.
Чтобы получить шестнадцатеричный код,
необходимый для прошивки памяти
контроллера, надо запустить программу-линковщик
xlink.exe
Формат командной строки для линковщика:
> xlink.exe -f xlink.xcl
после её выполнения образуется в 16-тиричный hex-файл
'progname.hex'
в файле 'xlink.xcl' указывается имя файла 'progname'
(при этом, если проект состоит из нескольких файлов,
то указываются несколько имён, и эти файлы (*.o51) объединяются в 1 файл
*.hex)
Содержание файла 'xlink.xcl': -! ******************************************************************** -! -! -! -! link batch file -! -! ******************************************************************** -! -! processor type ..................... -! -c8051 -! segments order ..................... -! -Z(CODE)RelCODEsegment=60 -! objects loading .................... -! progname -! output file ........................ -! -o progname -! map file ........................... -! -l gen.map -! cross references ................... -! -xsm |
Чтобы визуально проследить происходящие в микроконтроллере процессы используется специальная программа - отладчик. Описание отладчика FD51.EXE с картинками см. здесь.
a1 | EQU | 10h | ; |
a2 | EQU | a1+1 | ; |
mov | a1, #11h | ; | |
mov | a2, #01h | ; | |
mov | A, a1 | ; | |
add | A, a2 | ; | |
mov | a2, A | ; | |
sjmp | $ | ; | |
END | ; |
arr | equ 0 | ; | |
summ | equ 0 | ; | |
cntr | equ 0 | ; | |
; | |||
mov | R0, #arr+0 | ; | |
mov | cntr, #10 | ; | |
mov | summ, #0 | ; | |
lable: | mov | A, @R0 | ; |
jnz | n | ; | |
inc | summ | ; | |
n: inc | R0 | ; | |
djnz | cntr, lable | ; | |
END |
Macro | %Macro1 | ; начало макроопределения | |
mov | A, \0 | ; действие с первым параметром (аргументом макроопеределения) | |
add | A, \1 | ; действие со вторым параметром | |
mov | sum, A | ; | |
EndMac | ; конец макроопределения | ||
sum | EQU | 10h | ; начало основной программы |
%Macro1 | 11, 12 | ; вызов макроопределения с парамеьтрами #1, #2 | |
%Macro1 | 11, 13 | ; вызов макроопределения с парамеьтрами #1, #2 | |
END |
метка | код | операнды | комментарии |
m1: |
count mov mov mov mov mov inc inc djnz sjmp $ END |
EQU 8 R0, #80h R1, #12h count, #10 A, R1 @R0, A R0 R1 count, m1 |
; ob'yavlyaem peremennuyu 'count' ; zanosim v R0 chislo 80h ; zanosim v R1 chislo 80h ; count = 10; ; zanosim v Akkumulyator dannyey iz R1 ; zanosim iz Akkumulyatora dannyey v yacheyku, ; adres kotoroy v R0 ; R0 = R0 + 1 ; R0 = R0 + 1 ; count = count - 1; esli cunt <> 0 perexod k m1 ; konetz |
программок пока маловато, но скоро добавим ещё :)