Presentation is loading. Please wait.

Presentation is loading. Please wait.

Introduction to Assembly language

Similar presentations


Presentation on theme: "Introduction to Assembly language"— Presentation transcript:

1 Introduction to Assembly language
Using the AVR microprocessor M. Neil - Microprocessor Course

2 Outline 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

3 A really simple program
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 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

4 Running a program on a microprocessor
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

5 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; 000000be <main>: be: 80 e ldi r24, 0x00 ; 0 c0: 90 e ldi r25, 0x00 ; 0 c2: 98 0f add r25, r24 c4: 92 bb out 0x18, r25 ; 18 c6: 82 bb out 0x18, r24 ; 18 c8: 8f 5f subi r24, 0xFF ; 255 ca: 8a cpi r24, 0x0A ; 10 cc: d1 f brne ; 0xc2 <main+0x4> ce: 80 e ldi r24, 0x00 ; 0 d0: 90 e ldi r25, 0x00 ; 0 d2: ret Location in program memory (Address) Opcodes – the program code The Assembly language equivalent of the opcodes M. Neil - Microprocessor Course

6 AVR Microprocessor architecture
Program Memory Your code goes here Registers Storage for numbers the processer will perform arithmetic on Arithmetic Logic Unit (ALU) The heart of the processor which handles logic/math Input/Output Interface to the outside world M. Neil - Microprocessor Course

7 Numbers on a microprocessor
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

8 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” Can store numbers 0-15 8 Bits is a “Byte” Can store numbers 0-255 16 Bits is a word Can store numbers Hexadecimal is a very handy representation for binary numbers Each 4 bits maps onto a HEX number Can quickly convert from HEX to binary Binary Hex Decimal 0000 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 10 1011 B 11 1100 C 12 1101 D 13 1110 E 14 1111 F 15 M. Neil - Microprocessor Course

9 Binary Representation
This representation is based on powers of 2. Any number can be expressed as a string of 0s and 1s Example: 5 = 1012 = 1* *21 + 1*20 Example: 9 = = 1* * *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

10 Hexadecimal Representation
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 = = 1* * *160 Example: 1002 = 3EA16 = 3* * *160 Exercise: Convert the numbers 1492, 3481, 558 from decimal to hex. (use calculator or C program) M. Neil - Microprocessor Course

11 HEX/Binary Conversion
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

12 8 Bit Microprocessors 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

13 Operations The processor can perform several operations
Including “Boolean” algebra Operation Register A Register B Result Add A,B Not A OR A,B ShiftL A ShiftR A AND A,B Exercise: (1) Find NOT(AAA) (2) Find OR(AAA; 555) (3) Find AND (AEB123; FFF000) Why is shift important ? Try SHIFT R(011) SHIFT L(011) M. Neil - Microprocessor Course

14 What About Subtraction: Negative Numbers
With 4 bits, you can represent 0 to +15 -8 to + 7 There are three ways to represent these negative numbers Integer Sign Magnitude 1’s complement 2’s complement +7 0111 +6 0110 +5 0101 +4 0100 +3 0011 +2 0010 +1 0001 0000 -1 1001 1110 1111 -2 1010 1101 -3 1011 1100 -4 -5 -6 -7 1000 -8 1000 (-0) 11111 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

15 What About Subtraction: Negative Numbers
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 0011 1101 + 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

16 8 Bit representations 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

17 Back to our program 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) 000000be <main>: be: 80 e ldi r24, 0x00 ; 0 c0: 90 e ldi r25, 0x00 ; 0 c2: 98 0f add r25, r24 c4: 92 bb out 0x18, r25 ; 18 c6: 82 bb out 0x18, r24 ; 18 c8: 8f 5f subi r24, 0xFF ; 255 ca: 8a cpi r24, 0x0A ; 10 cc: d1 f brne ; 0xc2 <main+0x4> ce: 80 e ldi r24, 0x00 ; 0 d0: 90 e ldi r25, 0x00 ; 0 d2: ret Address Value 00BE 80 00BF E0 00C0 90 00C1 00C2 98 00C3 0F 00C4 92 M. Neil - Microprocessor Course

18 AVR Registers – where the numerical work is done in a program
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

19 Back to our program: Loading a register
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 000000be <main>: be: 80 e ldi r24, 0x00 ; 0 c0: 90 e ldi r25, 0x00 ; 0 c2: 98 0f add r25, r24 c4: 92 bb out 0x18, r25 ; 18 c6: 82 bb out 0x18, r24 ; 18 c8: 8f 5f subi r24, 0xFF ; 255 ca: 8a cpi r24, 0x0A ; 10 cc: d1 f brne ; 0xc2 <main+0x4> ce: 80 e ldi r24, 0x00 ; 0 d0: 90 e ldi r25, 0x00 ; 0 d2: ret Address Value 00BE 80 00BF E0 00C0 90 00C1 00C2 98 00C3 0F 00C4 92 M. Neil - Microprocessor Course

20 Decoding an Opcode Words are stored “little endian”
Read into the processor as E080 E080= dddd: 1000=8 -> 16+8 = r24 KKKKKKKK=0x00 be: 80 e ldi r24, 0x00 Exercise: what is the opcode for ldi r19, 0x3F M. Neil - Microprocessor Course

