2011-12-10 1 views
1

HLA에서 활성화 레코드에이 정확히 저장되는 방법은 입니다.HLA의 활성화 레코드

많은 부분에 대해 읽었지만 매개 변수가 "4 바이트보다 작은"데이터 유형 중 하나 일 때 문제가 발생합니다.

예를 들어

: 그것은 어디 언급되지 않기 때문에 모든 매개 변수 (적어도) 4 바이트 블록을 할당하는 것이,

(모든 매개 변수 VAL 참고)

Procedure proc(VAL i:int32; VAL j:int16; VAL k:int16);@nodisplay; 

, k가 EBP + 8, EBP + 10, EBP + 12에있을 것으로 기대합니다.

그러나 약간의 stdout.puts에 따르면, 사실이 아닙니다. (적어도 내 시스템에는 없습니다) k는 EBP + 8, j는 EBP + 12, i는 EBP + 16입니다.

매개 변수가 4 바이트 블록을 할당한다는 내용의 리소스가 있습니까? 내 HLA가 잘못 되었나요?

답변

2

로컬 변수 및 매개 변수는 스택에 저장되며 스택에는 32 비트 모드에서 한 번에 고정 32 비트가 할당됩니다. 매개 변수가 32 비트보다 작더라도 스택에서 여전히 32 비트를 차지합니다.

+0

예, 지역 변수가 전체 32 비트 공간을 차지하지 않는다는 점을 제외하고는 말이됩니다. 이것을 고려하십시오 : ** VAR x : int32; y : int8; z : int16; ** 이 경우 x는 EBP + 4에, y는 EBP + 5에, z는 ebp + 7에 있습니다. ESP를 EBP + 8로 지정하면 32 비트 무결성이 유지됩니다. 간단히 말해서 ** 전체 변수 섹션 **은 메모리의 4 바이트 배수를 차지합니다. 한편 매개 변수는 매개 변수 ** 당 4 바이트 **의 배수를 차지합니다. _ (미안하지만 주석으로 올바르게 서식을 지정하는 것은 어렵습니다.) _ – JaySicks

+0

해당 변수의 레이아웃을 얻지 못했으나 byteborder 지역 변수를 선언 할 수 있다면 HLA의 호기심입니다. 매개 변수에 대해 동일한 기능을 포함하지 않기로 결정한 경우 호출자가 dword 당 둘 이상이있는 경우 매개 변수를 스택에 저장하는 것이 어려울 수 있기 때문일 수 있습니다. –

+0

정렬되지 않은 지역 변수가 이상하지 않다는 것을 알았습니다. 나는 결코 사용하지 않았습니다. 결론은 여전히 ​​있습니다. –