2_Assembly_1_rev_Oct_2014x

Download Report

Transcript 2_Assembly_1_rev_Oct_2014x

Introduction to Assembly
language
1
USING THE AVR MICROPROCESSOR
M. Neil - Microprocessor Course
Outline
2
 Introduction to Assembly Code
 The AVR Microprocessor
 Binary/Hex Numbers
 Breaking down an example microprocessor program
 AVR instructions overview
 Compiling and downloading assembly code
 Running and debugging assembly code
M. Neil - Microprocessor Course
A really simple program
3
 Some variables (i,j)
 Set variables to initial
values
 A loop




Check a condition to see if
we are finished
Do some arithmetic
Output some information
Increment the loop
counter
M. Neil - Microprocessor Course
int main(void)
{
char i;
char j;
i=0;
j=0;
while (i<10) {
j = j + i;
PORTB = j;
PORTB = i;
i++;
}
return 0;
}
Running a program on a microprocessor
4
 When you want to turn your program into something
which runs on a microprocessor you typically compile the
program
 This creates a program in the “machine language” of the
microprocessor

A limited set of low level instructions which can be executed directly
by the microprocessor
 We can also program in this language using an assembler
 We can have a look at the assembly language the c
compiler generates for our simple program to
understand how this works
M. Neil - Microprocessor Course
Translating our program into assembly language
int main(void)
{
char i;
char j;
i=0;
j=0;
while (i<10) {
j = j + i;
PORTB =
j;
PORTB =
i;
i++;
}
return 0;
} M. Neil - Microprocessor Course
5
000000be <main>:
be:
80 e0
c0:
90 e0
c2:
98 0f
c4:
92 bb
c6:
82 bb
c8:
8f 5f
ca:
8a 30
cc:
d1 f7
ce:
80 e0
d0:
90 e0
d2:
08 95
Location in
program
memory
(Address)
ldi
ldi
add
out
out
subi
cpi
brne
ldi
ldi
ret
Opcodes –
the
program
code
r24, 0x00
r25, 0x00
r25, r24
0x18, r25
0x18, r24
r24, 0xFF
r24, 0x0A
.-12
r24, 0x00
r25, 0x00
;0
;0
; 18
; 18
; 255
; 10
; 0xc2 <main+0x4>
;0
;0
The Assembly
language equivalent
of the opcodes
AVR Microprocessor architecture
6
Registers
Storage for numbers the
processer will perform
arithmetic on
Program
Memory
Your code goes
here
Input/Output
Interface to the
outside world
M. Neil - Microprocessor Course
Arithmetic Logic Unit
(ALU)
The heart of the
processor which
handles logic/math
Numbers on a microprocessor
7
 We’ve seen that our program is converted into a
series of numbers for execution on the
microprocessor
 Numbers are stored in a microprocessor in memory



They can be moved in an out of registers and memory
Calculations can be done
Numbers can be sent to Output devices and read from Input
devices
 The numbers are stored internally in binary
representations.

We will study precisely how this is done shortly, and even build
some simple memory devices.
M. Neil - Microprocessor Course
Binary/Hexadecimal Numbers
 A “Bit” can be a 0 or 1

The value is set using transistors
in the hardware
 Bits are organized into groups to
represent numbers

4 Bits is a “Nybble”


8 Bits is a “Byte”


Can store numbers 0-15
Can store numbers 0-255
16 Bits is a word

Can store numbers 0-65535
 Hexadecimal is a very handy
representation for binary
numbers


Each 4 bits maps onto a HEX
number
Can quickly convert from HEX to
binary
M. Neil - Microprocessor Course
8
Binary
Hex
Decimal
0000
0
0
0001
1
1
0010
2
2
0011
3
3
0100
4
4
0101
5
5
0110
6
6
0111
7
7
1000
8
8
1001
9
9
1010
A
10
1011
B
11
1100
C
12
1101
D
13
1110
E
14
1111
F
15
Binary Representation
9
• This representation is based on powers of 2. Any
number can be expressed as a string of 0s and 1s
Example: 5 = 1012 = 1* 22 + 0*21 + 1*20
Example: 9 = 10012 = 1* 23 + 0* 22 + 0*21 + 1*20
Exercise: Convert the numbers
19, 38, 58 from decimal to binary.
(use an envelope, a calculator or C program)
M. Neil - Microprocessor Course
Hexadecimal Representation
10
• This representation is based on powers of 16.
Any number can be expressed in terms of:
0,1,2,…,9,A,B,C,D,E,F (0,1,2,…,9,10,11,12,13,14,15)
Example: 256 = 10016 = 1* 162 + 0*161 + 0*160
Example: 1002 = 3EA16 = 3* 162 + 14*161 + 10*160
Exercise: Convert the numbers
1492, 3481, 558 from decimal to hex.
(use calculator or C program)
M. Neil - Microprocessor Course
HEX/Binary Conversion
11
 Converting HEX/Binary to Decimal is a bit painful,
