2013-09-30 3 views
0

У меня есть простая функция, которая просто возвращает логическое значение (прямо сейчас для возврата true). Я пытаюсь написать функцию сборки, которая будет ее вызывать, и перейти на основе возвращаемого значения._stdcall function return 0xCCCCCC01

К сожалению, моя функция возвращает 0xCCCCCC01 вместо ожидаемого 0x01. Это какая-то скрытая функция stdcall?

+2

Покажите свою функцию и прочитайте ее возвращаемое значение. (Я уверен, что вы поняли, что 0x01 - это LSB значения, которое вы получаете, а CCCC ... это то, что VS устанавливает неинициализированную память до тех пор, как я знаю, поэтому я уверен, что вы только читаете ее неверно.) – us2012

+0

Иногда самый простой способ сделать это - обмануть: написать функцию в C и либо компилировать сборку сборки, либо разобрать результат. –

+0

Я на самом деле просто посмотрел на код, сгенерированный для функции. Оказывается, булевы хранятся в AL, а не EAX. Это объясняет, почему нижние биты установлены правильно. –

ответ

5

В _stdcall, значение возвращается в EAX.

Однако, если вы возвращаете логическое значение из функции, а ваше логическое значение - только один байт [*], вы не можете использовать CMP EAX,... для сравнения возвращаемого значения!

К счастью, вы можете обратиться наименьшей из EAX через AL (это не отдельный регистр, а часть EAX):

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx 
----------------EAX---------------- 
        --------AX------- 
        ---AH--- ---AL--- 

[*] это обычная условность, как это минимальная сумма, необходимая для правильного обращения к булевым элементам с помощью указателей байтов. Если вы придумали свой собственный язык, вы можете потребовать, чтобы логический размер соответствовал размерному регистру машин.

1

На каком языке написана функция? Может быть, boolean - один байт на этом языке. В диалекте Apple Objective C, в частности, BOOL - typedef, поданный как char.

Если это так, ваше возвращаемое значение AL, а не EAX.

Вы должны пометить вопрос с помощью платформы/компилятора/языка OS /.