微電腦 - Zipit Z1 - Assembly - Hello, world!



main.s

    .text
    .align 2
    .global _start

_start:
    bal reset
_undef:
    bal .
_swi:
    bal .
_prefetch_abort:
    bal .
_data_abort:
    bal .
_reserved:
    bal .
_irq:
    bal .
    bal . 
 
reset:
    ldr sp, =#0x60009600
    ldr r0, =#0x80000000
    ldr r1, =#0x40100
    str r1, [r0, #0x100]
    ldr r0, =#0x80002200
    ldr r1, [r0]
    orr r1, r1, #6
    str r1, [r0]
    nop
    nop
    nop
    nop
    nop
    nop
    ldr r0, =#0x80002600
    ldr r1, =#0x31000000
    str r1, [r0, #0x10]
    nop
    nop
    nop
    nop
    ldr r0, =#0x80000000
    ldr r1, =#0x60004
    str r1, [r0, #0x4c0]
    add r0, r0, #0x1000
    str r1, [r0, #0x4c0]
    mov r1, #0x100
    str r1, [r0, #0x100]
    mrc p15, 0, r5, c1, c0, 0
    bic r5, r5, #0xd
    mcr p15, 0, r5, c1, c0, 0
    nop
    nop
    nop
    nop
    ldr r0, =hello
    bl uart2_send_string
halt:
    b halt

uart2_send_string:
    stmfd sp!, {lr}
    mov r3, r0
0:
    ldrb r0, [r3]
    cmp r0, #0
    beq 1f
    bl uart2_send_char
    add r3, r3, #1
    b 0b
1:
    ldmfd sp!, {pc}
    
uart2_send_char:
    stmfd sp!, {lr}
    ldr r1, =#0x80001000
1:
    ldr r2, [r1, #0x140]
    tst r2, #0x800000
    bne 1b
    str r0, [r1, #0x480]
    ldmfd sp!, {pc}

    .align
hello: .asciz "Hello, world!"
    .end

main.ld

MEMORY {
    flash : ORIGIN = 0, LENGTH = 64M
    ram : ORIGIN = 0x40000000, LENGTH = 64M
}

__stack_end__ = 0x40000000 + 8K - 4;
SECTIONS {
    . = 0;
    startup : { *(.startup)} >flash
    prog : {
        *(.text)
        *(.rodata)
        *(.rodata*)
        *(.glue_7)
        *(.glue_7t)
    } >flash
    __end_of_text__ = .;
    .data : {
        __data_beg__ = .;
        __data_beg_src__ = __end_of_text__;
        *(.data)
        __data_end__ = .;
    } >ram AT>flash
    .bss : {
        __bss_beg__ = .;
        *(.bss)
    } >ram
    . = ALIGN(32 / 8);
}
. = ALIGN(32 / 8);
_end = .;
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
PROVIDE(end = .);
PROVIDE(undefined_instruction_exception = endless_loop);
PROVIDE(software_interrupt_exception = endless_loop);
PROVIDE(prefetch_abort_exception = endless_loop);
PROVIDE(data_abort_exception = endless_loop);
PROVIDE(reserved_exception = endless_loop);
PROVIDE(interrupt_exception = endless_loop);
PROVIDE(fast_interrupt_exception = endless_loop);

Makefile

all:
	arm-none-eabi-as -ggdb -mcpu=arm7 -o main.o main.s
	arm-none-eabi-ld -T main.ld -o main.elf main.o
	arm-none-eabi-objcopy -O binary main.elf main.bin

clean:
	rm -rf main.ihx main.hex main.o main.elf