前のが正常動作してなかったので修正。ひどすぎて読みずらいぞ!
前のが正常動作してなかったので修正。ひどすぎて読みずらいぞ!
; masm64 (x64);.686;.mmx;.xmm;.model flat;_TEXT64 segment page public use64 'CODE'; align 16; fastcall!!;PUBLIC C call_extfunc64.codealign 16PUBLIC call_extfunc64call_extfunc64 PROC; rcx = 第1引数(関数のポインタ); rdx = 第2引数(引数が入ったINT64の配列); r8 = 第3引数(引数情報(int=0,double(float)=1)が入ったINT64の配列); r9 = 第4引数(引数の数); rax = 戻り値; レジスタの退避push r12push r13push r14push r15; 引数が0~4の時はサイズ40; 5以降は 16ずつ増える; 5-6 56; 7-8 72; 9-10 88; r10~r11はテンポラリ用; r12 は関数のアドレス保持に使用中の為; r13 をサイズ保持用レジスタ; r14 をrdx退避使用mov r14, rdx; r15 は引数の数で、使用中mov r13, 40; if r13 <= 4cmp r13, 4jbe JMP1; 5以上の処理;(d+=8*(num-4))mov r10, r9sub r10, 4; 掛け算*8なので算術シフトするshl r10, 3add r13, r10;if d\16 == 0 : d+=8mov rax, r13cdqand rdx, 15add rax, rdxand rax, 15sub rax, rdxcmp rax, 0jne JMP1add r13, 8JMP1:; 復元(r14->rdx)mov rdx, r14mov r11, r13sub rsp, r11; コピーmov r12, rcxmov r13, rdxmov r14, r8mov r15, r9; r10-r11 レジスタ (テンポラリ用レジスタ); 0クリア; xor r10, r10; xor r11, r11; 引数1~4の時はレジスタに格納、5以降はスタック; 第1引数; if num > 0cmp r15, 0jg FLAG1jmp FLAG1ENDFLAG1:; r14のポインタからr10 レジスタに中身コピー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:; r14のポインタからr10 レジスタに中身コピー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:; r14のポインタからr10 レジスタに中身コピー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:; r14のポインタからr10 レジスタに中身コピー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 r10, r15jmp PUSHCHECKPUSHSTACK:;push qword ptr [r13+r10*8]mov rax, qword ptr [r13+r10*8]mov qword ptr [rsp+r10*8], raxPUSHCHECK:dec r10; ~0~3の時は抜けるcmp r10, 3jg PUSHSTACK; ↑CALLFUNC:; 呼出mov r13, r11call r12mov r11, r13; 終了add rsp, r11; レジスタ後始末pop r15pop r14pop r13pop r12retcall_extfunc64 ENDP;End