Язык ассемблера
Содержание:
Архитектуры RISC
MCS-51
MCS-51 (Intel 8051) — классическая архитектура микроконтроллера. Для неё существует кросс-ассемблер ASM51, выпущенный корпорацией MetaLink.
Кроме того, многие фирмы-разработчики программного обеспечения, такие, как IAR или Keil, представили свои варианты ассемблеров. В ряде случаев применение этих ассемблеров оказывается более эффективным благодаря удобному набору директив и наличию среды программирования, объединяющей в себе профессиональный ассемблер и язык программирования Си, отладчик и менеджер программных проектов.
Пример программы на языке ASM-51 для микроконтроллера AT89S52:
mov SCON, #50h mov TH1, #0FDh orl TMOD, #20h setb TR1 again: clr RI jnb RI, $ mov A, SBUF jnb RI, $ clr TI mov SBUF, A jnb TI, $ sjmp again
Данная программа («Эхо») отправляет обратно полученный символ, через последовательный порт UART.
AVR
На данный момент для AVR существуют 4 компилятора производства Atmel (AVRStudio 3, AVRStudio 4, AVRStudio 5 и AVRStudio 6, AVRStudio 7).
В рамках проекта AVR-GCC (он же WinAVR) существует компилятор avr-as (это портированный под AVR ассемблер GNU as из GCC).
Также существует свободный минималистический компилятор avra.
Платные компиляторы: IAR (EWAVR), CodeVisionAVR, Imagecraft. Данные компиляторы поддерживают языки Assembler и C, а IAR ещё и C++.
Существует компилятор с языка BASIC — BASCOM, также платный.
ARM
| Поставщик IDE | Компилятор | Поддерживаемые языки | Условия использования |
|---|---|---|---|
| Си/С++/Assembler | Shareware (не более 32kb) | ||
| Си/С++/Assembler | Commercial | ||
| Си/С++/Assembler. | |||
| Си/С++/Assembler |
Битовые операции
Си:
z = (a << 2) | (b & 15);
ASM:
ADR r4,a ; get address for a LDR r0,[r4 ; get value of a MOV r0,r0,LSL#2 ; perform shift ADR r4,b ; get address for b LDR r1,[r4 ; get value of b AND r1,r1,#15 ; perform AND ORR r1,r0,r1 ; perform OR ADR r4,z ; get address for z STR r1,[r4 ; store value for z
Си:
if (i == )
{
i = i + 10;
}
ASM:
@(переменная i находится в регистре R1) SUBS R1, R1, #0 ADDEQ R1, R1, #10
Циклы
Си:
for ( i = ; i < 15 ; i++)
{
j = j + j;
}
ASM:
SUB R0, R0, R0 ; i -> R0 and i = 0
start CMP R0, #15 ; is i < 15?
ADDLT R1, R1, R1 ; j = j + j
ADDLT R0, R0, #1 ; i++
BLT start
PIC
Пример программы на языке ассемблера для микроконтроллера PIC16F628A (архитектура PIC):
LIST p=16F628A
__CONFIG 0309H
STATUS equ 0x003
TRISB equ 0x086
PORTB equ 0x006
RP0 equ 5
org
goto start
start:
bsf STATUS,RP0
movlw .00
movwf TRISB
bcf STATUS,RP0
led
movlw .170
movwf PORTB
goto led
end
MSP430
Пример программы на языке Assembler для микроконтроллера MSP430G2231 (архитектура MSP, в среде Code Composer Studio):
.cdecls C,LIST, "msp430g2231.h"
;------------------------------------------------------------------------------
.text ; Program Start
;------------------------------------------------------------------------------
RESET mov.w #0280h,SP ; Initialize stackpointer
StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
SetupP1 bis.b #001h,&P1DIR ; P1.0 output
;
Mainloop bit.b #010h,&P1IN ; P1.4 hi/low?
jc ON ; jmp--> P1.4 is set
;
OFF bic.b #001h,&P1OUT ; P1.0 = 0 / LED OFF
jmp Mainloop ;
ON bis.b #001h,&P1OUT ; P1.0 = 1 / LED ON
jmp Mainloop ;
;
;------------------------------------------------------------------------------
; Interrupt Vectors
;------------------------------------------------------------------------------
.sect ".reset" ; MSP430 RESET Vector
.short RESET ;
.end
Стек
Это область памяти, выделенная для работы процедур. Особенность стека заключается в том, что последние данные, записанные в него, доступны для чтения первыми. Или иными словами: первые записи стека извлекаются последними. Представить этот процесс себе можно в качестве башни из шашек. Чтобы достать шашку (нижнюю шашку в основание башни или любую в середине) нужно сначала снять все, которые лежат сверху. И, соответственно, последняя положенная на башню шашка, при разборе башни снимается первой. Такой принцип организации памяти и работы с ней продиктован ее экономией. Стек постоянно очищается и в каждый момент времени одна процедура использует его.
