I am looking for resources, either online tutorials or books, for learning ARM assembly. What would you recommend?
ARM Assembler is very easy to learn due to the very flexible three operand opcodes. After MIPS it is the most straight forward assembler dialect out there. If you know one dialect of assembler you can become a fluent ARM-assembler programmer over a weekend.
There are a couple of web-resources though:
General intro to the architecture:
http://www.heyrick.co.uk/assembler/
A web-site that has a pocket-PC (xscale) development discussion board. If you browse it you'll find some very interesting ARM assembly gems:
And then there is the ARM instruction set quick reference chart which summarizes all instructions of all architectures:
http://infocenter.arm.com/help/topic/com.arm.doc.qrc0001l/QRC0001_UAL.pdf
(Hint: there are half a dozen ARM architectures out there. Pick the reference chart for the architecture you're working on. E.g. if you write for ARM9 you can ignore all the Thumb2 and ARMv6 instructions).
To get example codes there are resources as well.
DIY: Compile some piece of C-Code and analyze the disassembly.
Game Boy Advance Homebrew web-sites have lots of material.
Acorn Archimedes Nostalgia Web-sites often have nice assembler code-snippets.
It isn't cheap, but I've found that the "ARM System Developer's Guide" by Andrew Sloss, et al is a really good book for ARM assembly:
I'd second Mike B's recommendation on the "ARM System Developer's Guide".
Which arm chip do you plan to use? If the Cortex-M3 then a good book is The Definitive Guide to the ARM Cortex-M3 by Joseph Yiu.
Hmmm, my answer is from a totally different angle.
You will need the ARM ARM (The ARM Architecture Reference Manual) you can get a pay for book in print but the pdf is available for free. It varies where, there was a time you asked for the free technical reference manual CD from arm and a week or so later it came in the mail (from the UK) with many pdfs, today you can probably sign up on their site and then download it. The TRMs (technical reference manuals) are good too but often dont have the instruction set. The blue book (print version of the arm arm with a blue cover) is one of the better ones to have in print as a reference, but it wont have the new instructions that have come out since the ARM 7.
The next thing you do is get an arm cross compiler, these days that is easy, devkitadvance, winarm, code sourcery, emdebian (just the toolkit binaries) (these are all gcc based), or roll your own (its easy, almost trivial once someone shows you how). Actually binutils is all you need for this, not a full blown gcc.
mkdir /arm
cd /arm
tar xzvf /path/to/binutils-version.tar.gz
cd binutils-version
mkdir build
cd build
../configure --target=arm-thumb-elf --prefix=/arm
make all install
PATH=/arm/bin:$PATH
and you have your own home-made arm assembler (and linker, etc, binutils).
Write a painfully simple program:
.globl _start
_start:
mov r0,#1
mov r1,r0
str r1,[r2]
assemble it:
arm-itvaries-as -o hello.o hello.s
link it:
arm-itvaries-ld -o hello.elf hello.o
disassemble it:
arm-itvaries-objdump -D hello.elf > hello.list
save it out as an easy to read binary file:
arm-itvaries-objcopy -O binary hello.elf hello.bin
Now start writing your own disassembler. The arm instructions are all 32 bit, every bit is defined in the ARM ARM. Yes each rev of the book has some bugs, but you will soon figure that out, and be the wiser for it. Dont be fooled by comments like unpredictable results will occur, those are just patent protection for their IP, most are predictable, some are just broken on this core but not that core.
Here is what you are going to want to do, write painfully simple programs like the one above to create each and every variation of every instruction possible (as described in the arm arm). Do this to both develop and debug your disassembler and to learn the instruction set. Note your disassembler is a learning tool you are not trying to create assembleable code or even pretty output, it only needs to be readable enough to see that you did in fact figure out what that field in the opcode does and how to write assembler source to manipulate those opcode bits.
Do this for the ARM instruction set which is not as easy as the thumb, but all the instructions are fixed in size and aligned on word boundaries so you can start at the beginning of the .bin file and work to the end, disassembling instructions and data and whatever you find. THEN move on to the thumb instruction set, lastly, you might try thumb 2 but variable length disassembly is an art form in and of itself that you DONT want to tackle without some experience, and the goal here is not to kill yourself learning the art of disassembly but learning an instruction set. Keep your programs to a few lines to keep the disassembly manageable.
This whole exercise will teach you the instruction set better than any book and you will know this instruction set better than individuals who have not done it this way, no matter how many years of assembler on the specific instruction set. I have done this time and time again with each ISA I come across, by the second or third one you can have the disassembler done in a couple of evenings and have the instruction set beat into submission.
ARM is quite literally taking over the world so this is the best instruction set to learn for that reason. It is a really good one as well, some strengths and weaknesses, but over all well rounded. Because of this exercise I am making a pretty good living as an "The ARM guy", you can too...
This post is old but anyway: There is a really good introduction to ARM Assembly at http://www.coranac.com/tonc/text/asm.htm
I have used it to help learn Assembly for the iPhone 3GS (ARM Cortex-A8)
read:- http://www.coranac.com/tonc/text/asm.htm
It looks that you need to put on a new way of thinking like the asemmbly code is designed for C and the processor needs to lower jumps to gain speed and every instruction is condtional not like 8086 I supose it allows a low transitor count processor to do more but you have to think about code formats is a different way
Lex Dean