section .text align=4 exec

%include "C:\development\shell\cplusplus-filter\nasm-cc\x64\seh64.asm"

%include "C:\development\shell\cplusplus-filter\nasm-cc\x64\macros64.asm"

%include "C:\development\shell\cplusplus-filter\nasm-cc\x64\math_mac.asm"

section .bss align=4 noexec


section .text align=4 exec

struc struc___sFILE
   ._stream: resb 8
   ._buffer: resb 8
   ._offset: resb 8
   ._error: resb 4
   ._ch: resb 4
   ._un: resb 4
   .size:
endstruc

struc struc_tm
   ._tm_sec: resb 4
   ._tm_min: resb 4
   ._tm_hour: resb 4
   ._tm_mday: resb 4
   ._tm_mon: resb 4
   ._tm_year: resb 4
   ._tm_wday: resb 4
   ._tm_yday: resb 4
   ._tm_isdst: resb 4
   .size:
endstruc

extern _get_bit8
extern _get_bit16
extern _get_bit32
extern _get_bit64
extern _set_bit8
extern _set_bit16
extern _set_bit32
extern _set_bit64
extern __stdout
extern __stderr
extern __stdin
extern _fileno
extern _ferror
extern _remove
extern _fread
extern _fwrite
extern _fopen
extern _freopen
extern _clearerr
extern _ftell
extern _gets
extern _fseek
extern _feof
extern _fprintf
extern _fgets
extern _fscanf
extern _fflush
extern _fclose
extern _ungetc
extern _printf
extern _scanf
extern _sscanf
extern _getchar
extern _fgetc
extern _fgetwc
extern _fputc
extern _puts
extern _putws
extern sprintf
extern _perror
extern _lock_fileA
extern _unlock_fileA
extern exit
extern ___argc
extern ___argv
extern __environ
extern __putenv
extern _getenv
extern __chdir
extern __mkdir
extern __rmdir
extern __getcwd
extern _exitA
extern _malloc
extern _realloc
extern _free
extern _memset
extern _atoi
extern _atod
extern _atol
extern atof
extern _system
extern _unlink
extern _srand
extern _rand
extern _atexitA
extern _qsort0
extern _bsearch0
extern _tempnam
extern mktime
extern _time
extern _ctime
extern _ctime_r
extern _clock
extern _gmtime_r
extern _gmtime
extern _localtime
extern _localtime_r
extern _strftime
global _mainA
global _ginit_32_obj
extern _memcpy

extern ExitProcess
extern MessageBoxA
extern _puts
exception_code_begin:
%define _count rsp+132
%define _start rsp+124
%define _end rsp+116
%define _temp rsp+108
%define arg0 rsp+0
%define arg1 rsp+8
%define arg2 rsp+16
%define arg3 rsp+24
%define arg4 rsp+32
%define arg5 rsp+40
%define arg6 rsp+48
%define arg7 rsp+56
ALIGN 32,db 0xCC
_mainA:
	sub rsp,136
	mov rcx,C0
	call _printf
	call _clock
	mov [_start],rax
	lea rax,[_start]
	mov dword [_count],dword 0
.L2:
	mov eax,dword [_count]
	mov rcx,4294967295
	cmp eax,ecx
	setb al
	movzx rax,al
	cmp rax,0
	jz .L0
.L1:
	inc dword [_count]
	jmp .L2
.L0:
	call _clock
	mov [_end],rax
	mov rcx,qword [_start]
	mov rax,qword [_end]
	sub rax,rcx
	mov [_temp],rax
	mov rcx,C1
	mov rdx,qword [_temp]
	call _printf
	mov rcx,C2
	call _printf
	mov rax,0
	add rsp,136
	ret
%undef _count
%undef _start
%undef _end
%undef _temp
%undef arg0
%undef arg1
%undef arg2
%undef arg3
%undef arg4
%undef arg5
%undef arg6
%undef arg7


%define arg0 rsp+0
%define arg1 rsp+8
%define arg2 rsp+16
%define arg3 rsp+24
%define arg4 rsp+32
%define arg5 rsp+40
%define arg6 rsp+48
%define arg7 rsp+56
ALIGN 32,db 0xCC
_ginit_32_obj:
	sub rsp,104
	add rsp,104
	ret
%undef arg0
%undef arg1
%undef arg2
%undef arg3
%undef arg4
%undef arg5
%undef arg6
%undef arg7



exception_code_end:

exception_handler:
	mov [rsp+8*1],rcx
	mov [rsp+8*2],rdx
	mov [rsp+8*3],r8
	mov [rsp+8*4],r9
	sub rsp,40
	mov [rsp+8*4],r9
	sub rsp,40
	mov r9,16
	mov r8,EX
	mov rdx,EX
	mov rcx,0
	call MessageBoxA
	mov rcx,1
	call ExitProcess
	add rsp,40
	ret

section .data align=4 noexec

C0 : db 'start...',10,'',0;DE
C1 : db 'total time spent = %d milliseconds...',10,'',0;DE
C2 : db 'done...',10,'',0;DE

EX : db 'software exception...',10,0
