Mpasm Directive
Mpasm Directive
PIC Microcontrollers
Development systems
Contact us
on-line FREE!
Previous page
Table of contents
CHAPTER 4
Assembly Language Programming
Introduction
An example writting program
Control directives
4.1 define
4.2 include
4.3 constant
4.4 variable
4.5 set
4.6 equ
4.7 org
4.8 end
Conditional instructions
4.9 if
4.10 else
4.11 endif
Next Page
4.12 while
4.13 endw
4.14 ifdef
4.15 ifndef
Data directives
4.16 cblock
4.17 endc
4.18 db
4.19 de
4.20 dt
Configurating a directive
4.21 _CONFIG
4.22 Processor
Assembler arithmetic operators
Files created as a result of program translation
Macros
Introduction
The ability to communicate is of great importance in any field. However, it is only possible if both communication partners know
the same language, i.e follow the same rules during communication. Using these principles as a starting point, we can also define
communication that occurs between microcontrollers and man . Language that microcontroller and man use to communicate is
called "assembly language". The title itself has no deeper meaning, and is analogue to names of other languages , ex. English or
French. More precisely, "assembly language" is just a passing solution. Programs written in assembly language must be translated
into a "language of zeros and ones" in order for a microcontroller to understand it. "Assembly language" and "assembler" are two
different notions. The first represents a set of rules used in writing a program for a microcontroller, and the other is a program on the
personal computer which translates assembly language into a language of zeros and ones. A program that is translated into "zeros"
and "ones" is also called "machine language".
Assembly language
Basic elements of assembly language are:
Labels
Instructions
Operands
Directives
Comments
Labels
A Label is a textual designation (generally an easy-to-read word) for a line in a program, or section of a program where the micro
can jump to - or even the beginning of set of lines of a program. It can also be used to execute program branching (such as Goto
.......) and the program can even have a condition that must be met for the Goto instruction to be executed. It is important for a label
to start with a letter of the alphabet or with an underline "_". The length of the label can be up to 32 characters. It is also important
that a label starts in the first clumn.
Instructions
Instructions are already defined by the use of a specific microcontroller, so it only remains for us to follow the instructions for their
use in assembly language. The way we write an instruction is also called instruction "syntax". In the following example, we can
recognize a mistake in writing because instructions movlp and gotto do not exist for the PIC16F84 microcontroller.
Operands
Operands are the instruction elements for the instruction is being executed. They are usually registers or variables or constants.
Comments
Comment is a series of words that a programmer writes to make the program more clear and legible. It is placed after an instruction,
and must start with a semicolon ";".
Directives
A directive is similar to an instruction, but unlike an instruction it is independent on the microcontroller model, and represents a
characteristic of the assembly language itself. Directives are usually given purposeful meanings via variables or registers. For
example, LEVEL can be a designation for a variable in RAM memory at address 0Dh. In this way, the variable at that address can
be accessed via LEVEL designation. This is far easier for a programmer to understand than for him to try to remember address 0Dh
contains information about LEVEL.
Since this data isnt important for the assembly translator, it is written as comments. It should be noted that a comment always
begins with a semicolon and it can be placed in a new row or it can follow an instruction.
After the opening comment has been written, the directive must be included. This is shown in the example above.
In order to function properly, we must define several microcontroller parameters such as: - type of oscillator,
- whether watchdog timer is turned on, and
- whether internal reset circuit is enabled.
All this is defined by the following directive:
_CONFIG _CP_OFF&_WDT_OFF&PWRTE_ON&XT_OSC
When all the needed elements have been defined, we can start writing a program.
First, it is necessary to determine an address from which the microcontroller starts, following a power supply start-up. This is (org
0x00).
The address from which the program starts if an interrupt occurs is (org 0x04).
Since this is a simple program, it will be enough to direct the microcontroller to the beginning of a program with a "goto Main"
instruction.
The instructions found in the Main select memory bank1 (BANK1) in order to access TRISB register, so that port B can be
declared as an output (movlw 0x00, movwf TRISB).
The next step is to select memory bank 0 and place status of logic one on port B (movlw 0xFF, movwf PORTB), and thus the main
program is finished.
We need to make another loop where the micro will be held so it doesnt "wander" if an error occurs. For that purpose, one infinite
loop is made where the micro is retained while power is connected. The necessary "end" at the end of each program informs the
assembly translator that no more instructions are in the program.
Control directives
4.1 #DEFINE
Syntax:
#define<text> [<another text>]
Description:
Each time <text> appears in the program , it will be exchanged for <another text >.
Example:
#define turned_on 1
#define turned_off 0
Similar directives: #UNDEFINE, IFDEF,IFNDEF
4.2 INCLUDE
Syntax:
#include <file_name>
#include "file_name"
Description:
An application of this directive has the effect as though the entire file was copied to a place where the "include" directive was found.
If the file name is in the square brackets, we are dealing with a system file, and if it is inside quotation marks, we are dealing with a
user file. The directive "include" contributes to a better layout of the main program.
Example:
#include <regs.h>
#include "subprog.asm"
4.3 CONSTANT
Syntax:
Constant <name>=<value>
Description:
Each time that <name> appears in program, it will be replaced with <value>.
Example:
Constant MAXIMUM=100
Constant Length=30
Similar directives: SET, VARIABLE
4.4 VARIABLE
Syntax:
Variable<name>=<value>
Description:
By using this directive, textual designation changes with particular value.
It differs from CONSTANT directive in that after applying the directive, the value of textual designation can be changed.
Example:
variable level=20
variable time=13
Similar directives: SET, CONSTANT
4.5 SET
Syntax:
<name_variable>set<value>
Description:
To the variable <name_variable> is added expression <value>. SET directive is similar to EQU, but with SET directive name of the
variable can be redefined following a definition.
Example:
level set 0
length set 12
level set 45
Similar directives: EQU, VARIABLE
4.6 EQU
Syntax:
<name_constant> equ <value>
Description:
To the name of a constant <name_constant> is added value <value>
Example:
five equ 5
six equ 6
seven equ 7
Similar instructions: SET
4.7 ORG
Syntax:
<label>org<value>
Description:
This is the most frequently used directive. With the help of this directive we define where some part of a program will be start in the
program memory.
Example:
Start org 000
movlw 0xFF
movwf PORTB
The first two instructions following the first org directive are stored from address 00, and the other two from address 10.
4.8 END
End of program
Syntax:
end
Description:
At the end of each program it is necessary to place end directive so that assembly translator would know that there are no more
instructions in the program.
Example:
.
.
movlw 0xFF
movwf PORTB
end
Conditional instructions
4.9 IF
Syntax:
if<conditional_term>
Description:
If condition in <conditional_term> was met, part of the program which follows IF directive would be executed. And if it wasnt,
then the part following ELSE or ENDIF directive would be executed.
Example:
if level=100
goto FILL
else
goto DISCHARGE
endif
Similar directives: #ELSE, ENDIF
4.10 ELSE
Syntax:
Else
Description:
Used with IF directive as an alternative if conditional term is incorrect.
Example:
If time< 50
goto SPEED UP
else goto SLOW DOWN
endif
Similar instructions: ENDIF, IF
4.11 ENDIF
Syntax:
endif
Description:
Directive is written at the end of a conditional block to inform the assembly translator that it is the end of the conditional block
Example:
If level=100
goto LOADS
else
goto UNLOADS
endif
Similar directives: ELSE, IF
4.12 WHILE
Syntax:
while<condition>
.
endw
Description:
Program lines between WHILE and ENDW would be executed as long as condition was met. If a condition stopped being valid,
program would continue executing instructions following ENDW line. Number of instructions between WHILE and ENDW can be
100 at the most, and number of executions 256.
Example:
While i<10
i=i+1
endw
4.13 ENDW
Syntax:
endw
Description:
Instruction is written at the end of the conditional WHILE block, so that assembly translator would know that it is the end of the
conditional block
Example:
while i<10
i=i+1
endw
Similar directives: WHILE
4.14 IFDEF
Syntax:
ifdef<designation>
Description:
If designation <designation> was previously defined (most commonly by #DEFINE instruction), instructions which follow would be
executed until ELSE or ENDIF directives are not would be reached.
Example:
#define test
.
ifdef test ;how the test was defined
......; instructions from these lines would execute
endif
Similar directives: #DEFINE, ELSE, ENDIF, IFNDEF, #UNDEFINE
4.15 IFNDEF
Syntax:
ifndef<designation>
Description:
If designation <designation> was not previously defined, or if its definition was erased with directive #UNDEFINE, instructions
which follow would be executed until ELSE or ENDIF directives would be reached.
Example:
#define test
..........
#undefine test
..........
ifndef test ;how the test was undefined
..... .; instructions from these lines would execute
endif
Data Directives
4.16 CBLOCK
Syntax:
Cblock [<term>]
<label>[:<increment>], <label>[:<increment>]......
endc
Description:
Directive is used to give values to named constants. Each following term receives a value greater by one than its precursor. If
<increment> parameter is also given, then value given in <increment> parameter is added to the following constant.
Value of <term> parameter is the starting value. If it is not given, it is considered to be zero.
Example:
Cblock 0x02
First, second, third ;first=0x02, second=0x03, third=0x04
endc
cblock 0x02
first : 4, second : 2, third ;first=0x06, second=0x08, third=0x09
endc
Similar directives: ENDC
4.17 ENDC
Syntax:
endc
Description:
Directive was used at the end of a definition of a block of constants so assembly translator could know that there are no more
constants.
4.18 DB
Syntax:
[<label>]db <term> [, <term>,.....,<term>]
Description:
Directive reserves a byte in program memory. When there are more terms which need to be assigned a byte each, they will be
assigned one after another.
Example:
db t, 00f, e, s, 012
Similar instructions: DE, DT
4.19 DE
Syntax:
[<term>] de <term> [, <term>,....., <term>]
Description:
Directive is used for defining EEPROM memory byte. Even though it was first intended only for EEPROM memory, it could be
used for any other location in any memory.
Example:
org H2100
de "Version 1.0" , 0
Similar instructions: DB, DT
4.20 DT
Syntax:
[<label>] dt <term> [, <term>,........., <term>]
Description:
Directive generates RETLW series of instructions, one instruction per each term.
Example:
dt "Message", 0
dt first, second, third
Similar directives: DB, DE
Configurational directives
4.21 _CONFIG
Syntax:
_ _config<term> or_ _config<address>,<term>
Description:
Oscillator, watchdog timer application and internal reset circuit are defined. Before using this directive, the processor must be
defined using PROCESSOR directive.
Example:
_CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC
Similar directives: _IDLOCS, PROCESSOR
4.22 PROCESSOR
Syntax:
Processor <microcontroller_type>
Description:
Instruction sets the type of microcontroller where programming is done.
Example:
processor 16F84
At the end of the "list" file there is a table of symbols used in a program. Useful element of list file is a graph of memory
utilization. At the very end, there is an error statistic as well as the amount of remaining program memory.
Macros
Macros are a very useful element in assembly language. They could briefly be described as "user defined group of instructions
which will enter assembler program where macro was called". It is possible to write a program even without using macros. But with
their use written program is much more readable, especially if more programmers are working on the same program together.
Macros have the same purpose as functions of higher program languages.
The above example shows a macro whose purpose is to place on port B the ARG1 argument that was defined while macro was
called. Its use in the program would be limited to writing one line: ON_PORTB 0xFF , and thus we would place value 0xFF on
PORTB. In order to use a macro in the program, it is necessary to include macro file in the main program with instruction include
"macro_name.inc". Contents of a macro is automatically copied onto a place where this instruction was written. This can be best
seen in a previous list file where file with macros "bank.inc" was copied below the line #include"bank.inc"
Previous page
Table of contents
Copyright 2003. mikroElektronika. All Rights Reserved. For any comments contact webmaster.
Next page