📄 sysv.s
字号:
/* ----------------------------------------------------------------------- sysv.S m68k Foreign Function Interface ----------------------------------------------------------------------- */#define LIBFFI_ASM #include <fficonfig.h>#include <ffi.h> .text .globl ffi_call_SYSV .type ffi_call_SYSV,@functionffi_call_SYSV: link %fp,#0 move.l %d2,-(%sp) | Make room for all of the new args. sub.l 16(%fp),%sp | Call ffi_prep_args move.l 12(%fp),-(%sp) pea 4(%sp) move.l 8(%fp),%a0 jsr (%a0) addq.l #8,%sp | Pass pointer to struct value, if any move.l %a0,%a1 | Call the function move.l 32(%fp),%a0 jsr (%a0) | Remove the space we pushed for the args add.l 16(%fp),%sp | Load the pointer to storage for the return value move.l 28(%fp),%a1 | Load the return type code move.l 20(%fp),%d2 | If the return value pointer is NULL, assume no return value. tst.l %a1 jbeq noretval btst #0,%d2 jbeq retlongint move.l %d0,(%a1) jbra epilogueretlongint: btst #1,%d2 jbeq retfloat move.l %d0,(%a1) move.l %d1,4(%a1) jbra epilogueretfloat: btst #2,%d2 jbeq retdouble fmove.s %fp0,(%a1) jbra epilogueretdouble: btst #3,%d2 jbeq retlongdouble fmove.d %fp0,(%a1) jbra epilogueretlongdouble: btst #4,%d2 jbeq retpointer fmove.x %fp0,(%a1) jbra epilogueretpointer: btst #5,%d2 jbeq retstruct move.l %a0,(%a1) jbra epilogueretstruct: btst #6,%d2 jbeq noretval move.l 24(%fp),%d2 bfins %d0,(%a1){#0,%d2}noretval:epilogue: move.l (%sp)+,%d2 unlk %a6 rts .size ffi_call_SYSV,.-ffi_call_SYSV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -