SDL v1.2 >> Assembly (ARM)

Hello, world!


參考資訊:
1. docs

main.s

    .macro invoke func:req, args:vararg
        .ifnb \args
            argc = 0
            .irp param, \args
                argc = argc + 1
            .endr
            argrc = argc
            .rept argc
                argrc = argrc - 1
                argc = 0
                .irp param, \args
                    .if argrc == argc
                        .if argrc == 0
                            mov r0, \param
                        .elseif argrc == 1
                            mov r1, \param
                        .elseif argrc == 2
                            mov r2, \param
                        .elseif argrc == 3
                            mov r3, \param
                        .else
                            mov r4, \param
                            push {r4}
                        .endif
                    .endif
                    argc = argc + 1
                .endr
            .endr
        .endif
        bl \func
    .endm
  
    .global main
    .extern exit
  
    .equ SDL_INIT_VIDEO,  0x20
    .equ SDL_HWSURFACE,   0x01
  
    .align
    .data
screen: .zero 4
bmp:    .zero 4

    .align
    .text
bmp_path: .asciz "main.bmp"
bmp_mode: .asciz "rw"

    .align
    .text
main:
    invoke SDL_Init, $SDL_INIT_VIDEO
    invoke SDL_SetVideoMode, $320, $240, $16, $SDL_HWSURFACE
    ldr r1, =screen
    str r0, [r1]

    ldr r4, =bmp_path
    ldr r5, =bmp_mode
    invoke SDL_RWFromFile, r4, r5
    invoke SDL_LoadBMP_RW, r0, #1
    ldr r1, =bmp
    str r0, [r1]

    ldr r4, =bmp
    ldr r4, [r4]
    ldr r5, =screen
    ldr r5, [r5]
    invoke SDL_UpperBlit, r4, $0, r5, $0
    ldr r4, =screen
    ldr r4, [r4]
    invoke SDL_Flip, r4
    invoke SDL_Delay, $2000
    ldr r4, =bmp
    ldr r4, [r4]
    invoke SDL_FreeSurface, r4
    invoke SDL_Quit
    invoke exit, $0
    .end

編譯、執行

$ gcc -o main main.s -lSDL
$ ./main


返回上一頁