but converting HEX/Binary is trivial
 We often use the notations 0x or $ to represent a
HEX number


Example 0x15AB for the HEX number 15AB
In assember language we see the notation $A9 for the HEX
number A9
Exercise: Convert the numbers
0xDEAD 0xBEEF from Hex to binary.
Now convert them to Decimal
M. Neil - Microprocessor Course
8 Bit Microprocessors
12
 The AVR microprocessor we will be using is an “8
bit” processor
 The operations the processor performs work on 8 bit
numbers



Data is copied from memory into the processors internal
“registers” 8 bits at a time
Operations (addition/subtraction/etc..) can be performed on
the 8 bit registers
We can of course do calculation with bigger numbers, but we
will have to do this as a sequence of operations on 8 bit
numbers

We will see how to do this later – using a “carry” bit
M. Neil - Microprocessor Course
Operations
13
 The processor can perform several operations
 Including “Boolean” algebra
Operation
Register A
Register B
Result
Add A,B
00001111
00000001
00010000
Not A
01010101
OR A,B
00010101
ShiftL A
00001111
00011110
ShiftR A
00001111
00000111
AND A,B
01010101
10101010
00101010
10101010
Exercise: (1) Find NOT(AAA)
(2) Find OR(AAA; 555)
(3) Find AND (AEB123; FFF000)
M. Neil - Microprocessor Course
00111111
00000000
Why is shift important ?
Try SHIFT R(011) SHIFT L(011)
What About Subtraction: Negative Numbers
14
 With 4 bits, you can
represent
0 to +15
 -8 to + 7

 There
are three ways to
represent these negative
numbers
 Sign/Magnitude: Set the top bit to 1
 1’s complement : Take the complement
of the number
 2’s complement : Take the complement
of the number and then add 1
M. Neil - Microprocessor Course
Integer
Sign
Magnitude
1’s
complement
2’s
complement
+7
0111
0111
0111
+6
0110
0110
0110
+5
0101
0101
0101
+4
0100
0100
0100
+3
0011
0011
0011
+2
0010
0010
0010
+1
0001
0001
0001
0
0000
0000
0000
-1
1001
1110
1111
-2
1010
1101
1110
-3
1011
1100
1101
-4
1100
1011
1100
-5
1101
1010
1011
-6
1110
1001
1010
-7
1111
1000
1001
-8
1000 (-0)
11111
1000
What About Subtraction: Negative Numbers
15
 There is a good reason to use a 2’s complement
representation

Binary addition of a two’s complement numbers “just works”
whether the numbers are positive or negative
3+4
3 + -4
-3 + 4
-3 + -4
0011
0011
1101
1101
+ 0100
+ 1100
+ 0100
+ 1100
= 0111
= 1111
= 0001
= 1001
(7)
(-1)
(+1)
(-7)
Exercise: Fill out the same table using sign magnitude numbers.
Do you understand now why 2’s complement is a useful
representation!
M. Neil - Microprocessor Course
8 Bit representations
16





8 bits can be used for
The numbers 0-255
The numbers -128 to + 127
Part of a longer number
A “Character”



Hence “char” in c
This is a bit out of date
Unicode uses 16 bits
M. Neil - Microprocessor Course
Back to our program
17
000000be <main>:
be: 80 e0
ldi
c0: 90 e0
ldi
c2: 98 0f
add
c4: 92 bb
out
c6: 82 bb
out
c8: 8f 5f
subi
ca: 8a 30
cpi
cc: d1 f7
brne
ce: 80 e0
ldi
d0: 90 e0
ldi
d2: 08 95
ret
r24, 0x00
r25, 0x00
r25, r24
0x18, r25
0x18, r24
r24, 0xFF
r24, 0x0A
.-12
r24, 0x00
r25, 0x00
M. Neil - Microprocessor Course
;0
;0
; 18
; 18
; 255
; 10
; 0xc2 <main+0x4>
;0
;0
• The program is stored in program
memory
• There are 64Kilobytes of program
memory (2^16 bytes)
• Each location stores an 8 bit number
• The location is specified with a 16 bit
Address
• (0x0000-0xFFFF)
Address
Value
00BE
80
00BF
E0
00C0
90
00C1
E0
00C2
98
00C3
0F
00C4
92
18
 AVR Registers – where the
