
Встроенные микропроцессорные системы / ВстроенныеСистемы / mps13
.docЛекция 13
6.3. Программирование на ассемблере 8052
Язык ассемблера - это язык, в котором каждое высказывание соответствует ровно одной машинной команде. Иными словами, существует взаимно однозначное соответствие между машинными командами и операторами в программе на ассемблере. Система команд в лекции 12 была представлена на языке ассемблера.
Язык ассемблера позволяет использовать символические имена для представления адресных констант и констант данных вместо чисел.
Программист на языке ассемблера имеет доступ ко всем объектам и командам, присутствующим в ЦП.
Программа на ассемблере может работать только с данным типом ЦП, а программа, написанная на языке высокого уровня, потенциально может работать на разных типах ЦП.
Ассемблер довольно труден, время написания программ гораздо больше, много времени занимает отладка.
На ассемблере можно написать программу меньшую по размерам и более быструю, чем на языке высокого уровня. Некоторым процедурам требуется полный доступ к аппаратному обеспечению, что обычно невозможно сделать на языке высокого уровня. В эту категорию попадают обработчики прерываний операционных систем, а также контроллеры УВВ, работающие в реальном времени.
Рассмотрим текст на ассемблере МК 8052. “ ; ” является разделителям для комментария.
$PAGEWIDTH(132); указание компилятору о ширине ;ассемблерного текста
$OBJECT; указание компилятору о создании
;объектного файла
$NOSYMBOLS; указание компилятору о том, что
;не надо различать прописные и строчные буквы
;Далее следует объявления адресных констант
;регистров специальных функций одного из клонов
;МК DS520, используемого в лабораторных работах
;--------DS520------------
;Reg. equate table
;Директива EQU определяет новый символ, равный
;данному выражению
P0 EQU 80H; P0 – символический
;адрес порта 0. При компиляции будет заменен на 80Н.
SP EQU 81H
DPL EQU 82H
DPH EQU 83H
DPL1 EQU 84H
DPH1 EQU 85H
DPS EQU 86H
PCON EQU 87H
TCON EQU 88H
TMOD EQU 89H
TL0 EQU 8AH
TL1 EQU 8BH
TH0 EQU 8CH
TH1 EQU 8DH
CKCON EQU 8EH
P1 EQU 90H
EXIF EQU 91H
SCON EQU 98H
SBUF EQU 99H
P2 EQU 0A0H
IE EQU 0A8H
SADDR0 EQU 0A9H
SADDR1 EQU 0AAH
P3 EQU 0B0H
IP EQU 0B8H
SADEN0 EQU 0B9H
SADEN1 EQU 0BAH
SCON1 EQU 0C0H
SBUF1 EQU 0C1H
ROMSIZE EQU 0C2H
PMR EQU 0C4H
STATUS EQU 0C5H
TA EQU 0C7H
T2CON EQU 0C8H
T2MOD EQU 0C9H
RCAP2L EQU 0CAH
RCAP2H EQU 0CBH
TL2 EQU 0CCH
TH2 EQU 0CDH
PSW EQU 0D0H
WDCON EQU 0D8H
ACC EQU 0E0H
EIE EQU 0E8H
B EQU 0F0H
EIP EQU 0F8H
;Директива BIT определяет новый символ для
;битовой области равный данному выражению
;*** Bit equate table
IT0 BIT 88H
IE0 BIT 89H
IT1 BIT 8AH
IE1 BIT 8BH
TR0 BIT 8CH
TF0 BIT 8DH
TR1 BIT 8EH
TF1 BIT 8FH
P1_0 BIT 90H
P1_1 BIT 91H
P1_2 BIT 92H
P1_3 BIT 93H
P1_4 BIT 94H
P1_5 BIT 95H
P1_6 BIT 96H
P1_7 BIT 97H
RI BIT 98H
TI BIT 99H
RB8 BIT 9AH
TB8 BIT 9BH
REN BIT 9CH
SM2 BIT 9DH
SM1 BIT 9EH
SM0 BIT 9FH
EX0 BIT 0A8H
ET0 BIT 0A9H
EX1 BIT 0AAH
ET1 BIT 0ABH
ES BIT 0ACH
ET2 BIT 0ADH
ES1 BIT 0AEH
EA BIT 0AFH
P3_0 BIT 0B0H
P3_1 BIT 0B1H
P3_2 BIT 0B2H
P3_3 BIT 0B3H
P3_4 BIT 0B4H
P3_5 BIT 0B5H
P3_6 BIT 0B6H
P3_7 BIT 0B7H
PX0 BIT 0B8H
PT0 BIT 0B9H
PX1 BIT 0BAH
PT1 BIT 0BBH
PS BIT 0BCH
PT2 BIT 0BDH
PS1 BIT 0BEH
RI_1 BIT 0C0H
TI_1 BIT 0C1H
RB8_1 BIT 0C2H
TB8_1 BIT 0C3H
REN_1 BIT 0C4H
SM2_1 BIT 0C5H
SM1_1 BIT 0C6H
SM0_1 BIT 0C7H
C_RL2 BIT 0C8H
C_T2 BIT 0C9H
TR2 BIT 0CAH
EXEN2 BIT 0CBH
TCLK BIT 0CCH
RCLK BIT 0CDH
EXF2 BIT 0CEH
TF2 BIT 0CFH
P BIT 0D0H
FL BIT 0D1H
OV BIT 0D2H
RS0 BIT 0D3H
RS1 BIT 0D4H
F0 BIT 0D5H
AC BIT 0D6H
CY BIT 0D7H
RWT BIT 0D8H
EWT BIT 0D9H
WTRF BIT 0DAH
WDIF BIT 0DBH
PFI BIT 0DCH
EPFI BIT 0DDH
POR BIT 0DEH
SMOD_1 BIT 0DFH
EX2 BIT 0E8H
EX3 BIT 0E9H
EX4 BIT 0EAH
EX5 BIT 0EBH
EWDI BIT 0ECH
PX2 BIT 0F8H
PX3 BIT 0F9H
PX4 BIT 0FAH
PX5 BIT 0FBH
PWDI BIT 0FCH
;Далее могут следовать объявления символических
;имен пользователя.
DATA1 EQU 48
DATA2 EQU 120
; . . .
;Директива ORG n указывает компилятору, что следующую команду
;необходимо поместит по адресу n.
ORG 0
JMP BEGIN; BEGIN –адресная константа (метка)
;местоположения следующей команды.
ORG 0003H
JMP ISR_ IT0; переход на подпрограмму обслуживания
;прерывания от внешнего прерывания
. . .
ORG 100
BEGIN: MOV SP,#200; перемещение вершины стека в ячейку 200
; . . .
MOV R0,#DATA1
MOV R1,#DATA2
MOV B,#20
CALL COPYB; копируем 20 байт, начиная с адреса DATA1 в
;область, начиная с ячейки DATA2
; . . .
COPYB:MOV A,@R0; эта подпрограмма копирует данные
MOV @R1,A; из области, на которую указывает R0,
INC R0; в область, на которую указывает R1,
INC R1; через B в подпрограмму передается
DJNZ B, COPYB; количество копируемых байт
RET
; . . .
; директива DB (DW) выделяет память для одного или нескольких байт
;(слов) и помещает в них указанные значения
TXT: DB 0,1,2,3
. . .
ISR_ IT0: PUSH ACC
. . .
POP ACC
RETI
. . .
END; директива конца программы