[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