60 lines
1.1 KiB
PHP
60 lines
1.1 KiB
PHP
|
|
||
|
include '../../examples/x86/include/80386.inc'
|
||
|
|
||
|
macro format?.ELF? variant
|
||
|
match , variant
|
||
|
format binary as 'o'
|
||
|
include '../../examples/x86/include/format/elf32.inc'
|
||
|
use32
|
||
|
else match =executable? settings, variant:
|
||
|
match brand =at? base:, settings
|
||
|
ELF.Settings.ABI = brand
|
||
|
ELF.Settings.BaseAddress = base
|
||
|
else match =at? base:, settings
|
||
|
ELF.Settings.BaseAddress = base
|
||
|
else match brand:, settings
|
||
|
ELF.Settings.ABI = brand
|
||
|
end match
|
||
|
include '../../examples/x86/include/format/elfexe.inc'
|
||
|
use32
|
||
|
else
|
||
|
err 'invalid argument'
|
||
|
end match
|
||
|
end macro
|
||
|
|
||
|
macro struct? name
|
||
|
macro ends?!
|
||
|
end namespace
|
||
|
esc end struc
|
||
|
virtual at 0
|
||
|
name name
|
||
|
sizeof.name = $
|
||
|
end virtual
|
||
|
purge ends?
|
||
|
end macro
|
||
|
esc struc name
|
||
|
label . : sizeof.name
|
||
|
namespace .
|
||
|
end macro
|
||
|
|
||
|
macro cinvoke? proc*,args&
|
||
|
local size
|
||
|
mov ebp,esp
|
||
|
if size
|
||
|
sub esp,size
|
||
|
end if
|
||
|
and esp,0FFFFFFF0h
|
||
|
match any, args
|
||
|
iterate arg, args
|
||
|
mov dword [esp+(%-1)*4],arg
|
||
|
if % = 1
|
||
|
size := %%*4
|
||
|
end if
|
||
|
end iterate
|
||
|
else
|
||
|
size := 0
|
||
|
end match
|
||
|
call [proc]
|
||
|
mov esp,ebp
|
||
|
end macro
|