2011-07-26 3 views
2

현재 "Linux의 어셈블리 언어 안내"로 x86 어셈블리를 배우고 있으며 241 페이지에 16 비트 워드 또는 32 비트 워드 만 스택에 저장되지만 이게 사실인가요? C에서 char 배열은 단일 바이트로 구성되며 C는 호출 스택을 사용하는 함수로 구성되므로 스택에 저장됩니다. 그래서 나는 무엇이 잘못 되었는가?x86의 스택을 호출하여 한 바이트를 저장합니다.

+1

[왜 펜티엄 IA-32의 스택에 바이트를 밀어 넣을 수 없습니까?] (http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to) -push-a-byte-on-a-stack-on-pentium-ia-32) 컴파일 된 컴파일 결과를 분해하고, 그 문제를 논의합시다. –

답변

5

짝수 바이트는 0으로 채워지고 푸시되기 전에 16 비트 또는 32 비트 워드로 변환됩니다.

스택을 특정 크기의 플레이트 더미 (16 또는 32)로 간주합니다. 크기 판을 반쯤 밀어 낼 수있는 방법이 있나요? 아니요? 크기의 절반을 밀기를 원한다고해도, 그것을 채워 전체 크기의 판을 만들고 밀어 넣습니다.

+0

다른 게시물에서 누군가 또는 작가가 그것을 삭제했다는 것을 코멘트하고 싶습니다. 다른 질문은 무엇이든간에 : 기본적으로 C는 char 배열의 첫 번째 요소를 초기화하는 것과 같습니다. movb $ 65, (% esp) for 색인 0? 그리고 그 전에는 sub sizeofarray, % esp와 같은 것을 할 것입니다. – rob

+0

@rob : 이제 더 이상 잘못되지 않았으므로 삭제를 취소했습니다 :-) 기본적으로 그렇습니다. 그러나 구현이 정확히 무엇인지보기 위해 분해를보십시오. 배열의 시작이 정확히'esp'에 있는지 여부는 당신이 가지고있는 다른 자동 변수에 달려 있습니다. –

2

지침은 push에 해당되지만 스택을 사용하는 유일한 방법은 아닙니다. 또한 x86에는 현재 스택 위치에 대한 포인터를 저장하는 esp 레지스터가 있습니다.

함수 인수는 스택에 있습니다. 일부 디스 어셈블리를 확인하면 컴파일러에서 어떻게 가져 오는 지 확인할 수 있습니다. x86에 대한 일반적인 호출 규칙에서 char 인수는 각각 4 바이트를 차지합니다. 배열을 값으로 전달할 수 없으므로 가능한 경우 char 배열을 저장하는 방법이 문제되지 않습니다.

자동 변수도 스택을 차지하지만 배열 요소는 "push"를 사용하여 스택에 개별적으로 저장되지 않습니다. 일반적으로 함수는 시작할 때 모든 자동 변수에 대한 공간을 만듭니다. "esp"와 관련된 "하위"명령어를 찾습니다. 그런 다음 배열의 시작은 자동 변수와 마찬가지로 esp의 알려진 오프셋에 있으며 컴파일러는이 오프셋을 사용하여 배열에 대한 액세스를 생성합니다. 요소 사이에 패딩을 할 필요가 없습니다. 스택 포인터가 올바르게 정렬되게하려면 배열 끝 부분에 약간의 공간이있을 수 있습니다.

관련 문제