# MACRO: exit # Terminates execution. .macro exit nr stp x29, x30, [sp,#-32]! mov x4, #0x26 mov x7, #\nr mov x29, sp movk x4, #0x2, lsl #16 add x1, x29, #0x10 str x4, [x29,#16] str x7, [x29,#24] mov w0, #0x18 hlt #0xf000 .endm # MACRO: swiwrite # Writes the string in X1 to stdout .macro swiwrite len stp x29, x30, [sp,#-48]! mov x0, #1 mov x2, #\len mov x29, sp str x0, [x29,#24] str x1, [x29,#32] str x2, [x29,#40] mov w0, #0x5 add x1, x29, #0x18 hlt #0xf000 ldp x29, x30, [sp],#48 ret .endm # MACRO: pass # Write 'pass' to stdout and quit .macro pass adrp x1, .Lpass add x1, x1, :lo12:.Lpass swiwrite 5 exit 0 .endm # MACRO: fail # Write 'fail' to stdout and quit .macro fail adrp x1, .Lfail add x1, x1, :lo12:.Lfail swiwrite 5 exit 1 .endm # MACRO: start # All assembler tests should start with a call to "start" .macro start .data .Lpass: .asciz "pass\n" .Lfail: .asciz "fail\n" .text .global _start _start: .endm