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



         

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


main         proc near           ; CODE XREF: start+AFp

var_8        = qword      ptr -8

push   ebp

mov    ebp, esp

; Открываем кадр стека

push   40F8A3D7h

push   40D51EB8h

; Передаем функции MyFunc аргументы. Пока еще мы не можем установить их тип

call   MyFunc

fstp   [esp+8+var_8]

; Стягиваем со стека сопроцессора вещественное значение, занесенное туда

; функцией MyFunc

; Чтобы определить его тип смотрим опкод инструкции, – DD

1C 24

; По таблице 10 определяем – он принадлежит double

; Постой, постой, как double, ведь функция должна возвращать float?!

; Так-то оно так, но здесь имеет место неявное преобразование типов

; при передаче аргумента функции printf, ожидающей double.

; Обратите внимание на то, куда стягивается возращенное функцией значение:

; [esp+8-8] == [esp], т.е. оно помещается на вершину стека, что равносильно

; его заталкиваю командами PUSH.

push   offset aF    ; "%f\n"

; Передаем функции printf указатель на строку спецификаторов "%f\n"

call   _printf

add    esp, 0Ch

pop    ebp

retn

main         endp

MyFunc       proc near           ; CODE XREF: main+Dp

arg_0        = dword      ptr  8

arg_4        = dword      ptr  0Ch

push   ebp

mov    ebp, esp

; Открываем кадр стека

fld    [ebp+arg_0]

; Затягиваем на вершину стека сопроцессора аргумент arg_0

; Чтобы определять его тип, смотрим на опкод инструкции FLD

- D9 45 08

; Раз так, это – float

fadd   [ebp+arg_4]

; Складываем arg_0, только что затянутый на вершину стека сопроцессора, с arg_4

; помещая результат в тот же стек и…

pop    ebp

retn

; ...возвращаемся из функции, оставляя результат сложения двух float-ов

; на вершине стека сопроцессора

; Забавно, если объявить функцию как double

это даст идентичный код!

MyFunc       endp

Листинг 96

Замечание о механизме возращения значений в компиляторе WATCOM C: Компилятор WATCOM C предоставляет программисту возможность "вручную" выбирать: в каком именно регистре (регистрах) функция будет возвращать результат своей работы.


Содержание  Назад  Вперед