2013-09-30 4 views
0

저는 부울을 반환하는 간단한 함수를 사용합니다 (지금은 true를 반환하도록 설정 됨). 나는 그것을 호출하고 반환 값에 따라 점프 할 어셈블리 함수를 작성하려고합니다._stdcall 함수가 0xCCCCCC01을 반환합니다.

슬프게도 내 함수가 예상 0x01 대신 0xCCCCCC01을 반환합니다. 이것은 stdcall의 일부 숨겨진 기능입니까?

+2

함수를 표시하고 반환 값을 읽는 방법을 보여줍니다. (나는 0x01이 당신이 얻고있는 값의 LSB임을 깨닫고 CCCC는 내가 아는 한 초기화되지 않은 메모리를 설정하는 것이므로, 당신은 단지 그것을 읽고있는 것이 확실하다. 잘못된 것입니다.) – us2012

+0

때로는 가장 쉬운 방법은 속임수를 쓰는 것입니다. C로 함수를 작성하고 컴파일러에서 어셈블리 출력을 생성하거나 결과를 디스 어셈블합니다. –

+0

실제로 함수에 대해 생성 된 코드를 살펴 보았습니다. 불량은 EAX가 아닌 AL에 저장됩니다. 이것이 하위 비트가 올바르게 설정된 이유를 설명합니다. –

답변

5

_stdcall에서 반환 값은 EAX으로 전달됩니다.

그러나 함수에서 부울을 반환하고 부울 값이 1 바이트 [*] 인 경우 CMP EAX,...을 사용하여 반환 값을 비교할 수 없습니다!

다행히 AL을 통해 EAX의 가장 낮은 해결할 수 있습니다 (이 별도의 레지스터 아니지만, EAX의 일부) :

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

그대로 [*]이 일반적인 관례이다 바이트 포인터를 통해 부울을 올바르게 처리 할 수 ​​있어야합니다. 그러나 자신의 언어를 생각해 내면 부울 크기가 기계 레지스터 크기와 일치해야한다는 것을 자유롭게 요구할 수 있습니다.

1

작성한 기능은 어떤 언어입니까? 아마도 부울은 해당 언어로 1 바이트 길이입니다. 애플의 목표 C의 방언에서, 특히, BOOL은 으로 먹이는 typedef이다.

반환 값은 EAX가 아니라 AL입니다.

플랫폼/컴파일러/OS/언어로 질문에 실제로 태그해야합니다.

관련 문제