Registers on
the AVR
There are 32 General
purpose registers on the
AVR microprocessor
(R0-R31)
Each of these can hold
an 8 bit number
R26:R27 is also a 16 bit
register called X
R28:R29 is Y
R30:R31 is Z
You can perform
calculations on these
registers very quickly
M. Neil - Microprocessor Course
numerical work is done in a
program
Back to our program: Loading a register
19
000000be <main>:
be: 80 e0
ldi
c0: 90 e0
ldi
c2: 98 0f
add
c4: 92 bb
out
c6: 82 bb
out
c8: 8f 5f
subi
ca: 8a 30
cpi
cc: d1 f7
brne
ce: 80 e0
ldi
d0: 90 e0
ldi
d2: 08 95
ret
r24, 0x00
r25, 0x00
r25, r24
0x18, r25
0x18, r24
r24, 0xFF
r24, 0x0A
.-12
r24, 0x00
r25, 0x00
M. Neil - Microprocessor Course
;0
;0
; 18
; 18
; 255
; 10
; 0xc2 <main+0x4>
;0
;0
• The first instruction is loading a
value of 0x00 into register r24
• This instruction is encoded in the 16
bit opcode stored at address 00BE
• The Assember code is
• ldi r24,0x00
• LoaD Immediate r24 with 0x00
Address
Value
00BE
80
00BF
E0
00C0
90
00C1
E0
00C2
98
00C3
0F
00C4
92
Decoding an Opcode
20
be: 80 e0
ldi r24, 0x00
Words are stored “little endian”
Read into the processor as E080
E080=1110 0000 1000 0000
dddd: 1000=8 -> 16+8 = r24
KKKKKKKK=0x00
Exercise: what is the opcode for
ldi r19, 0x3F
M. Neil - Microprocessor Course
Back to our program: Loading a register
21
000000be <main>:
be: 80 e0
ldi
c0: 90 e0
ldi
c2: 98 0f
add
c4: 92 bb
out
c6: 82 bb
out
c8: 8f 5f
subi
ca: 8a 30
cpi
cc: d1 f7
brne
ce: 80 e0
ldi
d0: 90 e0
ldi
d2: 08 95
ret
r24, 0x00
r25, 0x00
r25, r24
0x18, r25
0x18, r24
r24, 0xFF
r24, 0x0A
.-12
r24, 0x00
r25, 0x00
;0
;0
; 18
; 18
; 255
; 10
; 0xc2 <main+0x4>
;0
;0
The second instruction is loading a
value of 0x00 into register r25
This adds r24 to r25 and stores the
result into register r24
The next instructions output r24
and r25 (we’ll learn where later)
This is subtracting a value of 0xFF
from register r24
This is the compiler cleverly adding 1
This instruction is comparing the
value 0x0A to register r24
If they are not equal, the next instruction will branch back to location 0xC2
that is loop back if they are equal it continues on (and returns from main)
M. Neil - Microprocessor Course
Compare assembly language to c
int main(void)
{
char i;
char j;
i=0;
j=0;
while (i<10) {
j = j + i;
PORTB =
j;
PORTB =
i;
i++;
}
return 0;Course
M. Neil - Microprocessor
22
000000be <main>:
be:
80 e0
c0:
90 e0
c2:
98 0f
c4:
92 bb
c6:
82 bb
c8:
8f 5f
ca:
8a 30
cc:
d1 f7
ce:
80 e0
d0:
90 e0
d2:
08 95
ldi
ldi
add
out
out
subi
cpi
brne
ldi
ldi
ret
r24, 0x00
r25, 0x00
r25, r24
0x18, r25
0x18, r24
r24, 0xFF
r24, 0x0A
.-12
r24, 0x00
r25, 0x00
;0
;0
; 18
; 18
; 255
; 10
; 0xc2 <main+0x4>
;0
;0
• Here the variables are stored in registers r24, r25
• Pretty easy to see how this program is translated
• More complex programs quickly become very
complicated to understand in assembly language
Programming in this course
23
 We will be programming exclusively in assembler
 Allows us to understand precisely what the microprocessor is
going to do and how long it will take to do so



important for time critical applications
Full access to all functions of the microprocessor
With care can make very efficient use of resources

Sometimes very important for small microprocessors
 Programming in assembler requires some discipline
 Code can be very difficult to understand
The code is very low level
 Line by line comments very important

M. Neil - Microprocessor Course
The AVR instruction set
24
 We’ve seen a few sample instructions which cover
most of the basic type of operations
 Arithmetic and Logic instructions

(ADD, SUB, AND, OR, EOR, COM, INC, DEC, …)
 Branch Instructions
 Jump to a different location depending on a test
 Data transfer instructions
 Move data to/from Registers and memory
 Bit setting and testing operations
 Manipulate and test bits in registers
M. Neil - Microprocessor Course
Arithmetic and Logic Instructions
25
 Addition
add r20,r21
R20  r20+r21
 Subtraction
subi r20,$22
R20  r20-$22
sub r20,r21
R20  r20-r21
 Increment
inc r20
R20  r20+1
 Logic
and r20,r24
R20  AND(r20,r24)
Many instructions work either with two
registers, or with “immediate” data values
(stored in the opcode)
M. Neil - Microprocessor Course
Arithmetic and Logic Instructions – The full set
26
M. Neil - Microprocessor Course
The Status Register
27
 Every time the processor
performs an operation it sets bits
in the Status Register (SREG)


Example cpi r01,$77
This register is in the I/O region
 SREG can be examined/set with
the in and out instructions


in r17,SREG
out SREG,r22
 The status bits are also tested by
branch instructions to decide
whether or not to jump to a
different location
M. Neil - Microprocessor Course
Branch Instructions
28
 Branch
breq label1
Branch if equal to location label1
brlo label2
Branch if lower to location label2
If the Branch test fails – the next line of code is executed
If the Branch test is successful, the program jumps to the location specified
 Jump
jmp label3
Jump to label3 – no information about where we jumped from is
saved. This is a one way trip
 Call, Return
rcall mysub
ret
Call subroutine mysub. The program saves information about where it currently is
executing and then jumps to the code at mysub. When the subroutine is finished it
calls ret, which then returns to where the rcall was made.
M. Neil - Microprocessor Course
All Branch Instructions
29
M. Neil - Microprocessor Course
Data Transfer Instructions
30
 Load
ldi r20,$73
R20  $73
ld r20,X
R20  (X)
 Input
in r20,PIND
R20  PIND
 Copy Register
mov r20,r21
R20  r21
 Output
out PORTD,r24
PORTD  r24
There are a few quirks about loading and storing to
memory. We will cover this in detail soon.
M. Neil - Microprocessor Course
Data transfer reference
31
M. Neil - Microprocessor Course
32
The
Atmega128
The microprocessor you
will be using has several
input and output ports
Some of these are
already connected to
switches or LEDs on the
boards we are using
Others will be available
to you to connect to
various devices.
It is time to make some
lights blink!
M. Neil - Microprocessor Course
Setting up the Input/Output ports:
33
• For the ports we are
using we set the Data
Direction Register
(DDR) which has a bit
for each bit of I/O (1
for input, 0 for
output)
• We can then set the
initial value of the
data bits at the I/O
port
• PortB is connected to
LEDs on our board
• PortD is connected to
the blue switches
M. Neil - Microprocessor Course
; ******* Port B Setup Code ****
ldi r16, $FF
; all bits out
out DDRB , r16 ; Port B Direction Register
ldi r16, $FF
; Init value
out PORTB, r16 ; Port B value
; ******* Port D Setup Code ****
ldi r16, $00
; all bits in
out DDRD, r16 ; Port D Direction Register
ldi r16, $FF
; Init value
out PORTD, r16 ; Port D value
The ATmega128 Microprocessor
34
 In this course you will be using the
ATmega128 processor mounted on an
ATMEL programming board (STK300)
M. Neil - Microprocessor Course
The ATMEL BOARD
35
 Connecting the board with your PC
M. Neil - Microprocessor Course
Where the I/O ports are connected
36
PORTD Switches
PORTB LEDs
M. Neil - Microprocessor Course
Setting up a code directory
37
 Create a directory where you will store your code
 Download the file Simple.ASM into your code
directory

from the course web page (Lecture 2b):
 DO NOT DOWNLOAD m128def.inc
M. Neil - Microprocessor Course
Getting Started with STUDIO 4:
38
Go to Start  Programs  ATMEL AVR Tools
 AVR Studio 4
Select New
Project
M. Neil - Microprocessor Course
Getting Started with STUDIO 4:
39
You should now see the window:
Do not create new file
Create
new
folder
Pick a name for your
project
Pick Atmel AVR Assembler
At the
M. Neil - Microprocessor Course
Click this and navigate
to your code directory
Getting Started with STUDIO 4:
40
You should now see the window:
Select ATmega 128
Select AVR Simulator
At the
end
M. Neil - Microprocessor Course
Entering files in STUDIO 4 (I):
41
(2) Navigate and
find SIMPLE.ASM
(1) Right click here
and select to ‘Add
Files to Project’
Chose Open to load
the file
M. Neil - Microprocessor Course
Entering files in STUDIO 4 (II):
Here is list of
files attached to
project
Change the ‘editing
window’ by double
clicking on a file icon
M. Neil - Microprocessor Course
42
This window is for
editing one of the
files
Select the output file format :
Change the format
of the output file to
Intel Hex format
43
Click on Project/
Assembler Options
M. Neil - Microprocessor Course
Running your Program in Studio 4 :
44
M. Neil - Microprocessor Course
Click on
Build/ Build and run
Running your Program in Studio 4:
The Build
process
generates
some new
files
45
Program is halted
at this instruction
Green means ok;
Otherwise click
on red and debug
M. Neil - Microprocessor Course
Open monitoring Windows:
View/ Toolbars/ I/O
M. Neil - Microprocessor Course
46
Open monitoring Windows:
Expand views as
required
Input
Output
M. Neil - Microprocessor Course
47
Adjust screen display
using Window/…
Watch your Program Running:
48
Start here:
Everything
zeroed
and
Clickagain
this
once
Step through the
whole program
and make sure you
understand what is
happening
M. Neil - Microprocessor Course
Use
Use
this
to
stop
Usethis
thisto
toreset
run
continuously
continuously
with
without
active display
display
Exercising the ATmega128 commands:
49
 Download the program simple.asm, assemble it
and run it in the simulator
 Step through the program and make sure you
understand what is happening after each
instruction
 Try changing the number of times the loop is
executed and make sure you understand the
outputs on PORTB
 Now we will download the program to the
development board
M. Neil - Microprocessor Course
Downloading with AVRISP
50
Select from Start : AVRISP
Make sure Device Atmega128 is selected
M. Neil - Microprocessor Course
Erase the device
51
M. Neil - Microprocessor Course
Select the file to load
52
Select Load/Flash…
M. Neil - Microprocessor Course
Chose your .hex file to download
53
Tell AVRISP which .hex file to
download to the Atmega128
M. Neil - Microprocessor Course
Now download the program into the Flash
54
M. Neil - Microprocessor Course
Select Program/Flash -- This writes
the machine code to be downloaded
into the ATmega128 chip
Running your program
55
Select Run – If all goes
well your program should
now be executing
M. Neil - Microprocessor Course
Programs to write I:
56
 Download the program simple.asm, assemble it
download it to the board and run it.


What do you see on the LEDs?
Do you know why (note that a dark LED  1)?

change the code so that output on the LEDs has a lit LED for a 1
(think about using the neg instruction)
 Modify the program so that it changes the number of
times the loop is run depending on which switch
button is pushed


Use the instruction in Rxx,PIND to get the state of the buttons
Make sure that the LED output makes sense when you push
the different buttons
M. Neil - Microprocessor Course
Programs to write :
57
 Make a counter from 0 – FF, output the values to
PORTB and look with your scope probe at the LSB
(PB0). How long does it take to make an addition?
Why does the B0 bit toggle with a frequency that is
twice that of B1? (check this using two scope
probes; one on B0 and another on B1)
 In the documentation you will find how many clock
counts are required to perform an instruction in your
program. The ATmega128 has an 8 MHz clock.
Predict the time it takes to do an addition and
compare with your measurement using the scope.
M. Neil - Microprocessor Course