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