212 lines
5.1 KiB
PHP
212 lines
5.1 KiB
PHP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Copyright (c) Microsoft Corporation. All rights reserved.
|
|
;
|
|
; Include file for intel/amd assembly files.
|
|
;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; Standard x86/x64 asm file setup
|
|
|
|
ifdef ISA_IX86
|
|
|
|
.686p
|
|
.mmx
|
|
.xmm
|
|
.model flat
|
|
|
|
assume ds:flat
|
|
assume es:flat
|
|
assume ss:flat
|
|
assume fs:nothing
|
|
assume gs:nothing
|
|
|
|
endif
|
|
|
|
.code
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; General purpose utility macros
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; DEFINED is a generic utility macro which tests if an identifier is defined
|
|
DEFINED MACRO SYM:REQ
|
|
IFDEF SYM
|
|
EXITM <-1>
|
|
ELSE
|
|
EXITM <0>
|
|
ENDIF
|
|
ENDM
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; REPLACE is a generic utility macro which replaces FIND with REPL in STRING
|
|
; (if it occurs)
|
|
|
|
REPLACE MACRO STRING:REQ, FIND:REQ, REPL:REQ
|
|
LOCAL len, pos, start, end
|
|
len = @SizeStr(FIND)
|
|
pos = @InStr(,STRING,FIND)
|
|
IF pos NE 0
|
|
start TEXTEQU @SubStr(STRING,1,pos-1)
|
|
if pos+len-1 LT @SizeStr(STRING)
|
|
end TEXTEQU @SubStr(STRING,pos+len)
|
|
else
|
|
end TEXTEQU <>
|
|
endif
|
|
EXITM @CatStr(%start, REPL, %end)
|
|
else
|
|
EXITM <STRING>
|
|
endif
|
|
ENDM
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
SINGLE_THREADED equ 0
|
|
EXCLUDED equ 0
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Typedefs & Constants
|
|
;
|
|
UINT8 TYPEDEF BYTE
|
|
UINT16 TYPEDEF WORD
|
|
UINT32 TYPEDEF DWORD
|
|
UINT64 TYPEDEF QWORD
|
|
UINT128 STRUCT 16
|
|
_lo UINT64 ?
|
|
_hi UINT64 ?
|
|
UINT128 ENDS
|
|
|
|
;
|
|
X86_EFLAG_IF equ 0200h
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; X86/X64 portability names (P = pointer)
|
|
;
|
|
|
|
ifdef ISA_IX86
|
|
|
|
PAX equ eax
|
|
PBX equ ebx
|
|
PCX equ ecx
|
|
PDX equ edx
|
|
PSI equ esi
|
|
PDI equ edi
|
|
PBP equ ebp
|
|
PSP equ esp
|
|
PIP equ eip
|
|
|
|
PSEG equ fs
|
|
|
|
dp EQU dd
|
|
|
|
PWORD TYPEDEF DWORD
|
|
|
|
PUSHFP equ pushfd
|
|
IRETP equ iretd
|
|
|
|
elseifdef ISA_IX64
|
|
|
|
PAX equ rax
|
|
PBX equ rbx
|
|
PCX equ rcx
|
|
PDX equ rdx
|
|
PSI equ rsi
|
|
PDI equ rdi
|
|
PBP equ rbp
|
|
PSP equ rsp
|
|
PIP equ rip
|
|
|
|
PSEG equ gs
|
|
|
|
dp EQU dq
|
|
|
|
PWORD TYPEDEF QWORD
|
|
|
|
PUSHFP equ pushfq
|
|
IRETP equ iretq
|
|
|
|
endif
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; 32/64 register conversion
|
|
|
|
;; Note InStr step in the logic is to deal with possible parens which seem to
|
|
;; make their way into the REG argument sometimes. Unfortunately the logic doesn't
|
|
;; current work with non --x registers. Oh well.
|
|
|
|
REG32 MACRO REG:REQ
|
|
EXITM <@CatStr(e, @SubStr(REG,@InStr(,REG,x)+@InStr(,REG,X)-1,2))>
|
|
ENDM
|
|
|
|
REG64 MACRO REG:REQ
|
|
EXITM <@CatStr(r, @SubStr(REG,@InStr(,REG,x)+@InStr(,REG,X)-1,2))>
|
|
ENDM
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; SYMFIX fixes mangled symbols to be the 64-bit version if we are compiling 64 bit.
|
|
; Specifically this looks for @@SI and replaces with @@SA, and replaces PAU with PEAU (up to twice.)
|
|
|
|
SYMFIX MACRO SYM:REQ
|
|
LOCAL TEMP
|
|
ifdef ISA_IX64
|
|
TEMP TEXTEQU REPLACE(SYM,<@@SI>,<@@SA>) ; __fastcall -> __cdecl
|
|
TEMP TEXTEQU REPLACE(%TEMP,<@@YI>,<@@YA>) ; __fastcall -> __cdecl
|
|
TEMP TEXTEQU REPLACE(%TEMP,<@@A>,<@@EA>) ; (ptr) -> __ptr64
|
|
TEMP TEXTEQU REPLACE(%TEMP,<PAU>,<PEAU>) ; * --> * __ptr64
|
|
TEMP TEXTEQU REPLACE(%TEMP,<PAU>,<PEAU>) ; * --> * __ptr64
|
|
TEMP TEXTEQU REPLACE(%TEMP,<PAU>,<PEAU>) ; * --> * __ptr64
|
|
TEMP TEXTEQU REPLACE(%TEMP,<PAV>,<PEAV>) ; * --> * __ptr64
|
|
TEMP TEXTEQU REPLACE(%TEMP,<PAV>,<PEAV>) ; * --> * __ptr64
|
|
EXITM TEMP
|
|
else
|
|
EXITM <SYM>
|
|
endif
|
|
ENDM
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
; SYMEXT fixes an external data symbol
|
|
|
|
SYMEXT MACRO SYM:REQ
|
|
ifdef ISA_IX64
|
|
EXITM <SYM>
|
|
else
|
|
EXITM <@CatStr(<_>,SYM)>
|
|
endif
|
|
ENDM
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;
|
|
; Bartok Types
|
|
;
|
|
|
|
uint8 TYPEDEF BYTE
|
|
uint16 TYPEDEF WORD
|
|
uint32 TYPEDEF DWORD
|
|
uint64 TYPEDEF QWORD
|
|
|
|
int8 TYPEDEF BYTE
|
|
int16 TYPEDEF WORD
|
|
int32 TYPEDEF DWORD
|
|
int64 TYPEDEF QWORD
|
|
|
|
bool TYPEDEF BYTE
|
|
bartok_char TYPEDEF WORD
|
|
|
|
intptr TYPEDEF PWORD
|
|
uintptr TYPEDEF PWORD
|
|
|
|
uintPtr STRUCT SIZEOF uintptr
|
|
value uintptr ?
|
|
uintPtr ENDS
|
|
|
|
intPtr STRUCT SIZEOF intptr
|
|
value intptr ?
|
|
intPtr ENDS
|
|
|
|
PTR_uintptr TYPEDEF PTR uintptr
|
|
|
|
|
|
|