在这段代码中,%esp的值应该是多少?

时间:2014-01-12 22:48:28

标签: c assembly gnu

我一直无法使用此代码。

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。返回到跳板部分。所以我的想法是它不应该在这里工作,但是如果我将它与我的脚本链接并且跳板部分被移动,那么它将起作用。为什么两种情况都有效?

我猜测测试返回非零值,但我不明白为什么。

1 个答案:

答案 0 :(得分:1)

不,esp是一个堆栈指针,所以应该指向堆栈内的一些地址。你的程序似乎没有提供任何堆栈部分,所以我猜操作系统会分配堆栈。

好吧,如果你要从一个函数返回,dword ptr [esp](但不是esp)确实应该包含上面部分的地址,因为这应该是下一个要执行的指令的地址。功能调用。