📄 testutils.inc
字号:
# r0-r3 are used as tmps, consider them call clobbered by these macros.# This uses the angel rom monitor calls.# ??? How do we use the \@ facility of .macros ???# @ is the comment char! .macro mvi_h_gr reg, val ldr \reg,[pc] b . + 8 .word \val .endm .macro mvaddr_h_gr reg, addr ldr \reg,[pc] b . + 8 .word \addr .endm .macro start .datafailmsg: .asciz "fail\n"passmsg: .asciz "pass\n" .textdo_pass: ldr r1, passmsg_addr mov r0, #4 swi #0x123456 exit 0passmsg_addr: .word passmsgdo_fail: ldr r1, failmsg_addr mov r0, #4 swi #0x123456 exit 1failmsg_addr: .word failmsg .global _start_start: .endm# *** Other macros know pass/fail are 4 bytes in size! Yuck. .macro pass b do_pass .endm .macro fail b do_fail .endm .macro exit rc # ??? This works with the ARMulator but maybe not others. #mov r0, #\rc #swi #1 # This seems to be portable (though it ignores rc). mov r0,#0x18 mvi_h_gr r1, 0x20026 swi #0x123456 # If that returns, punt with a sigill. stc 0,cr0,[r0] .endm# Other macros know this only clobbers r0.# WARNING: It also clobbers the condition codes (FIXME). .macro test_h_gr reg, val mvaddr_h_gr r0, \val cmp \reg, r0 beq . + 8 fail .endm .macro mvi_h_cnvz c, n, v, z mov r0, #0 .if \c orr r0, r0, #0x20000000 .endif .if \n orr r0, r0, #0x80000000 .endif .if \v orr r0, r0, #0x10000000 .endif .if \z orr r0, r0, #0x40000000 .endif mrs r1, cpsr bic r1, r1, #0xf0000000 orr r1, r1, r0 msr cpsr, r1 # ??? nops needed .endm# ??? Preserve condition codes? .macro test_h_cnvz c, n, v, z mov r0, #0 .if \c orr r0, r0, #0x20000000 .endif .if \n orr r0, r0, #0x80000000 .endif .if \v orr r0, r0, #0x10000000 .endif .if \z orr r0, r0, #0x40000000 .endif mrs r1, cpsr and r1, r1, #0xf0000000 cmp r0, r1 beq . + 8 fail .endm
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -