이 코드를 제대로 작동시키지 못했습니다.코드의이 시점에서 % 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이 아닌 값을 반환하는 것으로 추측되지만 그 이유는 알 수 없습니다.
x86 어셈블리의 'test'는 피연산자에 대해 비트 AND를 수행하고 CPU 플래그를 설정하며 AND 결과를 무시합니다. 따라서이 경우 코드는 esp의 특정 비트가 설정되어 있는지 확인합니다. 그 이유를 설명하는 코드가 필요합니다. – EOF
@EOF 다른 코드와 어떤 관련이 있는지 모르겠지만 모두 게시 해 드리겠습니다. 나는 다음 명령의 주소와 비교해야한다고 생각한다. 영감 된 것 같은 스택 포인터는 그의 대답에서 지적했다. 나는 조립에 상당히 새롭다 – chilemagic