2010-04-06 4 views
11

나는 인텔 펜티엄의 스택에 직접 바이트를 밀어 넣을 수 없다는 것을 알게되었다.펜티엄 IA-32의 스택에 바이트를 밀어 넣을 수없는 이유는 무엇입니까?

내가받은 이유는 esp 레지스터가 단어 주소 지정이 가능하기 때문입니다. (즉, 우리 모델에서는 가정입니다.) "짝수 주소"여야합니다. 몇 가지 32 비트 이진수의 값을 줄이면 레지스터 정렬이 엉망이되지 않을 것이라고 추측했지만 분명히 충분히 이해하지 못합니다.

일부 NASM 테스트를 시도해 본 결과, 변수 (바이트 DB 123)를 선언하고 스택으로 밀어 넣으면 esp가 4 씩 감소합니다 (32 비트를 밀어 넣었 음을 나타냅니다)?

test.asm : 10 : 오류 : 지원되지 않는 비 32 비트 ELF 재배치

어떤 단어 그러나 "푸시 바이트 물린"(변수 이름의 내 선택에 대한 유감은) 일종의 오류가 발생합니다 이 지친 시간 동안 지혜가 크게 감사 될 것입니다. 나는 첫 해에 학부생으로서이 모든 것에 나의 순결을 불쌍히 여깁니다.

답변

4

그것 :

The address-size attribute of the stack segment determines the stack pointer size (16, 32 or 64 bits). The operand-size attribute of the current code segment determines the amount the stack pointer is decremented (2, 4 or 8 bytes).

In non-64-bit modes: if the address-size and operand-size attributes are 32, the 32-bit ESP register (stack pointer) is decremented by 4. If both attributes are 16, the 16-bit SP register (stack pointer) is decremented by 2.

출처 : http://www.intel.com/Assets/PDF/manual/253667.pdf

페이지. 4-320 Vol. 2B

그냥 또한 흥미로운 읽기 설명서의 스택에 관한 부분이 있음을 지적하고 싶었 편집, 그것은 더 스택 세그먼트를 만들 설명합니다. 이 말이 않지만

http://www.intel.com/Assets/PDF/manual/253665.pdf

장 6.2

+0

유감 스럽지만 유감스럽게도 내가 현재의 지식으로 파악할 수있는 것보다 훨씬 위에 있습니다. –

+0

@Tim - 이해할 수 있습니다. 아마도 빠른 읽기 가치가있을 것입니다. –

+0

잠깐, 잠깐. 각 메모리 위치는 32 비트 폭이므로 값을 누르면 4 * 8은 32 비트이기 때문에 스택을 4 바이트 씩 감소시키고, 2 씩 감소 시키면 정렬되지 않습니다. 우주를 읽고, 파열시키는거야? 맞습니까? 그렇다면 포인트를 얻습니다. 그 PDF는 두 번째 것입니다. –

0

스택 포인터는 (일부 최적화 이유로) 4B 정렬되어야합니다 -> 4로 나눌 수 있어야합니다 (따라서 마지막 2 비트는 0입니다).

+0

는 Yully의 대답은 아래에서 위로를 설명합니다. 어쨌든 고마워요 :) –

8

일부 경우 스택 포인터가 작업을 수행 할 수 없게됩니다. 예를 들어, 스택에 바이트를 넣은 다음 다른 함수를 호출하는 함수가 있다고 가정 해 보겠습니다. 스택에 잘못 정렬 된 반환 주소를 쓰려고하면 호출이 끝나고 오류가 발생합니다.

+0

완벽, 고마워요 :) –

0

원하는 작업은 비트 회전 연산 코드를 사용하여 각 32 비트 메모리 위치를 회전하고 시작 비트 위치로 다시 회전 할 때까지 레지스터에 한 번에 8 비트를 배치하는 것입니다. 이제 32 비트 레지스터에 4 개의 8 비트 수량이 나란히 놓여 있어야합니다. 스택에 밀어 넣으면 끝났습니다. 스택이 생성 된 방법에 따라

+0

미안하지만 그건 나에게별로 의미가 없습니다. –

관련 문제