Android / iOS


MSP430 Assembler

Posted: June 14, 2010
Updated: July 21, 2012

Texas Instruments Launchpad

The Texas Instruments Launchpad running code assembled with naken430asm and uploaded with MSPDebug. On the screen is the hex file disassembled. This program was assembled and tested using 100% open-source software on Linux.

NOTE:naken430asm has been deprecated for the newer and more powerful naken_asm project.


Helping Out
Assembler Syntax


This is an open-sourced assembler / disassembler / simulator for the MSP430 series of microcontrollers from Texas Instruments. The goal of this project is to have a completely cross-platform assembler with the exe (naken430asm) under 100k supporting both the 16 bit MSP430 and 20 bit MSP430X instruction sets and to have a cross-platform disassembly utility (naken430util) along with it to help with debugging and a bit of profiling. The naken430util, when disassembling, shows how many CPU cycles each instruction will take (MSP430 only) and I have built in simulation to help show how the binary code will flow on the chip and how many cycles it will take to execute. I also wanted to add the ability to program and debug the chips from naken430util, but I may just leave that for the MSPDebug project.

I could really use help right now with people testing out the 2012 version of the assembler and report bugs to me so I can stabilize the new version of naken430asm. Also, if anyone would like to to buy me this MSP430 ( watch (or convince them to send me one :) so I could test naken430asm on it, I would be grateful also :).

NOTE: All new developement is being done on the naken_asm project.

Download (October 30, 2011)
naken430asm stable release
naken430asm-2011-10-30.tar.gz (Source Code)
naken430asm-2011-10-30-macosx10.6-x86_64.tar.gz (MacOSX 10.6) (Windows XP/Vista/7)

Alexander Zhevak is working on some include files for naken430asm. They can be downloaded from:

git clone git:// - I've been working on an ethernet project with this Microchip ENC28J60 chip. I made an include file for it if anyone wants it.


launchpad_blink.asm - Make 2 LED's blink
spi.asm - Write 16 bits out of SPI to a MCP4921 DAC
ds1305_rtc.asm - Read time from a DS1305 real time clock chip.
ds18b20.asm - Read temperature from a DS18B20 temperature sensor.
guitar_proc.asm - Example of taking input on the A/D, changing the sound sample, and throwing it out a DAC.
clock_thermometer.asm - Talking alarm clock thermometer.
msp430_sirc.asm - Reading SIRC data from a Sony remote control.
uart.asm - UART example for msp430g2553.
Bluetooth Thermometer - Bluetooth module hooked up to an msp430g2553.
Syma S107 No Fly Zone - IR Jammer for Syma S107 Helicopters.
Brushless Motor - Example of spinning a brushless motor with an MSP430.
LCD - Olimex MSP430-4619LCD.
Walking Robot - Vinod's 2 servo walking robot using the TI Launchpad.
Math Routines - Joe Davisson made some math funcions for the msp430.


August 5, 2012: Moved new development to naken_asm

July 8, 2012: On July 4, I added ARM disassembly to this project and started up on ARM assembly. Today I have most dsPIC instructions assembling and disassembling but because dsPIC has 12 bit memory, it's useless right now. My goal for the weekend was to have my first program working on a chip, but I have to fix this issue first. I'm also trying to come up with a new name for the project since the new version will assemble embedded CPU's other than MSP430. MSP430 is still my favorite btw, just thought it would be cool to add more CPU's.

May 27, 2012: I assembled my first program today using MSP430X 20 bit extensions and it functions on this Olimex MSP430-4619LCD board. I added .binfile as a directive to insert binary files (in my case images to display on the LCD display). It ends up that using .binfile is quite a lot faster than creating .inc files with .db parts.

May 16, 2012: I'm code complete on the MSP430X instruction set. I need to test it a bit before releasing. Next I have to add the memory paging featuer so it can access more than 64k without wasting memory. Last two things is to update hexfile and elf output to support it. Probably I'll also have to fix problems in the disassembler with MSP430X.

April 29, 2012: Today I rewrote the whole way memory works in naken430asm. Originally I just allocated buffers the size of the addressable memory of an MSP430 device. Now it's all abstracted out into a structure and set of functions. The ultimate plan is to allcoate memory in 8k pages only when a write happens at an address in that area. I bought this Olimex MSP430-4619LCD board so I can test MSP430X instructions on it and started working on an file for it.

