2014-01-12 3 views
0

이 코드를 제대로 작동시키지 못했습니다.코드의이 시점에서 % esp 값은 어떻게되어야합니까?

test $0x10000000, %esp 
jz  .ERROR 
ret 

코드가 .ERROR으로 이동하면 코드가 종료됩니다. 그렇지 않으면 출력이 정상적으로 인쇄됩니다.

test $0x0000000, %esp을 사용하면 예상대로 종료됩니다.

Sections: 
Idx Name   Size  VMA  LMA  File off Algn 
    0 .interp  00000013 08048114 08048114 00000114 2**0 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    1 .note.ABI-tag 00000020 08048128 08048128 00000128 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    2 .hash   00000038 08048148 08048148 00000148 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    3 .dynsym  00000090 08048180 08048180 00000180 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    4 .dynstr  00000064 08048210 08048210 00000210 2**0 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    5 .gnu.version 00000012 08048274 08048274 00000274 2**1 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    6 .gnu.version_r 00000020 08048288 08048288 00000288 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    7 .rel.dyn  00000010 080482a8 080482a8 000002a8 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    8 .rel.plt  00000030 080482b8 080482b8 000002b8 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
    9 .init   00000024 080482e8 080482e8 000002e8 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
10 .plt   00000070 08048310 08048310 00000310 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
11 .text   00000188 08048380 08048380 00000380 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
12 .springboard 00000023 08048508 08048508 00000508 2**0 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
13 .fini   00000015 0804852c 0804852c 0000052c 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
14 .rodata  00000024 08048544 08048544 00000544 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
15 .eh_frame  000000e0 08048568 08048568 00000568 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, DATA 
16 .dynamic  000000c8 08049648 08049648 00000648 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
17 .got   00000004 08049710 08049710 00000710 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
18 .got.plt  00000024 08049714 08049714 00000714 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
19 .data   00000004 08049738 08049738 00000738 2**2 
        CONTENTS, ALLOC, LOAD, DATA 
20 .bss   00000004 0804973c 0804973c 0000073c 2**2 
        ALLOC 
21 .comment  0000002a 00000000 00000000 0000073c 2**0 
        CONTENTS, READONLY 

어쩌면 내가 아직 이해하지 않지만, % esp는 해당 범위의 주소와 동일해야합니다

이 내 부분은 무엇입니까?

링커 스크립트와 링크 할 경우 .springboard 섹션을 0x10000000으로 이동할 수 있습니다. 반환은 스프링 보드 섹션으로 이동합니다. 그래서 내 생각은 그것이 여기서 작동해서는 안된다는 것이 었습니다. 그러나 제가 스크립트와 스프링 보드 섹션을 연결하면 움직일 것입니다. 두 경우 모두 왜 작동합니까?

테스트 결과가 0이 아닌 값을 반환하는 것으로 추측되지만 그 이유는 알 수 없습니다.

+0

x86 어셈블리의 'test'는 피연산자에 대해 비트 AND를 수행하고 CPU 플래그를 설정하며 AND 결과를 무시합니다. 따라서이 경우 코드는 esp의 특정 비트가 설정되어 있는지 확인합니다. 그 이유를 설명하는 코드가 필요합니다. – EOF

+0

@EOF 다른 코드와 어떤 관련이 있는지 모르겠지만 모두 게시 해 드리겠습니다. 나는 다음 명령의 주소와 비교해야한다고 생각한다. 영감 된 것 같은 스택 포인터는 그의 대답에서 지적했다. 나는 조립에 상당히 새롭다 – chilemagic

답변

1

아니요, esp는 스택 포인터이므로 스택 내부의 일부 주소를 가리켜 야합니다. 귀하의 프로그램은 스택 섹션을 제공하지 않는 것 같습니다, 그래서 나는 OS가 스택을 할당한다고 생각합니다.

함수에서 돌아 오려는 경우 함수 호출 이후에 실행될 다음 명령어의 주소 여야하므로 dword ptr [esp] (esp 제외)에는 실제로 위 섹션의 주소가 있어야합니다.

+0

고마워! 나는'test $ 0x80000000, dword ptr [esp]'를 시도했지만 표현식 뒤에 'Error : junk'ptr [esp] '라고 표시했습니다. 오류 : 명령 니모닉 접미어가없고 레지스터 피연산자가 없습니다. 나는 잘못하고있는 어떤 생각을 알 수 없다. 내가 생각하는 다음 명령어의 주소와 비교하고 싶다 – chilemagic

+0

@Matt :'dword ptr [esp]'는 intel-syntax이고, test $ 0x10000000, % esp는 AT & T-syntax와 비슷하다. 그들은 섞이지 않는다. – EOF

+1

죄송합니다, 저는 인텔의 어셈블러 구문을 사용했습니다. 조금 다릅니다. 대신'test $ 0x80000000, % (esp)'와 같은 것을 써야합니다 (확실하지는 않습니다. 아마도'(% esp)'일까요? 다른 지시 사항을 더 잘 보시면됩니다). 그리고 아마도 반송 주소를 분석하는 것을 피해야합니다. 일반적으로 잘 설계된 프로그램에는 그러한 트릭이 필요하지 않습니다. – Inspired

관련 문제