- Assembler Source
- Assembler Source
- Assembler 소스 파일에는 Instruction mnemonics, Labels, Directives(지시문) 가 포함되어 있다.
- Instruction mnemonics, Labels, Directives는 피연산자(operands)를 포함할 수 있다.
- Code 줄은 120자 이내로 제한된다.
- 모든 입력 라인은 콜론(:)으로 끝나는 영숫자 문자열인 레이블(Label)이 앞에 올 수 있다. 레이블은 점프 및 분기 명령의 목적지로 사용될 수 있고, 또한 프로그램 메모리 및 RAM의 변수 이름으로 사용될 수 있다.
- 입력 라인은 다음 네 가지 형식 중 하나를 취할 수 있다. Braces([ ]) 안에 있는 항목(Items)은 선택적으로 사용되는 항목이다.
- [label:] instruction [operands] [Comment]
- [label:] directive [operands] [Comment]
- Comment
- Empty line
- Comment는 아래 예와 같이 첫자가 세미콜론(;)으로 시작 하여야 한다.
- Assembler Source Code의 예
- AVR Assembler Syntax
- Keywords
- 사전 정의된 식별자(keywords)는 Assembler에서 이미 예약되어 사용하고 있기 때문에 재정의할 수 없다. 키워드에는 모든 명령어 Instruction mnemonics 과 Functions이 포함된다.
- 어셈블러 키워드는 -c 옵션을 사용하지 않는 한 대소문자에 관계없이 동일한 키워드로 인식된다. -c 옵션을 사용하면 대소문자를 구분한다. 이 경우 키워드는 소문자이다(즉, "add"는 예약되어 있고 "ADD"는 예약되어 있지 않음).
- Preprocessor Directives
- AVRASM2는 '#'으로 시작하는 모든 행을 전처리기 지시문으로 간주한다.
- Comments
- ';'로 시작하는 어셈블러 Comments 외에도 AVRASM2는 C 스타일 Comments을 인식한다. 아래 예는 AVRASM2에서 사용 가능한 Comments 예 이다.
- Line Continuation
- C 에서와 같이 소스 행은 행의 마지막 문자로 백슬래시(\)를 사용하여 계속될 수 있다. 이것은 긴 전처리기 매크로를 정의할 때와 긴 .db 지시문에 특히 유용하다.
- Integer Constants
- AVRASM2에서는 가독성을 높이기 위해 밑줄(_)을 구분 기호로 사용할 수 있다. 밑줄은 첫 번째 문자나 기수(radix) 지정자를 제외하고 숫자의 아무 곳에나 위치할 수 있다.
- 0b1100_1010 와 0b_11_00_10_10_ 사용할 수 있는 동일한 상수 표현이다.
- _0b11001010 와 0_b11001010 사용할 수 없는 상수 표현이다.
- Strings and Character Constants
- 큰 따옴표(")로 묶인 문자열은 DB 지시문 및 MESSAGE/WARNING/ERROR 지시문과 함께만 사용할 수 있다. 문자열(Strings)은 문자 그대로 사용되며 이스케이프 시퀀스(Escape sequences)가 인식되지 않으며 NULL로 종료되지 않는다. c에서는 문자열(Strings) 끝에 NULL 이 자동으로 삽입된다.
- 따옴표로 묶인 문자열은 ANSI C 규칙에 따라 연결될 수 있다. 즉, "This is a " "long string"은 "This is a long string"과 같다. 이것은 라인 연속과 결합되어 여러 소스 라인에 걸쳐 긴 문자열을 형성할 수 있다.
- 문자 상수는 작은따옴표(')로 묶여 있으며 정수 표현식이 허용되는 모든 곳에서 사용할 수 있다. 다음 C 스타일 이스케이프 시퀀스는 C에서와 동일한 의미로 인식된다.
- \n : Newline (ASCII LF 0x0a)
- \r : Carriage return (ASCII CR 0x0d)
- \b : Backspace (ASCII BS 0x08)
- \f : Form feed (ASCII FF 0x0c)
- \\ : Backslash
- \0 : Null character (ASCII NUL)
- \ooo 는 8진수(ooo = octal number)로 인식되고, and \xhh (hh = hex number) are
- \xhh 는 16진수(hh = hex number)로 인식된다.
- 예:
- Multiple Instructions per Line
- AVRASM2는 한 줄에 여러 명령과 지시문을 허용하지만 사용하지 않는 것이 좋다. 이 기능은 여러 줄 전처리기 매크로의 확장을 지원하는 데 필요하다.
- Integer operands 와 Floating point constant expressions
- AVRASM2는 Integer operands를 지원하고 부동 소수점 상수 표현식(Floating point constant expressions)을 제한적으로 지원한다.
- Assembler Directives
- ORG
- ORG 지시문은 위치 카운터의 값을 설정한다. 설정할 값은 매개변수로 주어진다.
- ORG 지시문이 데이터 세그먼트 내에서 주어지면 SRAM 위치 카운터가 설정되고, 지시문이 코드 세그먼트 내에서 주어지면 프로그램 메모리 카운터가 설정된다.
- Syntax
- 예:
- CSEG
- CSEG 지시문은 Code Segment의 시작을 정의한다. 어셈블러 파일은 여러 Code Segment로 구성될 수 있지만 하나의 Code Segment로 연결된다.
- Code Segment에는 Word counter인 자체 위치 Counter가 있다. BYTE 지시문은 Code Segment 내에서 사용할 수 없다.
- ORG 지시문은 프로그램 메모리의 특정 위치에 Code와 상수를 배치하는 데 사용할 수 있다. Code Segment 지시문은 매개변수를 사용하지 않는다.
- Syntax
- 예: ORG 지시문 예를 참고 바람.
- DSEG
- DSEG 지시문은 Data Segment의 시작을 정의한다. 어셈블러 소스 파일은 어셈블될 때 단일 Data Segment로 연결되는 여러 Data Segment로 구성될 수 있다.
- Data Segment는 일반적으로 Label과 BYTE 지시문으로만 구성된다.
- Data Segment에는 바이트 카운터인 자체 위치 카운터가 있다.
- ORG 지시문을 사용하여 SRAM의 특정 위치에 변수를 배치할 수 있다. Data Segment 지시문은 매개변수를 사용하지 않는다.
- Syntax
- 예: ORG 지시문 예를 참고 바람.
- EXIT
- EXIT 지시문은 어셈블러에 파일 어셈블을 중지하도록 지시한다. EXIT 지시문이 생략된 경우 어셈블러는 EOF(파일 끝)까지 실행된다.
- EXIT 지시문이 INCLUDE 된 파일에 나타나면 어셈블러는 INCLUDE 지시문이 포함된 파일의 INCLUDE 지시문 다음 행에서 부터 계속한다.
- Syntax
- 예:
- EQU
- EQU 지시문은 레이블에 값을 할당한다. 이 레이블은 이후 표현식(Expressions)에서 사용할 수 있다.
- EQU 지시문에 의해 값이 할당된 레이블은 상수이며 변경하거나 재정의할 수 없다.
- Syntax
- 예:
- SET
- SET 지시문은 레이블에 값을 할당한다. 이 레이블은 이후 표현식에서 사용할 수 있다.
- EQU 지시문과 달리 SET 지시문에 의해 값이 할당된 레이블은 나중에 프로그램에서 변경(재정의)될 수 있다.
- Syntax
- 예:
- DEF
- 레지스터에 기호 이름을 설정한다. DEF 지시문을 사용하면 레지스터를 기호를 통해 참조할 수 있다.
- 정의된 기호는 할당된 레지스터를 참조하기 위해 프로그램의 나머지 부분에서 사용할 수 있다. 레지스터에는 여러 기호 이름이 첨부될 수 있다.
- 기호는 나중에 프로그램에서 재정의할 수 있다.
- Syntax
- 예:
- BYTE
- BYTE 지시문은 SRAM 또는 EEPROM에 메모리 리소스를 예약한다. 예약된 위치를 참조할 수 있으려면 BYTE 지시문 앞에 레이블이 있어야 한다.
- BYTE 지시문은 예약할 바이트 수를 매개변수로 사용한다. 할당된 바이트는 초기화되지 않는다.
- BYTE 지시문은 코드 세그먼트 내에서 사용할 수 없다(지문 ESEG, CSEG 및 DSEG 참조).
- Syntax
- 예:
- DB
- 프로그램 메모리 및 EEPROM에 상수 바이트를 정의한다.
- 정의된 위치를 참조하려면 DB 지시문 앞에 레이블이 있어야 한다.
- DB 지시문은 표현식 목록을 사용하며 최소한 하나의 표현식을 포함하여야 한다.
- DB 지시문은 Code 세그먼트 또는 EEPROM 세그먼트에 배치하여야 한다.
- Syntax
- 예:
- DW
- 프로그램 메모리와 EEPROM에 상수 Word를 정의한다.
- 정의된 위치를 참조하려면 DW 지시문 앞에 레이블이 있어야 한다.
- DW 지시문은 표현식 목록을 사용하며 최소한 하나의 표현식을 포함하여야 한다.
- DW 지시문은 Code 세그먼트 또는 EEPROM 세그먼트에 배치하여야 한다.
- Syntax
- 예:
- DD
- 프로그램 메모리와 EEPROM에 상수 double-word(s)를 정의한다.
- 이 지시문은 32비트(더블 워드)를 정의하는 데 사용된다는 점을 제외하고는 DW 지시문과 매우 유사하다.
- 메모리의 Data 레이아웃은 리틀 엔디안이(Little-endian)다. 리틀 엔디안 방식은 낮은 주소에 데이터의 낮은 바이트(LSB, Least Significant Bit)부터 저장하는 방식이다.
- Syntax
- 예:
- IF, IFDEF, and IFNDEF
- IFDEF 지시문은 IFDEF 지시문의 인수인 <symbol>이 정의된 경우 해당 ELSE 또는 ENDIF 지시문까지 코드를 포함한다. 기호는 EQU 또는 SET 지시문으로 정의하여야 한다. DEF 지시문은 사용할 수 없다.
- IF 지시문은 <expression>이 True(0이 아닌 경우)인 경우 해당 ELSE 또는 ENDIF 지시문까지 코드를 포함한다.
- 최대 5단계의 중첩(Nesting)이 가능하다.
- Syntax
- Syntax - Nesting
- ENDIF
- 조건부 어셈블리에는 어셈블리 시 일련의 명령이 포함된다. ENDIF 지시문은 조건부 IF, IFDEF 또는 IFNDEF 지시문의 끝을 정의한다.
- 조건(.IF...ELIF...ELSE...ENDIF 블록)은 중첩될 수 있지만 모든 조건은 파일 내에서 종료되어야 한다(조건은 여러 파일에 걸쳐 있을 수 없음).
- Syntax
- 예:
- INCLUDE
- 다른 파일을 포함(INCLUDE)한다. INCLUDE 지시문은 지정된 파일을 읽어 현재 파일에 포함하도록 어셈블러에 지시한다. 그런 다음 어셈블러는 EOF(파일 끝) 또는 EXIT 지시문을 만날 때까지 지정된 파일을 어셈블한다. 포함된 파일에는 INCLUDE 지시문 자체가 포함될 수 있다.
- Syntax
- 예:
- LIST
- LIST 지시문은 어셈블러에게 Listfile 파일 생성 기능을 켜도록 지시한다.
- 어셈블러는 어셈블리 소스 코드, 주소 및 opcode의 조합인 Listfile 파일을 생성한다.
- Listfile 파일 생성은 기본적(default)으로 켜져 있다.
- 어셈블리 소스 파일에서 선택한 부분의 목록 파일만 생성하기 위해 이 지시문을 NOLIST 지시문과 함께 사용할 수도 있다.
- Syntax
- 예:
- NOLIST
- NOLIST 지시문은 어셈블러에게 Listfile 파일 생성 기능을 중지하도록 지시한다.
- 예: LIST 지시문 예를 참고 바람.
- MACRO
- 매크로 지시문은 어셈블러에게 이것이 매크로의 시작임을 알려준다. 매크로 지시어는 매크로 이름을 매개 변수로 사용한다.
- 매크로의 이름이 프로그램 후반에 작성되면 매크로 정의가 사용된 위치에서 확장된다.
- 매크로에는 최대 10개의 매개 변수를 사용할 수 있다. 매크로 정의에서는 매개 변수 @0-@9 (0 - 9는 매크로를 호출하는 매크로 함수에서 매개 변수 위치)를 사용한다.
- 매크로 호출을 실행할 때 매개 변수는 콤마(,)로 구분된다.
- 매크로 정의는 ENDMACRO 지시어로 종료된다.
- Syntax
- 예:
- ENDM and ENDMACRO
- ENDMACRO 지시어는 매크로 정의의 끝을 정의한다. ENDM은 ENDMACRO와 완전히 동일한 대체 형식이다.
- 지시문에는 매개 변수가 없다.
- Syntax
- 예: MACRO 예를 참고 바람.
- MESSAGE
- MESSAGE 지시어는 문자열을 출력한다. 조건부 어셈블리에 유용하다.
- Syntax
- 예:
- ERROR
- ERROR 지시어는 오류 메시지 문자열을 출력하고 어셈블리를 중지한다. 조건부 Assembly에 사용할 수 있다.
- Syntax
- 예:
- WARNING
- WARNING 지시어는 경고 메시지 문자열을 출력한다. 그러나 ERROR 지시어와 다르게 어셈블리를 중지하지 않는다. 조건부 Assembly에 사용할 수 있다.
- Syntax
- 예:
- Preprocessor
- AVRASM2 전처리기(Preprocessor) 개요
- AVRASM2에서 사용하는 모든 정수 형식을 인식한다. 즉, $abcd 및 0b011001은 전처리기에 의해 유효한 정수로 인식되며 #if 지시문의 표현식에서 사용할 수 있다.
- '.' 및 '@'는 식별자로 허용된다. '.dw'와 같은 전처리기 지시문을 전처리기 매크로에서 사용할 수 있도록 하려면 '.' 가 필요하고 어셈블러 매크로 인수를 올바르게 처리하려면 '@'가 필요하다.
- 어셈블러 스타일 주석(Comment) 구분 기호(';')와 C 스타일 주석을 인식한다. ';'를 사용한 주석 구분 기호는 ';'의 C 사용과 충돌하므로 전처리기 지시문과 함께 어셈블러 스타일 주석을 사용하지 않는 것이 좋다.
- AVRASM2 가변 매크로(즉, 가변 개수의 인수가 있는 매크로)는 구현되지 않았다.
- #warning 및 #message 지시문은 ANSI C 표준애서는 구현되지 않았다.
- #define
- Syntax
- 전처리기(Preprocessor) 매크로(MACRO)를 정의한다. 매크로에는 두 가지 형태가 있다.
- 첫번째 Syntax와 같이 상수를 정의하는 개체와 같은 매크로(object-like macros)와
- 두번째 Syntax와 같이 매개변수 대체를 수행하는 함수와 유사한 매크로(function-like macros) 가 있다.
- Syntax에서 value는 임의의 문자열일 수 있으며, 매크로가 확장(사용)될 때까지 평가(Evaluated)되지 않는다. 값을 지정하지 않으면 1로 설정된다.
- 두번째 Syntax를 사용할 경우 매크로가 정의된 것과 동일한 수의 인수를 사용하여 호출되어야 한다.
- 인수 값이 주어지면 매크로가 호출될 때 해당 인수로 대체된다.
- 두번째 Syntax를 사용할 경우 매크로 이름 바로 뒤에 왼쪽 괄호가 있어야 한다(간격 없음). 그렇지 않으면 첫번째 Syntax 매크로 값의 일부로 해석된다.
- -D 인수를 사용하여 명령줄에서 매크로를 정의할 수 있다.
- 예:
- #undef
- Syntax
- #define 지시어로 이전에 정의된 매크로 이름의 정의를 취소한오. 이름이 이전에 정의되지 않은 경우 .undef 디렉티브는 자동으로 무시된다.
- -U 인수를 사용하여 명령줄에서 매크로 정의를 해제할 수 있다.
- #ifdef
- Syntax
- 이름이 이전에 #defined 된 경우 해당 #endif, #else 또는 #elif까지 #ifdef 다음 모든 행이 조건부로 Assemble 된다.
- 예:
- #ifndef
- Syntax
- 이름이 이전에 정의되지 않은 경우 해당 #endif, #else 또는 #elif까지 #ifndef 다음 모든 행이 조건부로 Assemble 된다.
- #if and #elif
- Syntax
- 조건이 True(0이 아니면)이면 해당 #endif, #else 또는 #elif까지 다음 모든 라인이 조건부로 Assemble 된다.
- 조건은 확장된 전처리기 매크로를 포함한 임의의 정수 식일 수 있다.
- 전처리는 이름이 정의되어 있으면 1을 반환하고 그렇지 않으면 0을 반환하는 특수 연산자 #defined(이름)를 인식한다. 조건에 사용된 정의되지 않은 기호는 자동으로 0으로 평가된다.
- 예:
- #else
- Syntax
- #else 앞에 있는 #if ... #elif ... 시퀀스에서 true로 평가된 이전 분기가 없는 경우 #else 에서 해당 #endif 까지 모든 행이 조건부로 Assemble 된다.
- 예:
- #endif
- Syntax
- if, #ifdef 또는 #ifndef 지시어로 시작된 조건부 블록을 종료한다.
- #error, #warning, and #message
- Syntax
- #error는 표준 오류에 토큰을 방출하고 어셈블러 오류 카운터를 증가시켜 프로그램이 성공적으로 어셈블되는 것을 방지한다. #error는 ANSI C 표준에 명시되어 있다.
- #warning은 토큰을 표준 오류로 내보내고 어셈블러 경고 카운터를 증가시킨다. #경고는 ANSI C 표준에 명시되어 있지 않지만 GNUC 프리프로세서와 같은 프리프로세서에서 일반적으로 구현된다.
- #message은 표준 출력으로 토큰을 내보내고 어셈블러 오류 또는 경고 카운터에는 영향을 주지 않는다. #message는 ANSIC 표준에 지정되지 않았다.
- 모든 Directives의 출력에는 일반 오류 및 경고 메시지와 함께 파일 이름과 줄 번호가 포함된다.
- 토큰은 프리프로세서 토큰의 시퀀스이다. 전처리기 매크로들은 따옴표로 묶인 문자열("") 안에 나타나는 경우를 제외하고 확장된다.
- 예:
- #include
- Syntax
- #include 지시어의 인수로 지시된 파일을 포함한다.
- 첫번째 Syntax는 현재 작업 디렉터리를 먼저 검색한다.
- 두번째 Syntax는 현재 작업 디렉터리를 검색하지 않는다.
- 두 Syntax 모두 명시적으로 지정된 경로를 검색한 다음 기본적으로 제공되는 알려진 위치를 검색한다.
- 예:
- Expressions
- Functions
- LOW(expression) : Expressions의 LOW 바이트를 반환(Returns)한다.
- HIGH(expression) : Expressions의 HIGH 바이트를 반환(Returns)한다.
- BYTE2(expression) : HIGH(expression)과 같다.
- BYTE3(expression) : Expressions의 세번째 바이트를 반환(Returns)한다.
- BYTE4(expression) : Expressions의 네번째 바이트를 반환(Returns)한다.
- LWRD(expression) : Expressions의 Bits 0-15를 반환(Returns)한다.
- HWRD(expression) : Expressions의 Bits 16-31를 반환(Returns)한다.
- PAGE(expression) : Expressions의 Bits 16-21를 반환(Returns)한다.
- INT(expression) : 부동 소수점 식의 소수점 부분을 잘라내어 정수로 변환(i.e. discards fractional part)한다.
- FRAC(expression) : 부동 소수점 식의 소수점 부분(i.e. discards integer part)을 추출한다.
- ABS() : 상수 식(constant expression)의 절대값을 반환한다.
- DEFINED(symbol) : Symbol이 이전에 .equ/.set/.def 지시어를 사용하여 정의된 경우 true를 반환한다.
- STRLEN(string) : 문자열 상수의 길이를 바이트 단위로 반환한다.
- 피연산자(Operands)
- 사용자 정의 Labels(Label의 위치에 대응하는 카운터 값)
- SET 지시어로 정의된 사용자 정의 변수
- EQU 지시어로 정의된 사용자 정의 상수
- 정수 상수: 상수는 다음과 같은 여러 형식으로 지정할 수 있다.
- Decimal(default): 10, 255
- Hexadecimal(two notations): 0x0a, $0a, 0xff, $ff
- Binary: 0b00001010, 0b11111111
- Octal(leading zero): 010, 077
- PC - 프로그램 메모리 위치 카운터(location counter)의 현재 값
- 부동 소수점 상수(Floating point constants)
- 연산자(Operators)
- 연산자(Operators) 개요
- 아래에 설명 순서는 연산 순위를 표시한다.
- 식은 괄호로 묶을 수 있으며, 이러한 식은 항상 괄호 밖의 식과 결합하기 전에 평가(Expressions)된다.
- 이항 연산자의 연관성은 연결된 연산자의 평가 순서를 나타낸다. 즉, 2 - 3 - 4는 왼쪽에서 오른쪽으로 평가된다. 즉, 2 - 3 - 4는 (2 - 3) - 4이고, 오른쪽 연관성은 2 - (3 - 4).
- ! : Logical not
- ~ : Bitwise Not
- - : Unary Minus
- * : Multiplication
- / : Division
- % : Modulo ( AVR Assembler 2 only)
- + : Addition
- - : Subtraction
- << : Shift left
- >> : Shift right
- < : Less than
- <= : Less than or equal
- > : Greater than
- >= : Greater than or equal
- == : Equal
- != : Not equal
- & : Bitwise And
- ^ : Bitwise Xor
- | : Bitwise Or
- && : Logical And
- || : Logical Or
- ? : Conditional operator
AVR Assembler의 Directives, Preprocessor의 종류가 너무 많기 때문에 이 페이지에서는 자주 사용하는 Directives, Preprocessor 만 설명한다. 전체 AVR Assembler 자료는 아래 참고문헌을 참고 바람.
참고자료: "AVR Assembler-microchip.pdf"
; [Text]
ldi r16, 0x01 ; Set r16 to 0x01
label_1:
nop ; Continue (do nothing)
rjmp label_1 ; Infinite loop(Instruction)
; Pure comment line
; The rest of the line is a comment (classic assembler comment)
// Like ';', the rest of the line is a comment
/* Block comment; the enclosed text is a comment */
.db 0, 1, "This is a long string", '\n', 0, 2, \
"Here is another one", '\n', 0, 3, 0
.db "Hello\n" // is equivalent to:
.db 'H', 'e', 'l', 'l', 'o', '\\', 'n'
.db '\0', '\177', '\xff'
AVR Assembler의 Directives의 종류가 너무 많기 때문에 여기서는 자주사용하는 Directives만 설명한다.
.ORG expression
.DSEG ; Start data segment
.ORG 0x100; Set SRAM address to hex 100
variable: .BYTE 1 ; Reserve a byte at SRAM adr. 0x100
.CSEG ; Start code segment
.ORG 0x120; Set Program Counter to hex 120
mov r0,r1 ; Do something
.CSEG
.DSEG
.EXIT
.EXIT ; Exit this file
.EQU label = expression
.EQU io_offset = 0x23
.EQU myport = io_offset + 2
out myport,r16
.SET label = expression
.SET FOO = 0x114; set FOO to point to an SRAM location
lds r0, FOO; load location into r0
.SET FOO = FOO + 1 ; increment(redefine) FOO. This would be illegal if using .EQU
lds r1, FOO ; load next location into r1
.DEF Symbol=Register
.DEF temp=R16
.CSEG
ldi temp,0xf0 ; Load 0xf0 into temp register
LABEL: .BYTE expression
.DSEG
var1: .BYTE 1 ; reserve 1 byte to var1
table: .BYTE tab_size ; reserve tab_size bytes
.CSEG
ldi r30,low(var1) ; Load Z register low
ldi r31,high(var1) ; Load Z register high
ld r16,Z ; Load VAR1 into register 16
LABEL: .DB expressionlist
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa
LABEL: .DW expressionlist
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535
LABEL: .DD expressionlist
.CSEG
varlist: .DD 0, 0xfadebabe, -2147483648, 1 << 30
.IFDEF <symbol>
.IFNDEF <symbol>
.IF <expression>
.IFDEF <symbol> |.IFNDEF <symbol>
…
.ELSE | .ELIF <expression>
…
.ENDIF
.ENDIF
.IFDEF <symbol> |.IFNDEF <symbol>
…
.ELSE | .ELIF <expression>
…
.ENDIF
.IFNDEF DEBUG
.MESSAGE "Release.."
.ELSE
.MESSAGE "Debugging.."
.ENDIF
.INCLUDE "filename" ; 현재 디렉터리를 먼저 검색한다.
.INCLUDE <filename>
.include "m128def.inc"
.LIST
NOLIST ; Disable listfile generation
.INCLUDE "macro.inc" ; The included files will not be shown in the listfile
.LIST ; Reenable listfile generation
.MACRO macroname
.MACRO SUBI16 ; Start macro definition
subi @1,low(@0) ; Subtract low byte
sbci @2,high(@0) ; Subtract high byte
.ENDMACRO ; End macro definition
...
.CSEG ; Start code segment
SUBI16 0x1234,r16,r17 ; Sub.0x1234 from r17:r16
.ENDMACRO
.ENDM
.MESSAGE "<string>"
.IFDEF DEBUG
.MESSAGE "Debug mode"
.ENDIF
.ERROR "<string">"
.IFDEF TOBEDONE
.ERROR "Still stuff to be done.."
.ENDIF
.WARNING "<string">"
.IFDEF EXPERIMENTAL_FEATURE
.WARNING "This is not properly tested, use at own risk."
.ENDIF
AVRASM2 전처리기(Preprocessor)는 다음 몇 가지 예외를 제외하고 C 전처리기를 모델로 한다.
#define name [value]
#define name(arg, ...) [value]
#define EIGHT (1 << 3)
#define SQR(X) ((X)*(X))
#undef name
#ifdef name
#ifdef FOO
// do something
#endif
#ifndef name
#if condition
#elif condition
#if defined(__ATmega48__) || defined(__ATmega88__)
// code specific for these devices
#elif defined (__ATmega169__)
// code specific for ATmega169
#endif // device specific code
#else
#if defined(__ATmega48__) || defined(__ATmega88__)
// code specific for these parts
#elif defined (__ATmega169__)
// code specific for ATmega169
#else
#error "Unsupported part:" __PART_NAME__
#endif // part specific code
#endif
#error tokens
#warning tokens
#message tokens
#error "Unsupported part:" __PART_NAME__
#include "file"
#include <file>
#include
"mydefs.inc"
어셈블러는 상수 식(Constant expressions)을 포함한다. 표현식(Expressions)은 피연산자, 연산자 및 함수로 구성될 수 있다.
Assembler에서 정의된 함수
다음 피연산자(Operands)를 사용할 수 있다.
어셈블러는 아래에 설명된 여러 연산자를 지원한다.