현재 "Linux의 어셈블리 언어 안내"로 x86 어셈블리를 배우고 있으며 241 페이지에 16 비트 워드 또는 32 비트 워드 만 스택에 저장되지만 이게 사실인가요? C에서 char 배열은 단일 바이트로 구성되며 C는 호출 스택을 사용하는 함수로 구성되므로 스택에 저장됩니다. 그래서 나는 무엇이 잘못 되었는가?x86의 스택을 호출하여 한 바이트를 저장합니다.
답변
짝수 바이트는 0으로 채워지고 푸시되기 전에 16 비트 또는 32 비트 워드로 변환됩니다.
스택을 특정 크기의 플레이트 더미 (16 또는 32)로 간주합니다. 크기 판을 반쯤 밀어 낼 수있는 방법이 있나요? 아니요? 크기의 절반을 밀기를 원한다고해도, 그것을 채워 전체 크기의 판을 만들고 밀어 넣습니다.
다른 게시물에서 누군가 또는 작가가 그것을 삭제했다는 것을 코멘트하고 싶습니다. 다른 질문은 무엇이든간에 : 기본적으로 C는 char 배열의 첫 번째 요소를 초기화하는 것과 같습니다. movb $ 65, (% esp) for 색인 0? 그리고 그 전에는 sub sizeofarray, % esp와 같은 것을 할 것입니다. – rob
@rob : 이제 더 이상 잘못되지 않았으므로 삭제를 취소했습니다 :-) 기본적으로 그렇습니다. 그러나 구현이 정확히 무엇인지보기 위해 분해를보십시오. 배열의 시작이 정확히'esp'에 있는지 여부는 당신이 가지고있는 다른 자동 변수에 달려 있습니다. –
지침은 push
에 해당되지만 스택을 사용하는 유일한 방법은 아닙니다. 또한 x86에는 현재 스택 위치에 대한 포인터를 저장하는 esp 레지스터가 있습니다.
함수 인수는 스택에 있습니다. 일부 디스 어셈블리를 확인하면 컴파일러에서 어떻게 가져 오는 지 확인할 수 있습니다. x86에 대한 일반적인 호출 규칙에서 char
인수는 각각 4 바이트를 차지합니다. 배열을 값으로 전달할 수 없으므로 가능한 경우 char 배열을 저장하는 방법이 문제되지 않습니다.
자동 변수도 스택을 차지하지만 배열 요소는 "push"를 사용하여 스택에 개별적으로 저장되지 않습니다. 일반적으로 함수는 시작할 때 모든 자동 변수에 대한 공간을 만듭니다. "esp"와 관련된 "하위"명령어를 찾습니다. 그런 다음 배열의 시작은 자동 변수와 마찬가지로 esp의 알려진 오프셋에 있으며 컴파일러는이 오프셋을 사용하여 배열에 대한 액세스를 생성합니다. 요소 사이에 패딩을 할 필요가 없습니다. 스택 포인터가 올바르게 정렬되게하려면 배열 끝 부분에 약간의 공간이있을 수 있습니다.
- 1. 함수는 실시간으로 호출되면 잘못된 값을 저장합니다. 수동으로 호출하여 올바른 값을 저장합니다. 무슨 일이야?
- 2. 인터넷에서 다운로드 한 데이터를 저장합니다.
- 3. 어셈블리 x86의 JMP에서 돌아 왔습니까?
- 4. 왜 TADOBlobField.Savetofile에만 8 바이트를 쓰는가
- 5. C에서 한 줄에 바이트를 빼는 방법 #
- 6. 방법 : x86의 pow (real, real)
- 7. x86의 최저 수준 세부 사항
- 8. Silverlight - 이미 다운로드 한 이미지를 디스크에 저장합니다.
- 9. Jquery 기록, 히스토리 스택을 검사하십시오.
- 10. C# 기밀 정보를 저장합니다.
- 11. 바이트를 통해 스트림 복사 []
- 12. PInvoke를 스택을
- 13. 바이트를 읽음
- 14. x86의 "non temporal"메모리 액세스의 의미는 무엇입니까?
- 15. 루아 상태 스택을 정리하는 방법은 무엇입니까?
- 16. 기술 스택을 문서화하기위한 템플릿
- 17. 다른 함수를 호출하여 설정 한 함수의 정적 변수
- 18. ArrayList.toString()을 다시 한 번 호출하여 ArrayList로 변환합니다.
- 19. 내가 기반으로 웹 서비스 스택을 개발 한 테스트 용이성
- 20. 공급 업체가 제공 한 SOA 스택을 사용하는 조직은 얼마나됩니까?
- 21. 바이트를 MB로 계산
- 22. 소켓 : 마지막 바이트를 수신 한 후에도 클라이언트가 대기 중임
- 23. 나는 한 번에 2 바이트를 읽고 어떻게해야, C#을
- 24. FTPClient 다운로드가 모든 바이트를 수신 한 경우 시크함
- 25. XamlParseException이 XamlReader.Load를 호출하여 throw됩니다.
- 26. 파일 내용을 메모리에 저장합니다.
- 27. 실행 스택을 표시하는 ghci
- 28. 스택을 뒤집는 방법은 무엇입니까?
- 29. MySQL에서 트리거로 레코드를 삭제 한 사용자의 USER_ID를 저장합니다.
- 30. 그림을 업로드 한 다음 PHP를 사용하여 MySQL 데이터베이스에 위치를 저장합니다.
[왜 펜티엄 IA-32의 스택에 바이트를 밀어 넣을 수 없습니까?] (http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to) -push-a-byte-on-a-stack-on-pentium-ia-32) 컴파일 된 컴파일 결과를 분해하고, 그 문제를 논의합시다. –