HSP3x64サポートの為の関数呼び出しアセンブリ(適当) あまりテストしてないですし、書き方適当で非効率ですしおすし
HSP3x64サポートの為の関数呼び出しアセンブリ(適当) あまりテストしてないですし、書き方適当で非効率ですしおすし
; masm64 (x64) ;.686 ;.mmx ;.xmm ;.model flat ;_TEXT64 segment page public use64 'CODE' ; align 16 ; fastcall!! ;PUBLIC C call_extfunc64 .code PUBLIC call_extfunc64 call_extfunc64 PROC ; rcx = 第1引数(関数のポインタ) ; rdx = 第2引数(引数が入ったINT64の配列) ; r8 = 第3引数(引数情報(int=0,double(float)=1)が入ったINT64の配列) ; r9 = 第4引数(引数の数) ; rax = 戻り値 sub rsp, 72 ; レジスタの退避 push r12 push r13 push r14 push r15 ; コピー mov r12, rcx mov r13, rdx mov r14, r8 mov r15, r9 ; r10-r11 レジスタ ; 0クリアする。いらない気がする。 xor r10, r10 xor r11, r11 ; 引数1~4の時はレジスタに格納、5以降はスタック ; 第1引数 ; if num > 0 cmp r15, 0 jg FLAG1 jmp FLAG1END FLAG1: mov r10, qword ptr [r14+0] ; int or double? cmp r10, 0 je FLAG1INT ; doubleなのでxmm?へ movq xmm0, qword ptr [r13+0] jmp FLAG1END FLAG1INT: mov rcx, qword ptr [r13+0] FLAG1END: ; 第2引数 ; if num > 1 cmp r15, 1 jg FLAG2 jmp FLAG2END FLAG2: mov r10, qword ptr [r14+8] ; int or double? cmp r10, 0 je FLAG2INT ; doubleなのでxmm?へ movq xmm1, qword ptr [r13+8] jmp FLAG2END FLAG2INT: mov rdx, qword ptr [r13+8] FLAG2END: ; 第3引数 ; if num > 2 cmp r15, 2 jg FLAG3 jmp FLAG3END FLAG3: mov r10, qword ptr [r14+16] ; int or double? cmp r10, 0 je FLAG3INT ; doubleなのでxmm?へ movq xmm2, qword ptr [r13+16] jmp FLAG3END FLAG3INT: mov r8, qword ptr [r13+16] FLAG3END: ; 第4引数 ; if num > 3 cmp r15, 3 jg FLAG4 jmp FLAG4END FLAG4: mov r10, qword ptr [r14+24] ; int or double? cmp r10, 0 je FLAG4INT ; doubleなのでxmm?へ movq xmm3, qword ptr [r13+24] jmp FLAG4END FLAG4INT: mov r9, qword ptr [r13+24] FLAG4END: ; 第5引数以降 ; if num < 5 : CALLFUNCに飛ぶ cmp r15, 5 jl CALLFUNC ; ↓5以降はRSPスタックに積む(後ろから積む) mov r11, r15 jmp PUSHCHECK PUSHSTACK: ;push qword ptr [r13+r11*8] mov rax, qword ptr [r13+r11*8] mov qword ptr [rsp+r11*8], rax PUSHCHECK: dec r11 ; ~0~3の時は抜ける cmp r11, 3 jg PUSHSTACK ; ↑ ; eax0クリア xor eax, eax CALLFUNC: ; 呼出 call r12 ; レジスタ後始末 pop r15 pop r14 pop r13 pop r12 ; 終了 add rsp, 72 ret call_extfunc64 ENDP ; End