April 24, 2012: A couple months ago I rewrote the memory management for the macros and address lookup table. I had been slowly trying to retrofit MSP430X instructions into the msp430_asm.c file, but it was really messy. So on Sunday I rewrote msp430_asm.c as msp430x_asm.c. The code is 10000 times cleaner and so far it's working so I think I'm going to post a preview of it later in the week so people can help me test it. I plan on adding MSP430X instructions into it after that and I started implenting another CPU. Also, I plan to change the way it assembles into RAM. Currently it just allocates 64k of memory and assembles code wherever in that memory chunk. I think instead I will allocate 8k pages and hook them together. Hopefully this brings me closer to releasing an updated stable version soon :).

January 16, 2012: Just wanted to post a message so this project doesn't look abandoned. The assembler appears to be quite stable. I've been using it for a while and haven't had a complaint in a while. Currently I've been working (slowly) on MSP430X support which is... eh... not as clean of an instruction set as straight 16 bit MSP430 is, so this hasn't been very fun.

So I got an email from Gregory Davill with some tips on include files with naken430asm. He writes:

The standard headers include a "#include <iomacros.h>" which defines
how the registers are defined. By replacing that line with these six
macros your assembler works perfectly with the new header.
#define sfrb(x,y) x equ y
#define sfrw(x,y) x equ y
#define sfra(x,y) x equ y

#define const_sfrb(x,y) sfrb(x,y)
#define const_sfrw(x,y) sfrw(x,y)
#define const_sfra(x,y) sfra(x,y)

October 24, 2011: Fixed issue reading in ELF files with naken430util (the file was being read in correctly, but the end address wasn't properly marked). Added an include file for msp430g2553 from Peter Johansson and an include file for msp430x14x from Alex B.

September 21, 2011: Fixed issue with macros not unrolling in the lst files. Fixed issue with comments between .macro / .endm. Changed .db and .dw so it can have expressions instead of constants and labels.

September 19, 2011: Changed db so it doesn't null terminate strings. Added .ascii and .asciiz for strings and null terminated strings.

September 13, 2011: Some bug fixes: A typo in the assembler / disassembler mixed up adc and addc, the CG alias was missing from the assembler, and .w and .b couldn't be uppercase. ELF now splits up data and text sections (although there needs to be more work on that I think).

September 5, 2011: I began adding support for ELF file output (and input into naken430util). It currently does something similar to what msp430-gcc does in that it dumps the binary block into a single .text section. This to me is kind of gross, so I'm going end up seeing what it takes to separate the binary block into multiple .text and .data sections (depending on if what is written in that location is a .db/.dw or instruction). I have a symbol table but it only has labels right now. I'm hoping to add other things later. I also plan on adding the DWARF support for debugging. The ELF option is configurable at compile time and since it currently adds about 4k of code to naken430asm. I believe some people are actually using naken430asm on embedded devices so I decided to make this optional. If ELF is not needed then a ./configure --disable-elf can remove the code. I still need to add a way to configure the ELF for which MSP430 device family the elf file is for. To see what symbols and sections are created in these ELF files, I have a program called magic_elf which can print out headers and such.

I also changed the behavior of .db so that it won't warn and pad if the datasize is not 2 byte divisible. Instead it will warn and pad if an instruction or .dw falls on an unaligned boundary.

Glen Worstell has contributed a makeInc.lua script that can take include files from TI's Code Composer and put it in a format the naken430asm can read. I included this script in the scripts dir of naken430asm.


naken430msp is distributed under the GPL license.

How To Help Out

Well, I'm not really looking for any patches right now since this is in heavily development and I prefer to do my own work, but the following would be really nice:

  • Include files (please give yourself credit at the top of the .inc file)
  • Bug reports
  • Suggestions
  • Emails of encouragement
  • The TI JTAG protocol specification (Anyone at TI reading reading this??)
  • Test boards and JTAG's
  • Non-poisoned candy (speciellt nånting från sverige... mmm svenska godis)
  • A nice looking girl
  • Money :)


  • ELF: Add support for multiple .text and .data sections
  • ELF: Add support DWARF debug sections
  • ELF: Add support for equ symbols
  • Add support for MSP430X instructions
  • naken430util: Debugger (with JTAG)
  • naken430util: Upload/download firmware (with JTAG)

Assembling, Disassembling, Simulating

A program can be assembled from the command line with a simple:

naken430asm -d launchpad_blink.asm

The -d option will create an .ndbg file which helps naken430util when using the -list option. It can be left out. The -o option can be used to name the output file something other than out.hex. To disassemble the code, simply type:

./naken430util out.hex
for interactive mode or:
./naken430util -disasm out.hex
to disassemble the out.hex file or
./naken430util -list out.hex
to disassemble the out.hex program and print the source code to the right of it using the .ndbg file.

The simulator allows you to show how your program will run. It gives a view of all the registers and how many CPU cycles have passed, along with the current instruction that executed and the next few in memory. To test the simulation, after assembling launchpad.asm type:

./naken430util out.hex
speed 1

This will load the out.hex file and set the CPU speed to 1Hz. The run command of course will start the simulation. To pause it just press Ctrl-C. To run in single step mode:

speed 0

One instruction is executed and the simulator breaks. Pressing enter or typing 'run' again will execute one more instruction. If there is a function needing to be profiled at location 0xf010, typing: call 0xf010 will execute it. The program will stop running at the RET of the function.

Three other useful commands are call, push, and set. To push something on the stack just do: push 0x1000 for example to push 0x1000 to the stack. To set the value of a register: set pc=1000 or set r5=0xffff. To call a function: call 0xf034 to call a function at location 0xf034. This pushes the return address 0xffff on the stack and sets PC to 0xf034. When the simulator sees PC==0xffff it returns back to you so the number of clock cycles it took to run the function.

There are 4 commands for reading and writing memory: bprint, wprint, bwrite, wwrite. So to write 5 bytes to location 0x1000, I could type:

bwrite 0x1000 100 102 143 0 5

and I can confirm it's written by typing: bprint 0x1000

For reading and writing word sized data, wprint and wwrite work the same way.

Assembler Syntax

Like other MSP430 assemblers, naken430asm accepts C style #define, #ifdef, #if defined(). An example would be:

#define BLAH 50

mov.w r1, r12
mov.w r3, r12

#if defined(SOMETHING) && !defined(ANOTHER) && BLAH>50
mov.w @r12+, r3

Standard assembler syntax "equ" is also accepted too:

BLAH equ 50

Also .macro / .endm works like the following:

.macro BLAH
mov.w #5, r10
mov.w #6, r11

or also:

.macro BLAH(a,b)
mov.w #a, r10
mov.w #b, r11

Data bytes and words can be done with db (or dc8) and dw (or dc16). Chunks of databytes that default to 0 can be set with ds, ds8, ds16. Strings in db sections are not null terminated. For example:

db "Copyright 2010 by Michael Kohn", 0, 5, -9
dw 100, 2000, 400, 9

Files can be included with a .include "filename.h".

Comments can be done with a standard assembler ; (semicolon) or with standard C's // and /* */.

As with other assemblers, org or .org is used to tell the assembler what address a piece of code starts on.

Hex number can be written with either 0xFFD2 or 0FFD2h. Octal numbers can either start with 0 or end with q: 070 or 70q. Binary numbers can just end with a b: 11110000b.

Assembler Directives

.ascii <text> .asciiz <text> .binfile "binarydata.bin"
.db <data bytes> .define <macro> .dw <data words>
.ds8 <data byte> .ds16 <data words> .else <exression>
.endif .endm .org <address>
.if <exression> .ifdef <exression> .ifndef <exression>
.include "" .macro <name> (opt. params)

... To be completed ...


Incase anyone cares why I wrote this, I originally started programming MSP430 with IAR on Windows. I actually don't mind IAR so much, but I don't normally use Windows boxen and writing code on them. I find to be extremely irritating. So I tried to get MSP430-gcc to compile on Linux. That ended up being a lot of work and I could never get gdb to compile. On top of that I use 64bit Linux and the and files that are closed source and 32 bit. After I wrote naken430asm I did notice there is a msp430-gcc4 which is a lot better, but I still prefer a small assembler to a big thing like this.

Copyright 1997-2015 - Michael Kohn