Фундаментальные основы хакерства


Идентификация аргументов функций - часть 34


/p>

 

Таблица 5 Порядок предпочтений Microsoft Visual C++ 4.x – 6.x при передаче аргументов по соглашению fastcall

 

::WATCOM C. Компилятор от WATCOM сильно отличается от компиляторов от Borland и Microsoft. В частности, он не поддерживает ключевого слова fastcall (что, кстати, приводит к серьезным проблемам совместимости), но по умолчанию всегда стремиться передавать аргументы через регистры. Вместо общепринятой "стопки предпочтений" WATCOM жестко закрепляет за каждым аргументом свой регистр: за первым - EAX, за вторым - EDX, за третьим -EBX, за четвертым – ECX, причем, если какой-то аргумент в указанный регистр поместить не удается, он и все остальные аргументы, находящиеся правее него, помещаются в стек! В частности, типы float и double по умолчанию помещаются в стек основного процессора, что "портит всю малину"!

 

тип

аргумент

char

AL

DL

BL

CL

int

EAX

EDX

EBX

ECX

long int

EAX

EDX

EBX

ECX

ближний указатель

ECX

EDX

EBX

ECX

дальний указатель

stack

stack

stack

stack

float

stack CPU

stack CPU

stack CPU

stack CPU

stack FPU

stack FPU

stack FPU

stack FPU

double

stack CPU

stack CPU

stack CPU

stack CPU

stack FPU

stack FPU

stack FPU

stack FPU

Таблица 6 Схема передачи аргументов компилятором WATCOM по умолчанию

 

При желании программист может "вручную" задать собственный порядок передачи аргументом, прибегнув к прагме aux, имеющий следующий формат: "#pragma aux имя функции parm [перечь регистров]". Список допустимых регистров для каждого типа аргументов приведен в следующей таблице:

 

тип

допустимые регистры

char

EAX

EBX

ECX

EDX

ESI

EDI

int

EAX

EBX

ECX

EDX

ESI

EDI

long int

EAX

EBX

ECX

EDX

ESI

EDI

ближний указатель

EAX

EBX

ECX

EDX

ESI

EDI

дальний указатель

DX:EAX

CX:EBX

CX:EAX

CX:ESI

DX:EBX

DI:EAX

CX:EDI

DX:ESI

DI:EBX

SI:EAX

CX:EDX

DX:EDI

DI:ESI

SI:EBX

BX:EAX

FS:ECX

FS:EDX

FS:EDI

FS:ESI

FS:EBX

FS:EAX

GS:ECX

GS:EDX

GS:EDI

GS:ESI

GS:EBX

GS:EAX

DS:ECX

DS:EDX

DS:EDI

DS:ESI

DS:EBX

DS:EAX

ES:ECX

ES:EDX

ES:EDI

ES:ESI

ES:EBX

ES:EAX

float

8087

???

???

???

???

???

double

8087

EDX:EAX

ECX:EBX

ECX:EAX

ECX:ESI

EDX:EBX

EDI:EAX

ECX:EDI

EDX:ESI

EDI:EBX

ESI:EAX

ECX:EDX

EDX:EDI

EDI:ESI

ESI:EBX

EBX:EAX

<


- Начало -  - Назад -  - Вперед -