[dorkbotpdx-blabber] assembler on the arduino?
Paul Stoffregen
paul at pjrc.com
Sun Jan 27 16:49:42 EST 2008
It's really pretty easy, at least to do simple things. If you start
manipulating complex data structures, assembly gets tedious pretty quickly.
I don't have any beginner advise, but here's some chunks of code you
might fine helpful for sending stuff out the serial port.
;initialize uart, transmit only, 115200 baud
init_uart:
ldi r16, (ubrr_value >> 255)
sts UBRR0H, r16
ldi r16, (ubrr_value & 255)
sts UBRR0L, r16
ldi r16, 0
sts UCSR0A, r16
ldi r16, (1<<UCSZ1)|(1<<UCSZ0) ;1 stop bit
;ldi r16, (1<<UCSZ1)|(1<<UCSZ0)|(1<<USBS) ;2 stop bits
sts UCSR0C, r16
ldi r16, (1<<TXEN)
sts UCSR0B, r16
ret
cout:
push r16
cout_wait:
lds r16, UCSR0A
sbrs r16, UDRE
rjmp cout_wait
pop r16
sts UDR0, r16
ret
newline:
push r16
ldi r16, 13
rcall cout
ldi r16, 10
rcall cout
pop r16
ret
phex:
push r16
swap r16
andi r16, 15
subi r16, 10
brcs phex_2
subi r16, 249
phex_2: subi r16, 198
rcall cout
pop r16
p1hex: push r16
andi r16, 15
subi r16, 10
brcs phex_3
subi r16, 249
phex_3: subi r16, 198
rcall cout
pop r16
ret
.macro pstr
rcall pstr_string_addr
.dw (@0 * 2)
.endmacro
;this complex pstr allows the caller to place the string
;address in memory immediately following the call instruction,
;an no register values are modified by this function. No need
;to use LDI instructions to pass the string address in the
;registers, and push/pop instructions before/after the LDI
;and call. This function preserves all register values, gets
;the string address from the next code word after the call,
;and re-writes the return address on the stack so it returns
;properly to the caller's code after the string is printed
pstr_string_addr:
push Zl
push Zh
push r24
push r25
in Zl, spl
in Zh, sph
ldd r25, Z+5 ;grab return address from stack
ldd r24, Z+6
adiw r24, 1
std Z+5, r25 ;inc return address on stack
std Z+6, r24
sbiw r24, 1
lsl r24 ;translate code space addr
rol r25
mov Zl, r24
mov Zh, r25
lpm r24, Z+ ;fetch address of string
lpm r25, Z+
mov Zl, r24
mov Zh, r25
pop r25
pop r24
push r16
pstr_s_loop:
lpm r16, Z+ ;fetch string bytes
tst r16
breq pstr_s_end ;finish if null terminator
rcall cout
rjmp pstr_s_loop
pstr_s_end:
pop r16
pop Zh
pop Zl
ret
;to use this, write something like "pstr my_debug_msg" in your code
;and at the end of all you code, write 'my_debug_msg: .db "My debug
message",0'
Greg Borenstein wrote:
> Hey y'all,
>
> I was wondering if anyone had any advice for someone who wants to use
> the Arduino as a platform for learning Assembler. Are there any good
> guides out there for getting started writing and running assembler on
> the Arduino? Any truly beginner level texts for writing Assembler in
> general?
>
> I'm an upper-intermediate level Arduino programmer with no assembler
> experience. Starting tomorrow, I'll be auditing a class at Reed on
> language design and threading for the micro-controller environment
> that's going to be using the Arduino as a test subject and I wanted to
> try to get some of the basics under my belt.
>
> Thanks,
>
> Greg
> ---
> http://grabb.it/users/greg
> http://urbanhonking.com/ideasfordozens
> http://atduskmusic.com
> _______________________________________________
> dorkbotpdx-blabber mailing list
> dorkbotpdx-blabber at dorkbot.org
> http://music.columbia.edu/mailman/listinfo/dorkbotpdx-blabber
>
>
More information about the dorkbotpdx-blabber
mailing list