【HSP3】HSP3x64サポートの為の関数呼び出しアセンブリv2(これはひどい)

前のが正常動作してなかったので修正。ひどすぎて読みずらいぞ!

前のが正常動作してなかったので修正。ひどすぎて読みずらいぞ!

  • hk1v
  • 2014/3/6 0:53
  • タグ:
  • タグはありません
; masm64 (x64)
;.686
;.mmx
;.xmm
;.model flat
;_TEXT64 segment page public use64 'CODE'
; align 16
; fastcall!!
;PUBLIC C call_extfunc64
.code
align 16
PUBLIC call_extfunc64
call_extfunc64 PROC
; rcx = 1()
; rdx = 2(INT64)
; r8 = 3((int=0,double(float)=1)INT64)
; r9 = 4()
; rax =
; 退
push r12
push r13
push r14
push r15
; 0440
; 5 16
; 5-6 56
; 7-8 72
; 9-10 88
; r10r11
; r12 使
; r13
; r14 rdx退使
mov r14, rdx
; r15 使
mov r13, 40
; if r13 <= 4
cmp r13, 4
jbe JMP1
; 5
;(d+=8*(num-4))
mov r10, r9
sub r10, 4
; *8
shl r10, 3
add r13, r10
;if d\16 == 0 : d+=8
mov rax, r13
cdq
and rdx, 15
add rax, rdx
and rax, 15
sub rax, rdx
cmp rax, 0
jne JMP1
add r13, 8
JMP1:
; (r14->rdx)
mov rdx, r14
mov r11, r13
sub rsp, r11
;
mov r12, rcx
mov r13, rdx
mov r14, r8
mov r15, r9
; r10-r11 ()
; 0
; xor r10, r10
; xor r11, r11
; 145
; 1
; if num > 0
cmp r15, 0
jg FLAG1
jmp FLAG1END
FLAG1:
; r14r10
mov r10, qword ptr [r14+0]
; int or double?
cmp r10, 0
je FLAG1INT
; doublexmm?
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:
; r14r10
mov r10, qword ptr [r14+8]
; int or double?
cmp r10, 0
je FLAG2INT
; doublexmm?
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:
; r14r10
mov r10, qword ptr [r14+16]
; int or double?
cmp r10, 0
je FLAG3INT
; doublexmm?
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:
; r14r10
mov r10, qword ptr [r14+24]
; int or double?
cmp r10, 0
je FLAG4INT
; doublexmm?
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
; ↓5RSP()
mov r10, r15
jmp PUSHCHECK
PUSHSTACK:
;push qword ptr [r13+r10*8]
mov rax, qword ptr [r13+r10*8]
mov qword ptr [rsp+r10*8], rax
PUSHCHECK:
dec r10
; 03
cmp r10, 3
jg PUSHSTACK
; ↑
CALLFUNC:
;
mov r13, r11
call r12
mov r11, r13
;
add rsp, r11
;
pop r15
pop r14
pop r13
pop r12
ret
call_extfunc64 ENDP
;
End
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX