【HSP3】HSP3x64サポートの為の関数呼び出しアセンブリ(適当)

HSP3x64サポートの為の関数呼び出しアセンブリ(適当) あまりテストしてないですし、書き方適当で非効率ですしおすし

HSP3x64サポートの為の関数呼び出しアセンブリ(適当) あまりテストしてないですし、書き方適当で非効率ですしおすし

  • hk1v
  • 2014/3/4 18:25
  • タグ:
  • タグはありません
; 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