21 Back to our program: Loading a register
The second instruction is loading a value of 0x00 into register r25 000000be <main>: be: 80 e ldi r24, 0x00 ; 0 c0: 90 e ldi r25, 0x00 ; 0 c2: 98 0f add r25, r24 c4: 92 bb out 0x18, r25 ; 18 c6: 82 bb out 0x18, r24 ; 18 c8: 8f 5f subi r24, 0xFF ; 255 ca: 8a cpi r24, 0x0A ; 10 cc: d1 f brne ; 0xc2 <main+0x4> ce: 80 e ldi r24, 0x00 ; 0 d0: 90 e ldi r25, 0x00 ; 0 d2: ret 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

22 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; 000000be <main>: be: 80 e ldi r24, 0x00 ; 0 c0: 90 e ldi r25, 0x00 ; 0 c2: 98 0f add r25, r24 c4: 92 bb out 0x18, r25 ; 18 c6: 82 bb out 0x18, r24 ; 18 c8: 8f 5f subi r24, 0xFF ; 255 ca: 8a cpi r24, 0x0A ; 10 cc: d1 f brne ; 0xc2 <main+0x4> ce: 80 e ldi r24, 0x00 ; 0 d0: 90 e ldi r25, 0x00 ; 0 d2: ret 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 M. Neil - Microprocessor Course

23 Programming in this course
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

24 The AVR instruction set
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

25 Arithmetic and Logic Instructions
Addition add r20,r21 R20  r20+r21 Increment inc r20 R20  r20+1 Subtraction subi r20,$22 R20  r20-$22 sub r20,r21 R20  r20-r21 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

26 Arithmetic and Logic Instructions – The full set
M. Neil - Microprocessor Course

27 The Status Register 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

28 Branch Instructions Jump Branch Call, Return jmp label3
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

29 All Branch Instructions
M. Neil - Microprocessor Course

30 Data Transfer Instructions
Load ldi r20,$73 R20  $73 ld r20,X R20  (X) Copy Register mov r20,r21 R20  r21 Input in r20,PIND R20  PIND 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

31 Data transfer reference
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

33 Setting up the Input/Output ports:
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 ; ******* 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 M. Neil - Microprocessor Course

34 The ATmega128 Microprocessor
In this course you will be using the ATmega128 processor mounted on an ATMEL programming board (STK300) M. Neil - Microprocessor Course

35 The ATMEL BOARD Connecting the board with your PC
M. Neil - Microprocessor Course

36 Where the I/O ports are connected
PORTD Switches PORTB LEDs M. Neil - Microprocessor Course

37 Setting up a code directory
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

38 Getting Started with STUDIO 4:
Go to Start  Programs  ATMEL AVR Tools  AVR Studio 4 Select New Project M. Neil - Microprocessor Course

39 Getting Started with STUDIO 4:
Create new folder Do not create new file You should now see the window: Pick a name for your project Pick Atmel AVR Assembler At the end Click this and navigate to your code directory M. Neil - Microprocessor Course

40 Getting Started with STUDIO 4:
You should now see the window: Select ATmega 128 Select AVR Simulator At the end M. Neil - Microprocessor Course

41 Entering files in STUDIO 4 (I):
(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

42 Entering files in STUDIO 4 (II):
Here is list of files attached to project This window is for editing one of the files Change the ‘editing window’ by double clicking on a file icon M. Neil - Microprocessor Course

43 Select the output file format :
Change the format of the output file to Intel Hex format Click on Project/ Assembler Options M. Neil - Microprocessor Course

44 Running your Program in Studio 4 :
Click on Build/ Build and run M. Neil - Microprocessor Course

45 Running your Program in Studio 4:
The Build process generates some new files Program is halted at this instruction Green means ok; Otherwise click on red and debug M. Neil - Microprocessor Course

46 Open monitoring Windows:
View/ Toolbars/ I/O M. Neil - Microprocessor Course

47 Open monitoring Windows:
Expand views as required Adjust screen display using Window/… Input Output M. Neil - Microprocessor Course

48 Watch your Program Running:
Start here: Everything zeroed Use this to reset Use this to run continuously with active display Use this to stop Use this to run continuously without display Click this once and again Step through the whole program and make sure you understand what is happening M. Neil - Microprocessor Course

49 Exercising the ATmega128 commands:
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

50 Downloading with AVRISP
Select from Start : AVRISP Make sure Device Atmega128 is selected M. Neil - Microprocessor Course

51 Erase the device M. Neil - Microprocessor Course

52 Select the file to load Select Load/Flash…
M. Neil - Microprocessor Course

53 Chose your .hex file to download
Tell AVRISP which .hex file to download to the Atmega128 M. Neil - Microprocessor Course

54 Now download the program into the Flash
Select Program/Flash -- This writes the machine code to be downloaded into the ATmega128 chip M. Neil - Microprocessor Course

55 Running your program Select Run – If all goes well your program should now be executing M. Neil - Microprocessor Course

56 Programs to write I: 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

57 Programs to write : 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


Download ppt "Introduction to Assembly language"

Similar presentations


Ads by Google